10 | K8s 极简实战(五):如何将集群的业务服务暴露外网访问?
传统应用的服务暴露
- 深入了解
- 翻译
- 解释
- 总结
本文介绍了在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归属地:广东49 - GAC·DU老师,域名只能绑在一个IP上,只使用ingress做为流量入口会造成单点故障。如果在ingress前面再加一个LB,域名绑在LB上,利用LB将流量分发到ingress上,这样可以吗?
作者回复: 可以这么做。 不过在生产环境下,一般 ingress-nginx HA 我们会这么做: 1. 在几台高配节点上部署独占的实例,并配置相同的资源配额和限制,这样可以避免业务系统枪战资源以及 ingress-nginx 被驱逐。 2. 为 ingress-nginx 配置 HPA 策略 这样就可以得到高可用网关。
2022-12-30归属地:广东38 - 小路飞😁我这边的云平台,采用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归属地:内蒙古42 - 农民园丁如果是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归属地:上海21 - 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归属地:广东21 - fan传统微服务架构 nginx(有外网IP) -> gateway(内网IP) -> nacos -> 业务微服务 k8s中,不需要gateway 这个微服务了吗? 还是该怎么理解,谢谢老师
作者回复: 如果是使用 K8s 的服务发现,就不需要内网的 gateway 了,如果服务发现有专门的服务,那就还是需要 gateway。
2023-05-17归属地:广东