Pod 是一组容器发的集合,它们共享 IPC、Network 和 UTS namespace,是 Kubernetes 调度的基本单位。Pod 的设计理念是支持多个容器在一个 Pod 中共享网络和文件系统,可以通过进程间通信和文件共享这种简单高效的方式组合完成服务。
k8s以 PodStatus.Phase
抽象 Pod 的状态(但并不直接反映所有容器的状态)。可能的 Phase 包括
可以用 kubectl 命令查询 Pod Phase,如下:
[root@node162 ~]# kubectl get po test -o jsonpath="{.status.phase}"
Running
[root@node162 ~]#
restartPolicy
PodSpec 中的 restartPolicy
可以用来设置是否对退出的 Pod 重启,如下:
通过 spec.hostname
参数实现,如果未设置默认使用 metadata.name
参数的值作为 Pod 的 hostname。
apiVersion: v1
kind: Pod
metadata:
name: test
labels:
name: test
spec:
hostname: test ###设置pod 名称为test
containers:
- image: nginx
command: ["init"]
name: nginx:latest
为了确保容器在部署后确实处在正常运行状态,Kubernetes 提供了两种探针(Probe)来探测容器的状态:
0
则表示探测成功,否则表示失败[200,400)
之间则表示探测成功,否则表示失败apiVersion: v1
kind: Pod
metadata:
labels:
app: nginx
name: nginx
spec:
containers:
- image: nginx
imagePullPolicy: Always
name: http
livenessProbe:
httpGet:
path: /
port: 80
httpHeaders:
- name: X-Custom-Header
value: Awesome
initialDelaySeconds: 15
timeoutSeconds: 1
readinessProbe:
exec:
command:
- cat
- /usr/share/nginx/html/index.html
initialDelaySeconds: 5
timeoutSeconds: 1
- name: goproxy
image: gcr.io/google_containers/goproxy:0.1
ports:
- containerPort: 8080
readinessProbe:
tcpSocket:
port: 8080
initialDelaySeconds: 5
periodSeconds: 10
livenessProbe:
tcpSocket:
port: 8080
initialDelaySeconds: 15
periodSeconds: 20
容器生命周期钩子(Container Lifecycle Hooks)监听容器生命周期的特定事件,并在事件发生时执行已注册的回调函数。支持两种钩子:
0
表示执行成功,否则表示失败[200, 400)
之间表示请求成功,否则表示失败apiVersion: v1
kind: Pod
metadata:
name: lifecycle-demo
spec:
containers:
- name: lifecycle-demo-container
image: nginx
lifecycle:
postStart:
httpGet:
path: /
port: 80
preStop:
exec:
command: ["/usr/sbin/nginx","-s","quit"]
默认情况下,容器的 /etc/hosts
是 kubelet 自动生成的,并且仅包含 localhost 和 podName 等。不建议在容器内直接修改 /etc/hosts
文件,因为在 Pod 启动或重启时会被覆盖。
默认的 /etc/hosts
文件格式如下,其中 eci-runc-block-deployment-fio
是 podName:
[root@eci-runc-block-deployment-fio /]# cat /etc/hosts
# Kubernetes-managed hosts file.
127.0.0.1 localhost
::1 localhost ip6-localhost ip6-loopback
fe00::0 ip6-localnet
fe00::0 ip6-mcastprefix
fe00::1 ip6-allnodes
fe00::2 ip6-allrouters
172.10.0.44 eci-runc-block-deployment-fio
可以通过 pod.Spec.HostAliases
来增加 hosts 内容,如
spec:
hostAliases:
- ip: "10.224.1.100"
hostnames:
- "vip.test.com"
很多容器都是默认的 UTC 时区,与集群的 Node 所在时区有可能不一致,可以通过 HostPath 存储插件给容器配置与 Node 一样的时区,如下:
apiVersion: v1
kind: Pod
metadata:
name: time
spec:
containers:
- image: nginx:latest
volumeMounts:
- mountPath: /etc/localtime
name: time
readOnly: true
volumes:
- hostPath:
path: /etc/localtime
type: ""
name: time