# Pod
Kubernetes 并没有直接的调度容器,而是封装了一个叫做 Pod
的概念。
如上图所示,Pod 是一组紧密关联的容器集合,Pod中有一个 pause
容器,和一堆业务容器,他们有各自的 PID
、MOUNT
和 USER
,它们共享 IPC、Network 和 UTS namespace,是 Kubernetes 调度的基本单位。
Pod 内的多个容器共享网络和文件系统,可以通过 进程间通信
和 文件共享
这种简单高效的方式组合完成服务。
Pod 在英文中是豌豆荚的意思。一个 Pod 中可以运行一个或多个容器。它们共享 Pod 的文件系统,以及网络。每个 Pod 有独立的 IP。Pod 中的容器共享这个 IP 和端口空间。并且可以通过 localhost 相互访问。
绝大部分情况下,一个 Pod 里面只运行一个应用容器。
Kubernetes 并没有直接的调度容器,而是增加了这个 Pod 的封装。一方面,是考虑了需要辅助容器的场景。比方说,有些需要 sidecar 的场景。另外一方面,是考虑可以替换使用不同的容器技术,比如 Docker 容器。
名称 | 说明 |
---|---|
UTS | 主机名 |
IPC | 进程间通信 |
PID | "chroot"进程树 |
MOUNT | 挂载点 |
NETWORK | 网络访问,包括接口 |
USER | 将本地的虚拟user-id映射到真实的user-id |
# Pod 模版
apiVersion: v1
kind: Pod
metadata:
name: first-pod
spec:
containers:
- name: first-pod
image: busybox
# Init Container
每个 Pod 中可以包含多个容器, 应用运行在这些容器里面,同时 Pod 也可以有一个或多个先于应用容器启动的 Init 容器。
Init 容器与普通的容器非常像,除了如下两点:
- 它们总是运行到完成。
- 每个都必须在下一个启动之前成功完成。
如果 Pod 的 Init 容器失败,Kubernetes 会不断地重启该 Pod,直到 Init 容器成功为止。 然而,如果 Pod 对应的 restartPolicy
值为 Never,Kubernetes 不会重新启动 Pod。
为 Pod 设置 Init 容器需要在 Pod 的 spec
中添加 initContainers
字段, 该字段以 Container 类型对象数组的形式组织,和应用的 containers 数组同级相邻。 Init 容器的状态在 status.initContainerStatuses
字段中以容器状态数组的格式返回。
apiVersion: v1
kind: Pod
metadata:
name: initContainers
labels:
app: myapp
spec:
containers:
- name: myapp-container
image: busybox:1.28
command: ['sh', '-c', 'echo The app is running! && sleep 3600']
initContainers:
- name: init-myservice
image: busybox:1.28
command: ['sh', '-c', "until nslookup myservice.$(cat /var/run/secrets/kubernetes.io/serviceaccount/namespace).svc.cluster.local; do echo waiting for myservice; sleep 2; done"]
- name: init-mydb
image: busybox:1.28
command: ['sh', '-c', "until nslookup mydb.$(cat /var/run/secrets/kubernetes.io/serviceaccount/namespace).svc.cluster.local; do echo waiting for mydb; sleep 2; done"]