1. Pod不是容器,是kubernetes中最小的编排单位
容器就成了Pod属性里普通的字段
2. Pod扮演的事传统部署环境里 "虚拟机" 的角色
2.1 凡是调度、网络、存储,以及安全相关的属性,基本上是Pod级别的
2.2 凡是跟容器的Linux Namespace相关的属性,也一定是Pod级别的
2.3 凡是Pod中的容器要共享宿主机的Namespace,也一定是Pod级别的
3. Pod中比较重要的字段
3.1 NodeSelector:是一个使Pod与Node进行绑定的字段
apiVersion: v1
kind: Pod
...
spec:
nodeSelector:
disktype: ssd
...
# 意味着这个 Pod 永远只能运行在携带了“disktype: ssd”标签(Label)的节点上
3.2 HostAliases:定义了容器中hosts文件内容
在kubernetes项目中,如果要设置hosts文件里的内容,一定要通过这种方法。否则,如果直接修改了hsots文件,在Pod被删除重建之后,kubernetes会自动覆盖掉被修改的内容
apiVersion: v1
kind: Pod
...
spec:
hostAliases:
- ip: "10.1.2.3"
hostnames:
- "foo.remote"
- "bar.remote"
...
3.3 shareProcessNamespace:pod 配置进程命名空间共享。
当启用进程命名空间共享时,容器中的进程对该 pod 中的所有其他容器都是可见的。
apiVersion: v1
kind: Pod
metadata:
name: nginx
spec:
...
shareProcessNamespace: true
containers:
- name: nginx
image: nginx
- name: shell
image: busybox
stdin: true
tty: true
...
3.4 共享宿主机的Namespace
共享宿主机的 Network、IPC 和 PID Namespace
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
...
3.5 container字段
3.5.1 imagePullPolicy: 定义了镜像拉取的策略
Always:默认策略,仅下载镜像
Never:仅使用本地镜像
IfNotPresent:优先使用本地镜像,否则下载远程镜像
3.5.2 lifecycle:在容器状态发生变化时触发一系列"钩子"
postStart:在容器启动后,立即执行一个指定动作
虽然是在Docker容器ENTRYPOINT执行之后,但它并不严格保证顺序。也就是说,在postStart启动时,ENTRYPOINT有可能还没有结束。如果postStart执行超时或者错误,kubernetes会在该Pod的Events中报出该容器启动失败的错误信息,然后Pod也会处于失败的状态
preStop:发生的时机是容器被杀死之前
需要明确的是,preStop操作的执行,是同步的。所以,它会阻塞当前的容器杀死流程,直到这个Hook定义操作完成之后,才允许容器被杀死。项目在需要优雅退出的时候,可以使用该功能
apiVersion: v1
kind: Pod
metadata:
name: lifecycle-demo
spec:
....
containers:
- name: lifecycle-demo-container
image: nginx
lifecycle:
postStart:
exec:
command: ["/bin/sh", "-c", "echo Hello from the postStart handler > /usr/share/message"]
preStop:
exec:
command: ["/usr/sbin/nginx","-s","quit"]
...
4. Pod状态
- Pending。这个状态意味着,Pod 的 YAML 文件已经提交给了 Kubernetes,API 对象已经被创建并保存在 Etcd 当中。但是,这个 Pod 里有些容器因为某种原因而不能被顺利创建。比如,调度不成功
- Running。这个状态下,Pod 已经调度成功,跟一个具体的节点绑定。它包含的容器都已经创建成功,并且至少有一个正在运行中。
- Succeeded。这个状态意味着,Pod 里的所有容器都正常运行完毕,并且已经退出了。这种情况在运行一次性任务时最为常见。
- Failed。这个状态下,Pod 里至少有一个容器以不正常的状态(非 0 的返回码)退出。这个状态的出现,意味着你得想办法 Debug 这个容器的应用,比如查看 Pod 的 Events 和日志。
- Unknown。这是一个异常状态,意味着 Pod 的状态不能持续地被 kubelet 汇报给 kube-apiserver,这很有可能是主从节点(Master 和 Kubelet)间的通信出现了问题。