凡是调度、网络、存储,以及安全相关的属性,基本上是 Pod 级别的。
Pod 重要字段的含义和用法。
NodeSelector:是一个供用户将 Pod 与 Node 进行绑定的字段:
apiVersion: v1kind: Pod···spec:nodeSelector: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 通信、看到宿主机里正在运行的所有进程。
