Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Kubernetes(三) 如何从外部访问服务

Kubernetes(三) 如何从外部访问服务

作者头像
草堂笺
发布于 2019-12-20 09:49:23
发布于 2019-12-20 09:49:23
3K00
代码可运行
举报
文章被收录于专栏:代码如诗代码如诗
运行总次数:0
代码可运行

.example_responsive_1 { width: 200px; height: 50px; } @media(min-width: 290px) { .example_responsive_1 { width: 270px; height: 50px; } } @media(min-width: 370px) { .example_responsive_1 { width: 339px; height: 50px; } } @media(min-width: 500px) { .example_responsive_1 { width: 468px; height: 50px; } } @media(min-width: 720px) { .example_responsive_1 { width: 655px; height: 50px; } } @media(min-width: 800px) { .example_responsive_1 { width: 728px; height: 50px; } } (adsbygoogle = window.adsbygoogle || []).push({});

Kubernetes(三) 如何从外部访问服务

目录

Kubernetes教程之对外暴露服务 文章地址: https://cloud.tencent.com/developer/article/1557587

前言

通过前文的讲解,《跟着官方文档从零搭建K8S》《应用部署》相信读者已经对Kubernetes安装及部署应用有了一定的了解. 接下来, 本文将针对如何将服务暴露给外部进行讲解.

阅读这篇文章你能收获到:

  • 了解Kubernetes暴露服务的几种方案及其优缺点.

阅读本文你需要:

  • 了解基本的Kubernetes命令.
  • 有一个Kubernetes环境

将服务暴露给外部客户端的几种方式

  • 通过port-forward转发, 这种方式在之前的文章中有提到过, 操作方便、适合调试时使用, 不适用于生产环境.
  • 通过NodePort, 此时集群中每一个节点(Node)都会监听指定端口, 我们通过任意节点的端口即可访问到指定服务. 但过多的服务会开启大量端口难以维护.
  • 通过LoadBalance来暴露服务. LoadBalance(负载均衡 LB)通常由云服务商提供, 如果云环境中不提供LB服务, 我们通常直接使用Ingress, 或使用MetalLB来自行配置LB.
  • 通过Ingress公开多个服务. Ingress公开了从群集外部到群集内 services 的HTTP和HTTPS路由. 流量路由由Ingress资源上定义的规则控制. 在云服务商不提供LB服务的情况下, 我们可以直接使用Ingress来暴露服务. (另外, 使用LB + Ingress的部署方案可以避免过多LB应用带来的花费).

准备

在开始之前, 笔者已经创建好了测试应用, 代码过长此处略去, 详见附录1附录2

我们通过kubectl get pods查看pod列表.

指的一提的是, 我们可以通过--namespace参数查看指定命名空间的pod列表, 也可以通过--all-namespaces来查看全部命名空间的pod列表. 由于没有指定命名空间,所以应用被放到default中了.

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[root@nas-centos1 k8s-test]# kubectl get pods --namespace default
NAME                        READY   STATUS    RESTARTS   AGE
k8s-test-578b77cd47-sw5pd   1/1     Running   0          6m29s
k8s-test-578b77cd47-v6kmp   1/1     Running   0          6m29s

port-forward

port-forward这种方式访问pod, 可以指定pod实例, 简单方便, 很适合调试之用.

通过kubectl port-forward来配置转发:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[root@nas-centos1 k8s-test]# kubectl port-forward --address 0.0.0.0 k8s-test-578b77cd47-sw5pd 9999:8080
Forwarding from 0.0.0.0:9999 -> 8080

此时, 我们可以通过通过访问宿主机9999端口来访问到k8s-test-578b77cd47-sw5pd8080端口.

/k8s-test/timestamp是该示例应用唯一一个api, 用于获取当前时间戳

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[root@nas-centos1 k8s-test]# curl http://10.33.30.95:9999/k8s-test/timestamp
1571151584224

版权声明

代码语言:txt
AI代码解释
复制
 本文发布于[朴瑞卿的博客](https://blog.piaoruiqing.com/), 允许非商业用途转载, 但转载必须保留原作者[朴瑞卿](https://blog.piaoruiqing.com/) 及链接:[https://blog.piaoruiqing.com](https://blog.piaoruiqing.com/).
代码语言:txt
AI代码解释
复制
 如有授权方面的协商或合作, 请联系邮箱: [piaoruiqing@gmail.com](https://blog.piaoruiqing.com/mailto:piaoruiqing@gmail.com). 

NodePort

集群中每一个节点(Node)都会监听指定端口, 我们通过任意节点的端口即可访问到指定服务. 但过多的服务会开启大量端口难以维护. 参考文档: https://kubernetes.io/docs/concepts/services-networking/service/#nodeport

创建一个Service, 并指定其类型为NodePort.

k8s-test-service.yaml

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
apiVersion: v1
kind: Service
metadata:
  name: k8s-test-service
spec:
  selector:
    app: k8s-test
    env: test
  ports:
    - port: 80              # 服务端口, 内部可访问
      targetPort: 8080      # 目标端口, 此处指的是pod的8080端口
      nodePort: 30080       # 节点端口, 外部可访问
      protocol: TCP
  type: NodePort

执行kubectl apply -f k8s-test-service.yaml发布这个Service.

通过kubectl get services可查看Service列表如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[root@nas-centos1 k8s-test]# kubectl get services
NAME               TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)        AGE
k8s-test-service   NodePort    10.244.234.143   <none>        80:30080/TCP   8s
kubernetes         ClusterIP   10.244.0.1       <none>        443/TCP        32d

我们可以看到, 30080端口已经被绑定到该服务的80端口.

尝试通过node节点来访问应用:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[root@nas-centos3 ~]# curl http://10.33.30.94:30080/k8s-test/timestamp
1571152525336

LoadBalance

参考文档:

  1. https://metallb.universe.tf/
  2. https://kubernetes.io/docs/concepts/services-networking/service/#loadbalancer

LoadBalance(负载均衡 LB)通常由云服务商提供. 如果环境不支持LB, 那么创建的LoadBalance将始终处于<pending>状态:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[root@nas-centos1 k8s-test]# kubectl get services
NAME               TYPE           CLUSTER-IP      EXTERNAL-IP   PORT(S)        AGE
k8s-test-service   LoadBalancer   10.244.29.126   <pending>     80:32681/TCP   13s
kubernetes         ClusterIP      10.244.0.1      <none>        443/TCP        33d

如果想要在本地开发环境测试LB, 我们可以选择MetalLB. 它是一个负载均衡实现. 安装方式此处不进行展开, 可参考官方文档

当我们的环境支持LB时, 我们可以创建如下Service, 来暴露服务:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
apiVersion: v1
kind: Service
metadata:
  name: k8s-test-service
spec:
  selector:
    app: k8s-test
    env: test
  ports:
    - port: 80          # 服务端口
      targetPort: 8080  # 目标端口, 此处指的是pod的8080端口
      protocol: TCP
  type: LoadBalancer

执行kubectl apply -f k8s-test-lb.yaml 命令发布配置. 此时可以查看到Service已经有了EXTERNAL-IP(10.33.30.2). 如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[root@nas-centos1 k8s-test]# kubectl get services
NAME               TYPE           CLUSTER-IP       EXTERNAL-IP   PORT(S)        AGE
k8s-test-service   LoadBalancer   10.244.151.128   10.33.30.2    80:31277/TCP   2s
kubernetes         ClusterIP      10.244.0.1       <none>        443/TCP        33d

尝试通过LB的IP来访问应用, 如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[root@nas-centos1 k8s-test]# curl http://10.33.30.2/k8s-test/timestamp
1571235898264

Ingress

Ingress公开了从群集外部到群集内 services 的HTTP和HTTPS路由. 流量路由由Ingress资源上定义的规则控制. 参考文档: https://kubernetes.github.io/ingress-nginx/deploy/

我们使用ingress controller的nginx实现来进行测试. 首先下载部署文件:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
wget https://raw.githubusercontent.com/kubernetes/ingress-nginx/master/deploy/static/mandatory.yaml

编辑文件vim mandatory.yaml, 加入以下内容:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
template:
  spec:
    hostNetwork: true
  • hostNetwork: 开启hostNetwork, 可以使ingress绑定到主机的80和443端口.
  • 访问ingress有多种方式, (1). 通过hostNetwork直接绑定到80和443端口, (2). 通过NodePort在Node上暴露端口(但这种方式只能绑定固定范围的端口, 默认值 30000-32767), (3). 通过LoadBalance, 这种方式和NodePort其实都是通过Service来暴露, 只不过是Service的不同类型.
  • mandatory.yaml中template只有一个, 很好找. (tips: 在vim中可以用/进行查找).
  • Ingress Controller: 是一个反向代理程序, 它负责解析 Ingress 的反向代理规则.
  • Ingress: Ingress 是反向代理规则. 不要混淆Ingress ControllerIngress的概念.

发布完成后, 我们创建一个Ingress来测试, 内容如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  name: test-ingress
  annotations:
    nginx.ingress.kubernetes.io/rewrite-target: /k8s-test
spec:
  rules:
    - http:
        paths:
          - path: /k8s-test
            backend:
              serviceName: k8s-test-service
              servicePort: 80

尝试访问:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[root@nas-centos1 ingress]# curl http://10.33.30.94/k8s-test/timestamp
1571321623058

小结

通常地, 我们会考虑 LoadBalanceIngress配合使用. 一方面是只是用LB会产生大量的花费, 另一方面大量的LB同样会提高维护成本. 而LB配合Ingress使用, 通过不同的path来区分服务能达到很棒的效果. (这里和通过Nginx来暴露多个服务的原理基本相同)

参考文献

附录

1 Deployment.yaml

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
apiVersion: apps/v1
kind: Deployment
metadata:
  name: k8s-test
  labels:
    app: k8s-test
spec:
  replicas: 2
  template:
    metadata:
      name: k8s-test
      labels:
        app: k8s-test
        env: test
    spec:
      containers:
        - name: k8s-test
          image: registry.cn-hangzhou.aliyuncs.com/piaoruiqing/k8s-test:0.0.1
          imagePullPolicy: IfNotPresent
          ports:
            - name: http-port
              containerPort: 8080
      imagePullSecrets:
        - name: docker-registry-secret
      restartPolicy: Always
  selector:
    matchLabels:
      app: k8s-test

2 K8sTestApplication.java

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
/**
 * @author piaoruiqing
 * @description: k8s test
 * @date: 2019/09/22 10:01
 * @since JDK 1.8
 */
@RestController
@RequestMapping(value = "/k8s-test")
@SpringBootApplication
public class K8sTestApplication {
    /**
     * get timestamp
     * @return
     */
    @GetMapping(value = "/timestamp")
    public ResponseEntity<?> getTimestamp() {
        return ResponseEntity.ok(System.currentTimeMillis() + "\n");
    }

    public static void main(String[] args) {
        SpringApplication.run(K8sTestApplication.class, args);
    }
}

推荐阅读:

© 2019, 朴瑞卿.

版权声明

代码语言:txt
AI代码解释
复制
 本文发布于[朴瑞卿的博客](https://blog.piaoruiqing.com/), 允许非商业用途转载, 但转载必须保留原作者[朴瑞卿](https://blog.piaoruiqing.com/) 及链接:[https://blog.piaoruiqing.com](https://blog.piaoruiqing.com/).      如有授权方面的协商或合作, 请联系邮箱: [piaoruiqing@gmail.com](https://blog.piaoruiqing.com/mailto:piaoruiqing@gmail.com).
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Kubernetes(五) - Service
Kubernetes解决的另外一个痛点就是服务发现,服务发现机制和容器开放访问都是通过Service来实现的,把Deployment和Service关联起来只需要Label标签相同就可以关联起来形成负载均衡,基于kuberneres的DNS服务我们只需要访问Service的名字就能以负载的方式访问到各个容器
喵了个咪233
2022/03/24
2670
Kubernetes(二) 应用部署
.example_responsive_1 { width: 200px; height: 50px; } @media(min-width: 290px) { .example_responsive_1 { width: 270px; height: 50px; } } @media(min-width: 370px) { .example_responsive_1 { width: 339px; height: 50px; } } @media(min-width: 500px) { .example_responsive_1 { width: 468px; height: 50px; } } @media(min-width: 720px) { .example_responsive_1 { width: 655px; height: 50px; } } @media(min-width: 800px) { .example_responsive_1 { width: 728px; height: 50px; } } (adsbygoogle = window.adsbygoogle || []).push({});
草堂笺
2019/12/20
1K0
Kubernetes(二) 应用部署
kubernetes之ingress的基本使用
由于最近服务迁移,进行了各种调整,调整的过程中也顺便修改了 ingress 的相关配置,发现这块之前没有写过,于是今天就来看看 ingress 的基本使用。
LinkinStar
2022/09/01
7630
kubernetes之ingress的基本使用
用Kubernetes部署Springboot或Nginx,也就一个文件的事
1 前言 经过《Maven一键部署Springboot到Docker仓库,为自动化做准备》,Springboot的Docker镜像已经准备好,也能在Docker上成功运行了,是时候放上Kubernetes跑一跑了。这非常简单,一个yaml文件即可。 2 一键部署Springboot 2.1 准备yaml文件 当准备好镜像文件后,要部署到Kubernetes就非常容易了,只需要一个yaml格式的文件即可,这个文件能描述你所需要的组件,如Deployment、Service、Ingress等。定义如下: apiVersion: apps/v1 kind: Deployment metadata: name: pkslow-springboot-deployment spec: selector: matchLabels: app: springboot replicas: 2 template: metadata: labels: app: springboot spec: containers: - name: springboot image: pkslow/springboot-mongo:0.0.6 ports: - containerPort: 8080
崔笑颜
2020/07/09
7720
用Kubernetes部署Springboot或Nginx,也就一个文件的事
【K8S专栏】Kubernetes应用访问管理
在Kubernetes中,提供了Service和Ingress两种对象来实现应用间访问或外部对集群应用访问,这两种对象在实际的工作中会时长使用,非常重要的对象。
没有故事的陈师傅
2022/12/06
1.6K0
【K8S专栏】Kubernetes应用访问管理
service 2 暴露服务的 3种 方式
之前我们简单的了解一下 k8s 中 service 的玩法,今天我们来分享一下 service 涉及到的相关细节,我们开始吧
阿兵云原生
2023/09/01
2680
service 2 暴露服务的 3种 方式
Kubernetes集群中使用ingress发布服务
当我们将kubernetes的应用部署完之后,就需要对外发布服务的访问地址。kubernetes 将服务发布到外部访问的方式主要有: LoadBlancer Service NodePort Service Ingress
星哥玩云
2022/07/13
5880
Kubernetes集群中使用ingress发布服务
Kubernetes Ingress入门指南和实践练习
Ingress也是Kubernetes项目里的一种 API 对象,它公开了从集群外部到集群内Service的 HTTP 和 HTTPS 路由,这些路由由 Ingress 资源上定义的规则控制。
KevinYan
2020/10/10
1.1K0
Kubernetes Ingress入门指南和实践练习
深入玩转K8S之外网如何访问业务应用(nginx-ingress篇)
前面的文章介绍了如何安装kubernetes集群,集群部署完毕之后就可以在上面部署服务了。服务部署完之后如何访问集群中的服务呢?  访问部署在kubernetes中的服务有两种情况,一种是在kubernetes集群内部访问,另一种是在集群外部访问服务。
DevinGeng
2019/04/09
2.1K0
「走进k8s」Kubernetes1.15.1的外部服务发现 ingress(35)
3.现在可以供大家使用的 Ingress controller 有很多,比如 traefik、nginx-controller、Kubernetes Ingress Controller for Kong、HAProxy Ingress controller,当然你也可以自己实现一个 Ingress Controller,现在普遍用得较多的是 traefik 和 nginx-controller,traefik 的性能较 nginx-controller 差,但是配置使用要简单许多, traefik 为例给大家介绍 ingress 的使用。
IT架构圈
2019/09/12
1.6K0
「走进k8s」Kubernetes1.15.1的外部服务发现 ingress(35)
再战 k8s(15):Ingress和Ingress Controller
从前面的学习,我们可以了解到Kubernetes暴露服务的方式目前只有三种:LoadBlancer Service、ExternalName、NodePort Service、Ingress;而我们需要将集群内服务提供外界访问就会产生以下几个问题:
看、未来
2022/05/06
1.7K0
再战 k8s(15):Ingress和Ingress Controller
## Kubernetes集群中流量暴露的几种方案 Kubernetes集群中流量暴露的几种方案
在业务使用Kubernetes进行编排管理时,针对业务的南北流量的接入,在Kuberentes中通常有几种方案,本文就接入的方案进行简单介绍。
KaliArch
2022/06/24
1.2K0
Kubernetes Ingress
Ingress**也是Kubernetes项目里的一种 API 对象,它公开了从集群外部到集群内Service的 HTTP 和 HTTPS 路由,这些路由由 Ingress 资源上定义的规则控制。
jwangkun
2021/12/23
5770
Kubernetes Ingress
Kubernetes基础:Service
我们通过Pod、Deployment等可以将应用发布到Kubernetes平台中,但是如果我们如何才能访问我们部署的应用呢?有一个办法就是通过节点的IP加上节点的端口来访问这个节点上的容器应用,但是如果我们有多个跨节点的相通应用时该怎么办呢?特别是应用发生扩容、缩容时应该如何处理,这时我们就需要利用Service来实现。
大江小浪
2018/11/09
1.3K0
Kubernetes微服务常见概念及应用
两类角色:master节点和worker节点。master用于调度和管理集群资源,worker节点是资源的提供者。worker节点提供的资源单位叫pod,可以理解为k8s云平台提供的虚拟机,pod中存放的是应用容器,比如docker容器。容器是cpu和内存的资源隔离单位,大部分情况下一个pod中只住一个应用容器,也有一个主容器多个辅助容器的情况,一个pod内的容器共享网络栈和存储资源。
才浅Coding攻略
2022/12/12
1.3K0
Kubernetes微服务常见概念及应用
08 . Kubernetes之 ingress及Ingress Controller
Ingress规则是很灵活的,可以根据不同域名,不同path转发请求到不同的service,并且支持https/http.
iginkgo18
2020/09/27
3.1K0
08 . Kubernetes之 ingress及Ingress Controller
Kubernetes(一) 跟着官方文档从零搭建K8S
.example_responsive_1 { width: 200px; height: 50px; } @media(min-width: 290px) { .example_responsive_1 { width: 270px; height: 50px; } } @media(min-width: 370px) { .example_responsive_1 { width: 339px; height: 50px; } } @media(min-width: 500px) { .example_responsive_1 { width: 468px; height: 50px; } } @media(min-width: 720px) { .example_responsive_1 { width: 655px; height: 50px; } } @media(min-width: 800px) { .example_responsive_1 { width: 728px; height: 50px; } } (adsbygoogle = window.adsbygoogle || []).push({});
草堂笺
2019/12/20
2.1K0
Kubernetes(一) 跟着官方文档从零搭建K8S
Kubernetes vs Openshift, 谁的网络更安全?
前言 本文仅代表作者魏新宇的个人观点;在书写过程中,笔者与同事郭跃军进行了技术讨论,大有裨益,在此表示感谢! 一、K8S vs OCP, 网络端口访问方式 我在上一篇文章《深度理解:Openshif
魏新宇
2018/04/18
2.7K0
Kubernetes vs Openshift, 谁的网络更安全?
kubernetes系列教程(十八)TKE中实现ingress服务暴露
上一篇文章中介绍了基于Nginx实现Ingress Controller的实现,介绍了Nginx Ingress Controller安装、相关功能,TLS,高级特性等介绍,本章开始介绍基于腾讯云TKE实现ingress服务暴露。
HappyLau谈云计算
2020/01/03
3.8K0
kubernetes系列教程(十八)TKE中实现ingress服务暴露
k8s 实践经验(七)ingress 详解
采用 NodePort 方式暴露服务面临问题是,服务一旦多起来,NodePort 在每个节点上开启的端口会及其庞大,而且难以维护;这时,我们可以能否使用一个Nginx直接对内进行转发呢?众所周知的是,Pod与Pod之间是可以互相通信的,而Pod是可以共享宿主机的网络名称空间的,也就是说当在共享网络名称空间时,Pod上所监听的就是Node上的端口。那么这又该如何实现呢?简单的实现就是使用 DaemonSet 在每个 Node 上监听 80,然后写好规则,因为 Nginx 外面绑定了宿主机 80 端口(就像 NodePort),本身又在集群内,那么向后直接转发到相应 Service IP 就行了,如下图所示:
看、未来
2022/05/09
2.3K0
k8s 实践经验(七)ingress 详解
推荐阅读
相关推荐
Kubernetes(五) - Service
更多 >
领券
💥开发者 MCP广场重磅上线!
精选全网热门MCP server,让你的AI更好用 🚀
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验