K8s 集群内外访问服务的方式

集群内访问服务

服务发现是 K8s 中的一个重要机制,其基本功能为:在集群内通过服务名对服务进行访问,即需要完成从服务名到 ClusterIP(服务的虚拟 IP) 的解析。

K8s 主要有两种服务发现机制:环境变量和 DNS。没有 DNS 服务的时候,K8s 会采用环境变量的形式,但一旦有多个服务,环境变量会变复杂,为解决该问题,我们使用 DNS 服务。

所以集群内访问服务有以下三种方式:
集群内访问服务

集群外访问服务

集群外部即从外网访问服务,有以下五种(前两种很少使用)方式:

hostNetwork

在 Pod 中设置 hostNotwork:true 就可以让 Pod 直接使用 Node 的网络,使用 NodeIP:PodPort 访问 Pod。

但是 Pod 启动的时候可能被调度到不同的 Node 上,所有外部访问 Pod 的 IP 也是变化的,而且调度 Pod 的时候还需要考虑是否与宿主机上的端口冲突

而且,该模式下,每一个 Node 只能启动一个同 deployment 的 Pod。

hostPort

设置容器的 hostPort,hostPort 是直接将容器的端口映射为 Node 上的端口, 使用 NodeIP:NodePort 访问 Pod。

缺点是需要维护端口映射关系,不然 Pod 重新调度后就访问不到了。

NodePort

创建 NodePort 类型的 Service 时,用户可以指定范围为 30000-32767 的端口,对该端口的访问就能通过 kube-proxy 代理到 Service 后端的 Pod 中。使用 NodeIP:PodPort 访问 Pod。

这种服务暴露方式,无法让你指定自己想要的应用常用端口,不过可以在集群上再部署一个反向代理作为流量入口。
NodePort

LoadBalancer

LoadBalancer 针对于 Service,且只能在云服务平台上使用(AWS、Azure、阿里云等),使用任一节点的 IP 访问,如 LoadBalancerIP:LoadBalancerPort
LoadBalancer

Ingress

Ingress Controller 以 Docker 容器的方式部署在 K8s 的顶部,简单来说就是 K8s 所使用的负载均衡器,类型有:Nginx、Envoy、HAProxy 等。
一般使用 K8s 官方的 Ingress-Nginx Controller(注意,不是 Nginx 公司的 Nginx Ingress Controller) 作为外网访问服务的方式。
Ingress

参考资料

https://blog.csdn.net/u010275850/article/details/122644489
https://blog.csdn.net/GuXiaoyan12/article/details/104086114
https://blog.csdn.net/qq_21187515/article/details/101363521
https://www.infoq.cn/article/KNMAVdo3jXs3qPKqTZBw

posted @ 2022-09-12 21:06  ageovb  阅读(4964)  评论(0编辑  收藏  举报