前言
上一节发布了一个容器到 K8S 中,但其实实际操作的是 Pod ,那么为什么是 Pod,而不是容器。
更新历史
- 20200531 - 初稿 - 左程立
- 原文地址 - https://blog.zuolinux.com/2020/05/22/about-pod.html
Pod 的本质
Pod 包装了一个或多个容器。
Pod 是 K8S 的最小执行单元。
Pod 是 K8S 中的一个进程。
Pod 可包装 Docker,也支持包装其他类型容器。
Pod 包含封装的容器、存储资源、网络资源、以及指导容器如何运行的配置。
可以把容器理解为一个无挂钩的光秃秃的集装箱,K8S 这艘大船无法直接挂载它,通过给集装箱(容器)加装挂钩(IP地址)等形成一个 Pod,方便 K8S 来操作。
也可以把 Pod 理解为传统的虚拟机,而容器是传统虚拟机中运行的程序,只不过虚拟机是一个实体,而 Pod 是一个逻辑概念。
K8S 通过编排 Pod 来调度容器,而不是直接操作容器,K8S 无法直接操纵容器。
Pod 中的共享资源
Pod 为其中运行的多容器提供共享的网络、存储资源、命名空间。
网络
Pod 具有唯一 IP 地址,Pod 中的多个容器共享一个 IP 地址和网络端口等网络资源
Pod 中多容器可使用 localhost 通信
Pod 中容器和外部通信时候,多容器需要协调网络端口
Pod 中的容器获取的系统主机名与为 Pod 配置的 name 相同
存储
Pod 可指定一组存储卷
Pod 中多容器均可以访问该存储卷,以便互相共享数据
Pod 中的共享卷可以持久保存,防止容器重启丢失数据
Pod 的特点
如果使用 kind: Pod 的 yaml 文件来创建 Pod,当前节点服务器出现问题后,Pod 不能被自动调度到其他可用服务器。
一般使用 kind: Deployment 的 yaml 来创建 Pod。
Deployment 是一种控制器,可以用来创建、管理 Pod。如创建多副本 Pod,滚动更新 Pod。
当 Pod 所在节点出现问题,Deployment 控制器可以在集群中其他节点启动新 Pod。
Pod 模板
apiVersion: v1
kind: Pod
metadata:
name: myapp-pod
labels:
app: myapp
spec:
containers:
- name: myapp-container
image: busybox
command: ['sh', '-c', 'echo Hello Kubernetes! && sleep 3600']
镜像拉取策略
不具体指定的情况下,imagePullPolicy 是 Always,即 kubelet 会尝试从指定的仓库拉取每个镜像。
如果容器属性 imagePullPolicy 设置为 IfNotPresent , 则会优先使用本地镜像。
如果容器属性 imagePullPolicy 设置为 IfNotPresent Never, 则会一定使用本地镜像。
apiVersion: v1
kind: Pod
metadata:
name: private-image-test-1
spec:
containers:
- name: uses-private-image
im