# Pod

Kubernetes 并没有直接的调度容器,而是封装了一个叫做 Pod 的概念。

Pod

Pod2

如上图所示,Pod 是一组紧密关联的容器集合,Pod中有一个 pause 容器,和一堆业务容器,他们有各自的 PIDMOUNTUSER,它们共享 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"]
更新时间: 9/21/2020, 12:00:45 AM