本文最后更新于:2024年4月22日 下午
Pod的介绍、创建、调度及生命周期
介绍 定义
Pod(豌豆荚) 是Kubernetes集群管理(创建、部署)与调度的最小计算单元,表示处于运行状态的一组容器
Pod不是进程,而是容器运行的环境。
一个Pod可以封装一个容器或多个容器(主容器或sidecar边车容器)
一个pod内的多个容器之间共享部分命名空间,例如:Net Namespace,UTS Namespace,IPC Namespace及存储资源
pod内的IP不是固定的,集群外不能直接访问pod
分类
控制器可以控制pod的副本数,扩容与裁剪,版本更新与回滚等
查看pod
kubectl get pod
kubectl get pod -n kube-system
pod的YAML资源清单格式
apiVersion: v1
kind: Pod
metadata:
name: string
namespace: string
labels:
name: string
annotations:
name: string
spec:
containers:
- name: string
image: string
imagePullPolicy: [ Always | Never | IfNotPresent]
command: [ string]
args: [ string]
workingDir: string
volumeMounts:
- name: string
mountPath: string
readOnly: boolean
ports:
- name: string
containerPort: int
hostPort: int
protocol: string
env:
- name: string
value: string
resources:
limits:
cpu: string
memory: string
requests:
cpu: string
memory: string
livenessProbe:
exec:
command: [ string]
httpGet:
path: string
port: number
host: string
scheme: string
HttpHeaders:
- name: string
value: string
tcpSocket:
port: number
initialDelaySeconds: 0
timeoutSeconds: 0
periodSeconds: 0
successThreshold: 0
failureThreshold: 0
securityContext:
privileged:false
restartPolicy: [ Always | Never | OnFailure]
nodeSelector: obeject
imagePullSecrets:
- name: string
hostNetwork: false
volumes:
- name: string
emptyDir: { }
hostPath: string
path: string
secret:
scretname: string
items:
- key: string
path: string
configMap:
name: string
items:
- key: string
path: string
注:如果不清楚某个参数的写法,可使用 kubectl explain 命令完成
kubectl explain pod
kubectl explain pod.spec
pod调度
以使用约束把pod调度到指定的node节点
调度约束方法
nodeName 用于将pod调度到指定的node名称上
nodeSelector 用于将pod调度到匹配Label的node上
第一种 :spec.nodeName 将容器调度到指定节点上
[ root@k8s-master1 ~]
apiVersion: v1
kind: Pod
metadata:
name: pod-nodename
spec:
nodeName: k8s-worker1
containers:
- name: nginx
image: nginx:1.15-alpine
第二种 :spec.nodeSelector nodeSelector节点选择器调度到指定节点上去
[ root@k8s-master1 ~]
apiVersion: v1
kind: Pod
metadata:
name: pod-nodeselect
spec:
nodeSelector:
bussiness: game
containers:
- name: nginx
image: nginx:1.15-alpine
生命周期 pod生命周期
有些pod(比如运行httpd服务),正常情况下会一直运行中,但如果手动删除它,此pod会终止
也有些pod(比如执行计算任务),任务计算完后就会自动终止
上面两种场景中,pod从创建到终止的过程就是pod的生命周期。
容器启动 启动后钩子post-start
执行后执行做健康检查
容器重启策略
HealthCheck健康检查 当Pod启动时,容器可能会因为某种错误(服务未启动或端口不正确)而无法访问等。
方式
说明
Liveness Probe(存活状态探测)
指示容器是否正在运行。如果存活态探测失败,则 kubelet 会杀死容器, 并且容器将根据其重启策略 决定未来。如果容器不提供存活探针, 则默认状态为 Success
。
readiness Probe(就绪型探测)
指示容器是否准备好为请求提供服务。如果就绪态探测失败, 端点控制器将从与 Pod 匹配的所有服务的端点列表中删除该 Pod 的 IP 地址。 初始延迟之前的就绪态的状态值默认为 Failure
。 如果容器不提供就绪态探针,则默认状态为 Success
。注:检查后不健康,将容器设置为Notready;如果使用service来访问,流量不会转发给此种状态的pod
startup Probe
指示容器中的应用是否已经启动。如果提供了启动探针,则所有其他探针都会被 禁用,直到此探针成功为止。如果启动探测失败,kubelet
将杀死容器,而容器依其 重启策略 进行重启。 如果容器没有提供启动探测,则默认状态为 Success
。
Probe探测方式
方式
说明
Exec
执行命令
HTTPGet
http请求某一个URL路径
TCP
tcp连接某一个端口
gRPC
使用 gRPC 执行一个远程过程调用。 目标应该实现 gRPC健康检查 。 如果响应的状态是 “SERVING”,则认为诊断成功。 gRPC 探针是一个 alpha 特性,只有在你启用了 “GRPCContainerProbe” 特性门控 时才能使用。
liveness-exec案例 1、准备资源清单文件pod-liveness-exec.yml
apiVersion : v1
kind : Pod
metadata :
name : liveness- exec
namespace : default
spec :
containers :
- name : liveness
image : busybox
imagePullPolicy : IfNotPresent
args :
- /bin/sh
- - c
- touch /tmp/healthy; sleep 30; rm - rf /tmp/healthy; sleep 600
livenessProbe :
exec :
command :
- cat
- /tmp/healthy
initialDelaySeconds : 5
periodSeconds : 5
2、应用yaml文件
kubectl apply -f pod-liveness-exec.yml
liveness-httpget案例 1、准备资源清单文件pod-liveness-httpget.yml
apiVersion : v1
kind : Pod
metadata :
name : liveness- httpget
namespace : default
spec :
containers :
- name : liveness
image : nginx: 1.15- alpine
imagePullPolicy : IfNotPresent
ports :
- name : http
containerPort : 80
livenessProbe :
httpGet :
port : http
path : /index.html
initialDelaySeconds : 3
periodSeconds : 5
2、应用YAML文件
kubectl apply -f pod-liveness-httpget.yml
liveness-tcp案例 1、准备资源文件pod-liveness-tcp.yml
apiVersion : v1
kind : Pod
metadata :
name : liveness- tcp
namespace : default
spec :
containers :
- name : liveness
image : nginx: 1.15- alpine
imagePullPolicy : IfNotPresent
ports :
- name : http
containerPort : 80
livenessProbe :
tcpSocket :
port : 80
initialDelaySeconds : 3
periodSeconds : 5
2、应用YAML文件
kubectl apply -f pod-liveness-tcp.yml
readiness案例 1、准备资源配置文件pod-readiness-httpget.yml
[ root@k8s-master1 ~]
apiVersion: v1
kind: Pod
metadata:
name: readiness-httpget
namespace: default
spec:
containers:
- name: readiness
image: nginx:1.15-alpine
imagePullPolicy: IfNotPresent
ports:
- name: http
containerPort: 80
readinessProbe:
httpGet:
port: http
path: /index.html
initialDelaySeconds: 3
periodSeconds: 5
2、应用YAML文件
kubectl apply -f pod-readiness-httpget.yml
post-start
容器启动后执行的命令
1、准备资源清单文件pod-poststart.yml
apiVersion: v1
kind: Pod
metadata:
name: poststart
namespace: default
spec:
containers:
- name: poststart
image: nginx:1.15-alpine
imagePullPolicy: IfNotPresent
lifecycle:
postStart:
exec:
command: [ "mkdir" ,"-p" ,"/usr/share/nginx/html/haha" ]
2、应用资源文件
kubectl apply -f pod-poststart.yml
3、查看是否创建成功
kubectl exec -it poststart -- ls /usr/share/nginx/html -l
pre-stop
容器终止前执行的命令
1、准备资源清单文件prestop.yml
apiVersion: v1
kind: Pod
metadata:
name: prestop
namespace: default
spec:
containers:
- name: prestop
image: nginx:1.15-alpine
imagePullPolicy: IfNotPresent
lifecycle:
preStop:
exec:
command: [ "/bin/sh" ,"-c" ,"sleep 60000000" ]
2、应用资源文件
kubectl apply -f prestop.yml
3、删除验证
kubectl delete -f prestop.yml