云原生架构与 GitOps 实战
王炜
前腾讯云 CODING 架构师
6217 人已学习
新⼈⾸单¥59
登录后,你可以任选4讲全文学习
课程目录
已完结/共 44 讲
云原生架构与 GitOps 实战
15
15
1.0x
00:00/00:00
登录|注册

10 | K8s 极简实战(五):如何将集群的业务服务暴露外网访问?

你好,我是王炜。
上一节课,我们学习了 Env、ConfigMap 和 Secret 三种管理应用配置的方法,了解了它们的适用场景。
当我们将应用顺利迁移到 Kubernetes 之后,接下来我们面临的第一个问题是,用户如何访问集群内部的业务服务呢?因为无论是 Pod 还是 Service,它的 IP 地址都是集群内的虚拟 IP 地址,也叫做 VIP,它实际上是一个内网 IP 地址,只能提供集群内的访问能力,并不能在公网环境下进行访问。
这节课,我们先来温习一下传统应用暴露公网的方式,然后结合示例应用,进一步学习如何对外暴露 Kubernetes 集群内的应用服务。
在开始之前,你需要确保已经按照第 5 讲“示例应用介绍”的引导在本地 Kind 集群部署了示例应用。

传统应用的服务暴露

我们先来回顾一下传统的微服务应用是如何对外暴露的。
一般来说,一个典型的微服务应用在系统的最外层会使用网关或者负载均衡器作为系统的入口,然后,根据路由规则和服务发现机制将流量转发到实际的后端微服务中(一般是业务进程所在的虚拟机上)。整体架构如下图所示。
在这个典型的微服务架构中,网关是系统唯一的入口。它将通过一个外网 IP 暴露业务系统,除了网关以外,整个业务系统的所有服务都在私有网络下,彼此通过 VIP 进行通信,外部无法访问除了网关以外的任何服务。通常,由于用户访问业务系统一般是使用域名,所以在网关前面还会有 DNS 解析步骤。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

本文介绍了在Kubernetes集群中业务服务如何暴露外网访问的重要问题。首先从传统应用的服务暴露方式出发,介绍了Kubernetes中的NodePort和Loadbalancer两种Service类型,以及Ingress对象的作用。NodePort类型通过在每个节点上监听指定端口实现对外暴露,但在生产环境中并不推荐使用。Loadbalancer类型依赖云厂商实现负载均衡器,具有较大的服务暴露数量和与Kubernetes节点的解耦优势,但费用较高。文章强调了Ingress对象的重要性,作为Service之上的Service,通过安装Ingress-Controller实现路由策略,对外暴露所有业务服务。在生产环境中,Ingress-Nginx通常以Loadbalancer类型对外暴露,充当网关角色,通过路由策略实现对外暴露。这些内容为读者提供了在Kubernetes集群中实现业务服务对外暴露的多种方式和相应的优缺点,有助于读者快速了解Kubernetes集群中业务服务暴露的技术特点。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《云原生架构与 GitOps 实战》
新⼈⾸单¥59
立即购买
登录 后留言

全部留言(16)

  • 最新
  • 精选
  • 李多
    这里推荐一个开源项目:MetalLB 。之前在做实验的时候,拉取的微服务yaml很多都用了LB。但是这些通常需要租用云厂商的k8s集群才能有。就找到了 MetalLB 这个项目,支持在本地集群、裸金属集群上面部署LB。在开发测试或者实验环境也能使用 LoadBalancer 类型的服务暴露了。我在用下来感觉配置也是比较简单,好上手。 https://github.com/metallb/metallb https://metallb.universe.tf/

    作者回复: 非常不错的项目~

    2023-01-08归属地:广东
    4
    9
  • GAC·DU
    老师,域名只能绑在一个IP上,只使用ingress做为流量入口会造成单点故障。如果在ingress前面再加一个LB,域名绑在LB上,利用LB将流量分发到ingress上,这样可以吗?

    作者回复: 可以这么做。 不过在生产环境下,一般 ingress-nginx HA 我们会这么做: 1. 在几台高配节点上部署独占的实例,并配置相同的资源配额和限制,这样可以避免业务系统枪战资源以及 ingress-nginx 被驱逐。 2. 为 ingress-nginx 配置 HPA 策略 这样就可以得到高可用网关。

    2022-12-30归属地:广东
    3
    8
  • 小路飞😁
    我这边的云平台,采用traefik

    作者回复: 也是非常不错的技术选型,Traefik 也非常成熟了。

    2023-01-30归属地:新疆
    2
  • 农民园丁
    在腾讯云搭建了1个master节点,2个node节点的实验环境。 ➜ ingress git:(master) kubectl get svc -n ingress-nginx NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE ingress-nginx-controller LoadBalancer 10.97.238.89 <pending> 80:32446/TCP,443:31186/TCP 18m ingress-nginx-controller-admission ClusterIP 10.105.63.105 <none> 443/TCP 外网IP始终是pending? 请问老师,ingress-nginx-controller 各个云服务商都是部署这个链接的yaml文件吗: https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v1.3.1/deploy/static/provider/cloud/deploy.yaml

    作者回复: 部署的 ingress 版本看起来没问题,可以尝试 kubectl describe service ingress-nginx-controller -n ingress-nginx 查看一下事件。另外可以去腾讯云控制台打开负载均衡器,检查实例初始化的情况。

    2023-01-14归属地:内蒙古
    4
    2
  • 农民园丁
    如果是Kind创建的cluster,就是从宿主机的80端口-暴-露-的?

    作者回复: 是的,前提是需要指定 config.yaml 暴露 80 端口。

    2023-01-12归属地:内蒙古
    2
  • gxxc
    有几个问题请教: 1. nodePort的ingress-nginx-controller是监听了3万之后的端口,但外部用户只会使用默认的80/443访问,所以需要有一个网关把流量从80/443发送到对应的nodePort上。在自建集群里,除了在最前端增加HAproxy等反向代理,还有什么其他办法么? 2. 虽然大家都在说“ingress是最前端的网关”,但实际好像并不是这样,ingress好像只是ingress-nginx处理路由的配置文件,正如文中所说的“ingress只用来声明路由策略”。 从ingress-nginx看,对外的nodePort是SVC-ingress-nginx-controller暴露的。那么流量路径应该如下: 客户流量 ----> NodePort(SVC-ingress-nginx-controller)----> 路由处理(POD-ingress-nginx-controller) ----> 对应服务(SVC-frontend-service)----> 真实负载(POD-frontend-6b48fbbc48-ks9br) 如果上述流量路径正确,那么可以看出实际上仍然只有SVC和POD,只不过人们把处理路由的网关称为ingress。 这个路径里有2个节点点是需要HA的,第一是POD-ingress-nginx-controller,第二是真实负载POD。所以老师在第一个评论里回复是“为 ingress-nginx 配置 HPA 策略”,对吗?

    作者回复: 非常好的问题。 第一点,对于云厂商的集群,可以直接使用 LB 类型来暴露 Ingress-Nginx。对于自建集群,可以考虑使用 MetalLB + LB 的方式来暴露。 第二点,其实大家这么说的原因主要是因为实际生产上 Ingress-Nginx 一般都是以 LB 方式暴露的,这样的话流量的入口是直接从 LB 打到 Ingress-Nginx Pod 上,然后进行转发,所以说它是流量入口。NodePort 的暴露方式是因为实验环境没有 LB 的支持,所以用该方式代替,你画的流量链路可以这么理解。 最后关于 2 个节点需要 HA 这块我没理解,可以补充一下吗?

    2023-05-24归属地:上海
    2
    1
  • JDLYyear
    老师,文中说:Ingress 对象只用来声明路由策略,并不处理具体的流量转发。 那流量转发实际上还是service来做吗?

    作者回复: 这里我们安装的是 Ingress-Nginx,流量实际上先是由Nginx 转发到 Service 的,然后 Service 转发到业务 Pod 里的。

    2022-12-31归属地:广东
    1
  • 0ck0
    生产环境下部署 Ingress-Nginx, 公网 ip 是如何分配给 Ingress-Nginx ?

    作者回复: 在生产环境下部署的 ingress-nginx 是 LoadBalancer 类型的 Service,云厂商会自动创建负载均衡器并进行关联。

    2022-12-30归属地:广东
    1
  • 橙汁
    文章中演示的在生产环境部署ingress,感觉大家不理解别纠结 看看云厂商的比如阿里 有组件部署后会直接与slb链接,自动生成IP地址,直接配置ingress规则即可,我猜老师演示的也是在云服务器上不然不会出来公网地址。

    作者回复: 👍🏻是的,生产环境下云厂商会实现 lb 类型的 ingress,所以就会有外网 IP,本地 kind 集群是没有的。

    2022-12-30归属地:广东
    2
    1
  • fan
    传统微服务架构 nginx(有外网IP) -> gateway(内网IP) -> nacos -> 业务微服务 k8s中,不需要gateway 这个微服务了吗? 还是该怎么理解,谢谢老师

    作者回复: 如果是使用 K8s 的服务发现,就不需要内网的 gateway 了,如果服务发现有专门的服务,那就还是需要 gateway。

    2023-05-17归属地:广东
收起评论
显示
设置
留言
16
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部