Pod是Kubernetes应用程序的基本执行单元 —— 创建或部署的Kubernetes对象模型中最小、最简单的单元。Pod表示在集群上运行的进程。
Pod封装了应用程序的容器(在某些情况下是多个容器)、存储资源、惟一的网络IP和控制容器如何运行的选项。Pod表示一个部署单元: Kubernetes中的应用程序的单个实例,它可能由单个容器或少量紧密耦合且共享资源的容器组成。
Docker是Kubernetes Pod中最常用的容器运行时,但是Pod也支持其他容器运行时。
Kubernetes集群中的Pod主要有两种使用方式:
- 单个容器
- 多个容器
单个容器
是Kubernetes最常见的用例,一个容器一个pod。在这种情况下,你可以将Pod看作单个容器的包装器,Kubernetes直接管理Pod而不是容器。
启动pod,可以直接使用命令,也可使用yaml文件。
示例
使用kubectl命令启动指定镜像nginx的pod,pod名称是nginx4
:
kubectl run --generator=run-pod/v1 nginx4 --image=nginx
示例
pod yaml模板:
pod-demo.yaml
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']
然后创建pod:
kubectl create -f ./pod-demo.yaml
多个容器
Pod可以封装多个容器组成的应用程序,这些容器是紧密耦合的,需要共享资源。这些位于同一位置的容器可能形成服务的单个内聚单元 — 一个容器将文件从共享卷提供给外部,而另一个“sidecar”容器将刷新或更新这些文件。Pod将这些容器和存储资源打包成一个可管理的实体。
示例
多个容器pod yaml模板文件:
apiVersion: v1
kind: Pod
metadata:
name: two-containers
spec:
restartPolicy: Never
volumes:
- name: shared-data
emptyDir: {}
containers:
- name: nginx-container
image: nginx
volumeMounts:
- name: shared-data
mountPath: /usr/share/nginx/html
- name: debian-container
image: debian
volumeMounts:
- name: shared-data
mountPath: /pod-data
command: ["/bin/sh"]
args: ["-c", "echo Hello from the debian container > /pod-data/index.html"]
在配置文件中,可以看到Pod有一个名为shared-data的卷。
配置文件中列出的第一个容器运行nginx服务器。共享卷的挂载路径是/usr/share/nginx/html
。第二个容器基于debian映像,共享卷的挂载路径是/pod-data
。
每个Pod都意味着运行指定应用程序的单个实例。如果你想水平扩展你的应用程序(例如,运行多个实例),你应该使用多个pod,每个实例一个。在Kubernetes中,这通常被称为复制。复制的pod通常通过一个称为控制器的抽象创建,并作为一个组进行管理。