Kubernetes (四)POD基础概念
一、什么是POD
Pod,是一个逻辑概念,是Kubernetes 项目的原子调度单位。一个POD可以包含一个或多个容器
二、POD的特点
POD中的容器共享网络和共享存储
1、共享存储资源
可以为一个Pod指定多个共享的Volume 资源。
Pod 中的所有容器都可以访问共享的volume资源
2、共享网络资源
每个Pod都会被分配一个唯一的IP地址
Pod中的所有容器共享网络空间,包括IP地址和端口
Pod内部的容器可以使用 localhost互相通信
三、POD的实现原理
每个Pod都有一个中间容器,这个容器叫作 Infra 容器,Infra 容器启动后永远处于“暂停”状态
在 Pod 中, Infra 容器永远都是第一个被创建的容器,而其他用户定义的容器,则通过 Join Network Namespace 的方式,与 Infra 容器关联在一起。
Pod 的生命周期只跟 Infra 容器一致
# docker ps deda12323422 6968df931ebb "/docker-entrypoint.…" 5 weeks ago Up 5 weeks k8s_filebeat_filebeat-pv7jg_kube-system_4770d022-1755-11eb-8cc3-fa163e3878a8_0 e48bcfddf568 mirrorgooglecontainers/pause-amd64:3.0 "/pause" 5 weeks ago Up 5 weeks k8s_POD_filebeat-pv7jg_kube-system_4770d022-1755-11eb-8cc3-fa163e3878a8_0 # docker inspect --format '{{.State.Pid}}' deda12323422 6029 # docker inspect --format '{{.State.Pid}}' e48bcfddf568 5978 # ls -l /proc/6029/ns/net total 0 lrwxrwxrwx 1 root root 0 Dec 2 11:37 net -> net:[4026531956] # ls -l /proc/5978/ns/net total 0 lrwxrwxrwx 1 root root 0 Dec 2 11:37 net -> net:[4026531956]
四、为什么需要POD?
1、“超亲密关系”这样的调度问题
具有“超亲密关系”的容器指的是特征包括但不限于:
- 互相之间会发生直接的文件交换、
- 使用 localhost 或者 Socket 文件进行本地通信、
- 会发生非常频繁的远程调用、
- 需要共享某些 Linux Namespace等等
这些容器是有需求要部署在一起的,如果是按照容器一个个调度,就有可能出现由于调度的节点资源不足而重新调度的问题。
例如:A,B,C单个容器,需要的内存资源都为1G,现在节点剩余2.5G的内存,当调度完A、B节点后,剩余内存已经不能满足C的需求,而出现调度失败
通过POD,作为原子调度单位,调度的时候是统一按照 Pod 而非容器的资源需求进行计算的,从而避免这个问题。
2、容器设计模式
容器的本质是进程,当用户想在一个容器里跑多个功能并不相关的应用时,应该优先考虑它们是不是更应该被描述成一个 Pod 里的多个容器,而不是在一个容器里运行多个进程。