一、认识 Kubernetes 网络
Kubernetes 最底层的网络为节点网络,用来保证 k8s 集群的节点(master 和 worker、worker 节点之间)能够做正常的 IP 寻址和通讯。
Kubernetes 第二层网络就是 Pod 网络,构建于节点网络之上,用来保证 k8s 集群中的 pod 之间能够做正常的 IP 寻址和通讯。作为集群最基本的调度单位,一个 Pod 内部可以有一个或多个容器,容器之间直接通过 localhost 互相访问;这些容器可共享 Pod 的网络栈,容器想要访问外部资源则通过此网络栈。如下为该两层的示意图:
那么在 Pod 之间又是如何进行 IP 寻址和通讯的呢?
在 Kubernetes 集群当中,可以把每一个 Pod 看成是一个自带虚拟网卡的小型虚拟机。在节点网络的基础上,k8s 会创建一个专门为 Pod 寻址和访问服务的虚拟网络(即 Pod 网络),首先 k8s 会在每个节点之间创建虚拟网桥,并管理网桥的 IP 地址空间和分配,其次 k8s 会修改路由器的路由规则,使得不同节点上的 Pod 可以相互通信。
但是还有一个问题,那就是 Pod 在 k8s 中是不固定的,可能会挂起或者重启,且挂起重启都是不可预期的,那么这就会导致服务的 IP 也随着不停的变化,给用户的寻址造成一定的困难。在上文中我们也提到了解决此问题用到了服务 service。service 网络的实现也就是 Kubernetes 的第三层网络。
service 是由 k8s 单独创建和管理的,有独立的 IP 地址空间,它的 IP 称为 Cluster-IP。
二、外部网络如何访问 k8s 内部服务
要知道,Pod 网络和 service 网络都是 k8s 的内部网络,外部用户是无法访问的,而外部网络和 节点网络是可以互通的。那么如果能够实现节点网络和 service 网络的互通,就可以间接实现外部与 service 网络的互通了。
1. NodePort
NodePort 是一种将 Kubernetes 服务暴露在节点网络上的一种机制。其实就是 k8s 中一种特殊的 service,k8s 会在集群中的每一个节点上暴露一个相同的端口,通过端口以及 kube-proxy 转发服务让节点网络可以访问到 k8s 内部的 service。
2. Load Balancer
Node Port 将 k8s 中的服务暴露在节点网络中后,想要外部网络访问到节点网络进而访问到 k8s 中的服务还需要引入负载均衡设备,也就是 load balancer。
load balancer 具有公网 IP,可以将外部流量转换路由到节点网络中,还能够实现对节点网络的负载均衡,以实现用户通过公网 IP 访问到 k8s 内部的服务。
load balancer 也是一种特殊的 service,本地 Kubernets 部署是不支持 load balances 的;公有云如阿里云等则是支持的,可以按需销毁和创建 load balancer。
3. Ingress
如果需要暴露在节点网络中的服务有很多,仅仅使用 load balancer 的话成本是很高的。Ingress 可以等价于反向代理或者网关,它的主要作用就是反向路由,它可以将多个 k8s 内部的服务同时暴露出去但仅需一个 load balancer。Ingress 还有一些其他功能如动态路由更新、安全认证、日志监控等。
版权归原作者 敬 之 所有, 如有侵权,请联系我们删除。