广州外贸网站建设推广,中小企业有哪些公司名单,网站推送怎么做,WordPress批量建站系统1 k8s网络类型 2 Pod网络
2.1 同一pod内不同容器通信
Pod是Kubernetes中最小的可部署单元#xff0c;它是一个或多个紧密关联的容器的组合#xff0c;这些容器共享同一个网络命名空间和存储卷#xff0c;因此Pod中的所有容器都共享相同的网络命名空间和IP地址——PodIP它是一个或多个紧密关联的容器的组合这些容器共享同一个网络命名空间和存储卷因此Pod中的所有容器都共享相同的网络命名空间和IP地址——PodIP所以在同一个Pod内的容器间通信可以通过localhost直接通信。
k8s创建Pod时永远都是首先创建Infra 容器也可以被称为pause容器。这个容器为其他容器提供了一个共享的基础设施包括网络和存储功能其他业务容器共享pause容器的网络栈和Volume挂载卷。
pause 容器被创建后会初始化Network Namespace网络栈之后其他容器就可以加入到pause 容器中共享Infra容器的网络了。而对于同一个 Pod 里面的所有用户容器来说它们的进出流量认为都是通过 pause 容器完成的。
pause 容器会创建并管理虚拟以太网veth接口。在容器启动之前pause 容器会为每个容器创建一个虚拟以太网接口一个保留在宿主机上称为 vethxxx另一个保留在容器网络命名空间内并重命名为 eth0如下图所示。这两个虚拟接口的两端是连接在一起的从一端进入的数据会从另一端出来。 pause容器主要为每个业务容器提供以下功能: IPC命名空间Pod中的多个容器能够使用SystemV IPC或POSIX消息队列进行通信。网络命名空间Pod中的多个容器能够访问同一个IP和端口范围。PID命名空间Pod中的不同应用程序可以看到其他应用程序的进程ID。UTS命名空间Pod中的多个容器共享一个主机名Volumes共享存储卷Pod中的各个容器可以访问在Pod级别定义的Volum 2.2 同一节点不同pod间相互通信
同一节点不同POD之间的通信是通过将容器网络接口CNI与主机网络命名空间中的虚拟以太网veth接口相连来实现的。 每生成一个新的Pod那么在Node上都会根据插件来生成一个新的虚拟网卡如vethxxxx或者calixxxx这个网卡会对应到Pod里的eth0。
如图veth接口则被保留在主机的网络命名空间中并被连接到CNI插件如Flannel或Calico等创建的虚拟网桥如cni0或flannel0等上。一旦这些veth接口被正确地连接起来它们就可以进行通信了。当一个POD发送数据包时数据包会通过其veth接口被发送到主机网络命名空间中的veth接口然后该veth接口会将数据包发送到虚拟网桥上。虚拟网桥又会将数据包路由到目标POD的veth接口最终将数据包发送到目标POD。
如图所示的ip地址与网桥网段同一节点的不同POD的IP地址通常属于同一网段并通过CNI插件连接到同一个虚拟网桥如cni0上。虚拟网桥会管理其IP地址空间和分配确保不同POD的IP地址不会冲突。
具体的IP地址和网段取决于所使用的CNI插件和网络方案。例如Flannel插件默认使用10.244.x.0/24的网段其中x是随机分配给每个POD的。这意味着不同POD的IP地址将位于10.244.x.0/24的网段中其中x是不同的值。 CNI介绍见Kubernetes基础(十一)-CNI网络插件用法和对比_k8s网络组件对比-CSDN博客
2.3 不同节点pod相互通信
若不同节点pod想要相互通信在cni0网桥外还有一层CNI插件配置的网络隧道如上图新的虚拟网卡flannel0接收cni0网桥的数据并通过维护路由表对接收到的数据进行封包和转发vxlan隧道。 cni0网桥设备每创建一个pod都会创建一对 veth pair。其中一段是pod中的eth0另一端是cni0网桥中的端口。VTEP设备、VXLAN Tunnel End Point(虚拟隧道端点)在Flannel中 VNI的默认值是1这也是为什么宿主机的VTEP设备都叫flannel.1的原因。VTEP设备之间通过二层数据帧进行通信源VTEP设备收到原始IP包后在上面加上一个目的MAC地址封装成一个内部数据帧发送给目的VTEP设备。flannel.1vxlan网关设备用户 vxlan 报文的解包和封包。不同的 pod 数据流量都从overlay设备以隧道的形式发送到对端。flannel.1不会发送arp请求去获取目标IP的mac地址而是由Linuxkernel将一个L3 Miss事件请求发送到用户空间的flanneld程序flanneld程序收到内核的请求事件后从etcd中查找能够匹配该地址的子网flannel.1设备的mac地址即目标pod所在host中flannel.1设备的mac地址。flanneld在每个主机中运行flanneld作为agent它会为所在主机从集群的网络地址空间中获取一个小的网段subnet本主机内所有容器的IP地址都将从中分配。同时Flanneld监听K8s集群数据库为flannel.1设备提供封装数据时必要的macip等网络数据信息。VXLANVirtual eXtensible Local Area Network虚拟扩展局域网。采用L2 over L4MAC-in-UDP的报文封装模式将二层报文用三层协议进行封装实现二层网络在三层范围内进行扩展同时满足数据中心大二层虚拟迁移和多租户的需求。flannel只使用了vxlan的部分功能VNI被固定为1。内部数据桢并不能在宿主机的二层网络传输Linux内核还需要把它进一步封装成为宿主机的一个普通的数据帧承载着内部数据帧通过宿主机的eth0进行传输。容器跨网络通信解决方案如果集群的主机在同一个子网内则跳过flannel.1隧道而是直接通过路由eth0转发过去若不在一个子网内就通过隧道转发过去。
3 Service网络
3.1 ClusterIp
在Kubernetes中Pod是非持久性的资源可以按照需要创建和销毁。当使用Deployment来运行应用时可以根据需要动态地创建或销毁Pod实现水平扩缩容。
当引入Deployment并为Pod设置多个副本时那么某一个服务就会有多个pod及多个podIp此时即使知道了这些Pod的IP那访问起来也并不方便。此外Pod的IP地址是动态分配的可能发生变化所以在实际通信中直接使用Pod的IP地址进行通信会有一些问题。为了解决这个问题Kubernetes引入了Service的概念。
所以这里需要有一个统一入口其它Pod通过这个统一入口去请求该服务Nginx对应的所有Pod。这时就有了Service这个资源对象它主要作用就是用来提供统一入口也就是说只需要一个IP就能访问所有的Pod而这个入口IP就是ClusterIP也就是Service的IP。
Pod IP 地址是实际存在于某个网卡(可以是虚拟设备)上的但Cluster IP是一个完全虚拟的IP没有网络设备与其对应。
Cluster IP仅仅作用于Kubernetes Service这个对象并由Kubernetes管理和分配P地址Cluster IP无法被ping他没有一个“实体网络对象”来响应Cluster IP只能结合Service Port组成一个具体的通信端口单独的Cluster IP不具备通信的基础并且他们属于Kubernetes集群这样一个封闭的空间。虚拟 ip 是固定的这也是service可以解决pod动态ip的原因 Service是一种持久性资源它可以提供一个或多个端点Endpoint并通过标签选择器选择指向集群中的一组Pod。Service使用ClusterIP来提供内部集群的网络连接ClusterIP是固定的虚拟ip这样就可以通过Service来访问Pod而不需要直接使用Pod的动态IP地址。当创建一个Deployment并运行应用时通常会创建一个或多个Service来提供访问Pod的接口。这样即使Pod的IP地址发生变化通过Service的端点仍然可以访问到Pod以确保集群内的可靠通信并避免因Pod的动态变化而引起的问题。 K8s通过在引入一层Service抽象还能解决以下问题
服务发现Service提供统一的ClusterIP来解决服务发现问题Client只需通过ClusterIP就可以访问App的Pod集群不需要关心集群中的具体Pod数量和PodIP即使是PodIP发生变化也会被ClusterIP所屏蔽。注意这里的ClusterIP实际是个虚拟IP也称Virtual IP(VIP)。负载均衡Service抽象层具有负载均衡的能力支持以不同策略去访问App集群中的不同Pod实例以实现负载分摊和HA高可用。K8s中默认的负载均衡策略是RoundRobin也可以定制其它复杂策略。 Service在上述K8s集群中被画成一个独立组件实际是没有独立Service这样一个组件的只是一个抽象概念。 4 外部访问内部集群
参考Kubernetes基础(三)-Service外部网络访问方式_k8s网络访问外部网络-CSDN博客