说说k8s网络

1、k8s组件 k8s的组件分为两大部分:控制平面组件和节点组件。 控制平面组件包括: kube-apiserver:API server,可以水平扩展。 etcd:后端存储。 kube-scheduler:决策新创建的Pod在哪个Node上运行。 kube-controller-manager:controller进程,观测Object的状态,current state -> desired state。 节点组件包括: kubelet:运行Pod。 kube-proxy:网络代理, k8s中Service的部分实现,负责维护节点上的网络规则。 Container runtime:Docker、containerd、CRI-O。 2、k8s网络需要解决的问题 k8s对任何CNI实现有如下规定: Pod与Pod之间的通信无须使用NAT 节点与Pod之间的通信无须使用NAT Pod与其他Pod看到自身的IP相同 k8s中的Service负责对内、对外暴露网络访问,想让应用能够在集群内外正常访问,需要解决下面的几个问题: 容器与容器的通信 Pod与Pod的通信 Pod与Service的通信 Internet与Service的通信 3、容器与容器的通信 在Linux中,使用Namespace机制实现内核级别资源的隔离,目前提供六种Namespace: Mount: 隔离文件系统挂载点 UTS: 隔离主机名和域名信息 IPC: 隔离进程间通信 PID: 隔离进程的ID Network: 隔离网络资源 User: 隔离用户和用户组的ID 网络命名空间netns存在一个root network namespace,默认情况下,Linux将每个进程的netns设置为root,以提供网络访问。 对于Docker,Pod使用同一个网络命名空间,Pod之间通过Namespace隔离,Pod内的容器共享网络命名空间,Docker负责创建网络命名空间,应用容器使用-network加入该网络命名空间,容器之间通过localhost通信。 4、Pod与Pod的通信 k8s中,每个Pod拥有一个真实的IP,Pod之间通过IP通信。 (本节图片来源:Kevin Sookocheff Blog) 5、Pod与Service的通信 Pod随着时间,可能消失、重启,那么直接使用Pod IP进行访问,在动态变化的环境中会存在网络问题。k8s中使用Service解决这个问题。(本节图片来源:Kevin Sookocheff Blog) 创建一个新的Service Object,实际上是创建了一个虚拟IP和一系列网络规则。 kube-proxy负责维护、更新、删除、添加网络规则,其支持的代理模式有: userspace iptables(默认) ipvs kernelspace (windows) ...

2021-06-06 · Jerry Wang