文章目录
- Pod 概念
- Pod的使用
- 使用Deployment创建Pod
- Pod的网络通讯
- Pod内部容器之间
- Pod-to-Pod
- 数据包的传递Pod-to-Pod同节点
- 数据包的传递Pod-to-Pod跨节点
- Pod-to-Service
- Internet-to-Service
Pod 概念
Pod 是可以在 Kubernetes 中创建和管理的、最小的可部署的计算单元。Pod 是一组一个或多个 容器 这些容器共享存储/network。 In terms of Docker concepts, a Pod is similar to a group of Docker containers with shared namespaces and shared filesystem volumes.
Pod的使用
- 运行单容器的Pod最常见的用法
- 运行多个容器的Pod。耦合性高与需要共享资源的一组容器组。是一种高级场景的用法比较少用
使用Deployment创建Pod
Deployment为Pod提供了一个声明式定义方法
- 滚动升级与回滚版本
- 扩容与缩容增加或者减少Pod的数量
# 1.手动扩容或缩容# 2.利用HPA(Horizontal Pod Autoscaling)根据Deployment使用的资源如CPU与内存改变Pod的数量
- 暂停和继续Deployment
Pod的网络通讯
每一个 Pod 被分配一个独立的 IP 地址。Pod 中的所有容器共享一个网络名称空间
Pod内部容器之间
- 同一个 Pod 中的所有容器 IP 地址都相同
- 同一个 Pod 中的不同容器不能使用相同的端口否则会导致端口冲突
- 同一个 Pod 中的不同容器可以通过 localhost:port 进行通信
- 同一个 Pod 中的不同容器可以通过使用常规的进程间通信手段例如 SystemV semaphores 或者 POSIX 共享内存
Pod中存在一个Pause的容器Pod中的其他容器都使用container模式与Pause容器共享Network Namespace与其共享IP、端口范围等。相当于同一个Pod内部的容器都是通过lo口进行通讯
# Master Node:[rootcentos1 yaml]# kubectl describe pods| grep ContainerContainers:Container ID: docker://2a9b19251c146b9797548d5a2804af11dca8cb7e63724528913c6b7500cb05f7ContainersReady True Normal Pulled 38m kubelet, centos2 Container image "nginx:1.8" already present on machine[rootcentos1 yaml]# # Worker Node[rootcentos2 ~]# docker ps | grep nginx2a9b19251c14 0d493297b409 "nginx -g daemon of…" 40 minutes ago Up 39 minutes k8s_nginx_nginx-deployment-7cd7fc4dbf-bfwtw_default_e0fe2e2d-59f2-4035-8a05-66185fcf9022_0fe3304b303f1 registry.aliyuncs.com/k8sxio/pause:3.2 "/pause" 40 minutes ago Up 40 minutes k8s_POD_nginx-deployment-7cd7fc4dbf-bfwtw_default_e0fe2e2d-59f2-4035-8a05-66185fcf9022_0[rootcentos2 ~]# [rootcentos2 ~]# docker inspect fe3304b303f1| grep Network"NetworkMode": "none","NetworkSettings": {"Networks": {"NetworkID": "1ae8fa9fc1d71f66975c3a47581965244c07bda1162ccad59c14896b626253e5",[rootcentos2 ~]# [rootcentos2 ~]# docker inspect 2a9b19251c14| grep Network"NetworkMode": "container:fe3304b303f1dcf7af23faae0a876207cf90682fd7651218e0ea50799ff6a507","NetworkSettings": {"Networks": {}[rootcentos2 ~]#
Pod-to-Pod
从 Pod 的视角来看Pod 是在其自身所在的 network namespace 与同节点上另外一个 network namespace 进程通信。在Linux上不同的 network namespace 可以通过 Virtual Ethernet Device 或 veth pair (两块跨多个名称空间的虚拟网卡)进行通信。为连接 pod 的 network namespace可以将 veth pair 的一段指定到 root network namespace另一端指定到 Pod 的 network namespace。每一组 veth pair 类似于一条网线连接两端并可以使流量通过。节点上有多少个 Pod就会设置多少组 veth pair。下图展示了 veth pair 连接 Pod 到 root namespace 的情况
此时我们的 Pod 都有了自己的 network namespace从 Pod 的角度来看他们都有自己的以太网卡以及 IP 地址并且都连接到了节点的 root network namespace。为了让 Pod 可以互相通过 root network namespace 通信我们将使用 network bridge网桥。
Linux Ethernet bridge 是一个虚拟的 Layer 2 网络设备可用来连接两个或多个网段network segment。网桥的工作原理是在源于目标之间维护一个转发表forwarding table通过检查通过网桥的数据包的目标地址destination和该转发表来决定是否将数据包转发到与网桥相连的另一个网段。桥接代码通过网络中具备唯一性的网卡MAC地址来判断是否桥接或丢弃数据。
网桥实现了 ARP 协议以发现链路层与 IP 地址绑定的 MAC 地址。当网桥收到数据帧时网桥将该数据帧广播到所有连接的设备上除了发送者以外对该数据帧做出相应的设备被记录到一个查找表中lookup table。后续网桥再收到发向同一个 IP 地址的流量时将使用查找表lookup table来找到对应的 MAC 地址并转发数据包。
数据包的传递Pod-to-Pod同节点
在 network namespace 将每一个 Pod 隔离到各自的网络堆栈的情况下虚拟以太网设备virtual Ethernet device将每一个 namespace 连接到 root namespace网桥将 namespace 又连接到一起此时Pod 可以向同一节点上的另一个 Pod 发送网络报文了。下图演示了同节点上网络报文从一个Pod传递到另一个Pod的情况。
1.Pod1 发送一个数据包到其自己的默认以太网设备 eth0。2.对 Pod1 来说eth0 通过虚拟以太网设备veth0连接到 root namespace3.网桥 cbr0 中为 veth0 配置了一个网段。一旦数据包到达网桥网桥使用ARP 协议解析出其正确的目标网段 veth14.网桥 cbr0 将数据包发送到 veth15.数据包到达 veth1 时被直接转发到 Pod2 的 network namespace 中的 eth0 网络设备。
数据包的传递Pod-to-Pod跨节点
待续。。。
Pod-to-Service
待续。。。
Internet-to-Service
待续。。。