凡是调度、网络、存储,以及安全相关的属性,基本上是 Pod 级别的。

Pod 重要字段的含义和用法。

  • NodeSelector:是一个供用户将 Pod 与 Node 进行绑定的字段:

    1. apiVersion: v1
    2. kind: Pod
    3. ···
    4. spec:
    5. nodeSelector:
    6. disktype: ssd

    这和配置意味着这个 Pod 只能运行在携带了 disktype:ssd 标签(Label)的节点上;否则,它将调度失败。

  • NodeName:一旦 Pod 的这个字段被赋值,Kubernetes 项目就会认为这个 Pod 已经经过了调度,调度的结果就是赋值的节点名字。所以,这个字段一般由调度器负责设置,但用户也可以设置它来“骗过”调度器,当然这个做法一般是在测试或者调试的时候才会用到。

  • HostAliases:定义了 Pod 的 hosts 文件(比如 /etc/hosts)里的内容:

    apiVersion: v1
    kind: Pod
    ...
    spec:
    hostAliases:
    - ip: "10.1.2.3"
      hostnames:
      - "foo.remote"
      - "bar.remote"
    ...
    

    这个 Pod 启动后,/etc/hosts 文件的内容如下:

    cat /etc/hosts
    # Kubernetes-managed hosts file.
    127.0.0.1 localhost
    ...
    10.244.135.10 hostaliases-pod
    10.1.2.3 foo.remote
    10.1.2.3 bar.remote
    

    其中,最下面两行记录,就是通过 HostAliases 字段为 Pod 设置的。需要指出的是,在 Kubernetes 项目中,如果要设置 hosts 文件里的内容,一定要通过这种方法。否则,如果直接修改了 hosts 文件的话,在 Pod 被删除重建之后,kubelet 会自动覆盖掉被修改的内容。

凡是跟容器的 Linux Namespace 相关的属性,也一定是 Pod 级别的。

例如:Pod 的 YAML 文件中,定义了 shareProcessNamespace=true

apiVersion: v1
kind: Pod
metadata:
  name: nginx
spec:
  shareProcessNamespace: true
  containers:
  - name: nginx
    image: nginx
  - name: shell
    image: busybox
    stdin: true
    tty: true

于是,这个 Pod 被创建后,你就可以使用 shell 容器的 tty 跟这个容器进行交互了。

$ kubectl create -f nginx.yaml

接下来,使用 kubectl attach 命令,连接到 shell 容器的 tty 上

$ kubectl attach -it nginx -c shell

这样,我就可以在 shell 容器里执行 ps 指令,查看所有正在运行的进程

$ kubectl attach -it nginx -c shell
/ # ps ax
PID   USER     TIME  COMMAND
    1 root      0:00 /pause
    8 root      0:00 nginx: master process nginx -g daemon off;
   14 101       0:00 nginx: worker process
   15 root      0:00 sh
   21 root      0:00 ps ax

在这个容器里,不仅可以看到它本身的 ps ax 指令,还可以看到 nginx 容器的进程,以及 Infra 容器的 /pause 进程。这就意味着,整个 Pod 里的每个容器的进程,对于所有容器来说都是可见的:它们共享了同一个 PID Namespace。

凡是 Pod 中的容器要共享宿主机的 Namespace,也一定是 Pod 级别的定义

apiVersion: v1
kind: Pod
metadata:
  name: nginx
spec:
  hostNetwork: true
  hostIPC: true
  hostPID: true
  containers:
  - name: nginx
    image: nginx
  - name: shell
    image: busybox
    stdin: true
    tty: true

在这个 Pod 中,定义了共享宿主机的 Network、IPC 和 PID Namespace。这就意味着,这个 Pod 里的所有容器,会直接使用宿主机的网络、直接与宿主机进行 IPC 通信、看到宿主机里正在运行的所有进程。