Pod基本操作¶
1、运行一个pod
$ k run pod-demo --image=nginx:1.21.6
说明:如果不指定ns,则默认为default
查看pod状态,正常为running
$ k get po
2、从已知Pod导出YAML文件
$ k get po pod-demo -o yaml > pod-demo.yaml
3、使用YAML创建pod
$ vim ngx-pod.yaml
apiVersion: v1
kind: Pod
metadata:
name: ngx-pod
namespace: aming
labels: ## labels字段非常关键,它可以添加任意数量的Key-Value,目的是为了让pod的信息更加详细
env: dev
spec: ##用来定义该pod更多的资源信息,比如containers, volume, storage
containers: ##定义容器属性
- image: nginx:1.23.2
imagePullPolicy: IfNotPresent ##镜像拉取策略,三种:Always/Never/IfNotPresent,一般默认是IfNotPresent,也就是说只有本地不存在才会远程拉取镜像,可以减少网络消耗。
name: ngx
env: ##定义变量,类似于Dockerfile里面的ENV指令
- name: os
value: "Rocky Linux"
ports:
- containerPort: 80
$ k apply -f ngx-pod.yaml
4、删除pod
$ k delete -f ngx-pod.yaml
除了通过yaml文件进行删除外,也可以通过delete命令进行删除
$ k delete po ngx-pod
5、强制删除Pod
$ k delete po ngx-pod --grace-period=0 --force
默认情况下,所有的删除操作都会附有 30 秒钟的宽限期限。 kubectl delete 命令支持 --grace-period=<seconds> 选项,允许你重载默认值, 设定自己希望的期限值。
将宽限期限强制设置为 0 意味着立即从 API 服务器删除 Pod。 如果 Pod 仍然运行于某节点上,强制删除操作会触发 kubelet 立即执行清理操作。
注意事项:马上删除时不等待确认正在运行的资源已被终止。这些资源可能会无限期地继续在集群上运行。
Pod原理¶
Pod 是在 K8s集群中运行部署应用或服务的最小单元。
在同一个Pod中其实可以同时运行多个容器,这些容器能够共享网络、存储以及 CPU/内存等资源。
每个Pod都有一个特殊的被称为 “根容器” 的Pause容器。Pause容器的主要作用是为Pod中的其他容器提供一些基本的功能,比如网络和PID命名空间的共享、 负责管理Pod内其他容器的生命周期。
- 网络命名空间共享:pause容器为整个Pod创建一个网络命名空间,Pod内的其他容器都将加入这个网络命名空间。这样,Pod中的所有容器都可以共享同一个IP地址和端口空间,从而实现容器间的紧密通信。
- PID命名空间共享:pause容器充当Pod内其他容器的父容器,它们共享同一个PID命名空间。这使得Pod内的容器可以通过进程ID直接发现和相互通信,同时也使得Pod具有一个统一的生命周期。
- 生命周期管理:pause容器作为Pod中其他容器的父容器,负责协调和管理它们的生命周期。当pause容器启动时,它会成为Pod中其他容器的根容器。当pause容器终止时,所有其他容器也会被自动终止,确保了整个Pod的生命周期的一致性。
- 保持Pod状态:pause容器保持运行状态,即使Pod中的其他容器暂时停止或崩溃,也可以确保Pod保持活跃。这有助于Kubernetes更准确地监视和管理Pod的状态。
Pod生命周期¶
Pod生命周期包括以下几个阶段:
- Pending:在此阶段,Pod已被创建,但尚未调度到运行节点上。此时,Pod可能还在等待被调度,或者因为某些限制(如资源不足)而无法立即调度。
- Running:在此阶段,Pod已被调度到一个节点,并创建了所有的容器。至少有一个容器正在运行,或者正在启动或重启。
- Succeeded:在此阶段,Pod中的所有容器都已成功终止,并且不会再次重启。
- Failed:在此阶段,Pod中的至少一个容器已经失败(退出码非零)。这意味着容器已经崩溃或以其他方式出错。
- Unknown:在此阶段,Pod的状态无法由Kubernetes确定。这通常是因为与Pod所在节点的通信出现问题。
除了这些基本的生命周期阶段之外,还有一些更详细的容器状态,用于描述容器在Pod生命周期中的不同阶段:
- ContainerCreating:容器正在创建,但尚未启动。
- Terminating:容器正在终止,但尚未完成。
- Terminated:容器已终止。
- Waiting:容器处于等待状态,可能是因为它正在等待其他容器启动,或者因为它正在等待资源可用。
- Completed:有一种Pod是一次性的,不需要一直运行,只要执行完就会是此状态。
创建Pod流程¶
创建Pod流程图如下:

- 用户通过kubectl或其他API客户端提交Pod对象给API server。
- API server尝试将Pod对象的相关信息存入etcd中,写入操作完成后API server会返回确认信息至客户端。
- API server开始反映etcd中的状态变化。
- 所有的Kubernetes组件均使用watch机制来跟踪检查API server上的相关变化。
- Kube-scheduler通过其watcher观察到API server创建了新的Pod对象但尚未绑定至任何节点。
- Kube-scheduler为Pod对象挑选一个工作节点并将结果更新至API server。
- 调度结果由API server更新至etcd,而且API server也开始反映此Pod对象的调度结果。
- Pod 被调度的目标工作节点上的kubelet尝试在当前节点上调用Containerd启动容器,并将容器的结果状态返回至API server。
- API server将Pod 状态信息存入etcd。
- 在etcd确认写操作完成后,API server将确认信息发送至相关的kubelet。
删除Pod流程¶

- 请求删除Pod。
- API server将Pod标记为Terminating状态。
- (与第 2 步同时进行)kubelet在监控到Pod对象转为Terminating状态的同时启动Pod关闭过程。
- (与第 2 步同时进行)Service将Endpoint摘除。
- 如果当前Pod对象定义了preStop hook,则在其标记为Terminating后会以同步的方式执行,宽限期开始计时。
- Pod中的容器进程收到TERM信号。
- 宽限期结束后,若进程仍在运行,会收到SIGKILL信号。
- kubelet请求API server将此Pod对象的宽限期设置为0,从而完成删除操作。
Pod资源限制¶
1)Resource Quota
资源配额Resource Quotas(简称quota)是对namespace进行资源配额,限制资源使用的一种策略。
K8S是一个多用户架构,当多用户或者团队共享一个K8S系统时,SA使用quota防止用户(基于namespace的)的资源抢占,定义好资源分配策略。
Quota应用在Namespace上,默认情况下,没有Resource Quota的,需要另外创建Quota,并且每个Namespace最多只能有一个Quota对象。
可限定资源类型:
计算资源:limits.cpu(最多能用多少cpu)、requests.cpu(最少能用多少cpu)、limits.memory(最多能用多少内存)、requests.memory(最少能用多少内存)
存储资源,包括存储资源的总量以及指定storage class的总量
requests.storage:存储资源总量,如500Gi
persistentvolumeclaims:pvc的个数
对象数,即可创建的对象的个数
pods, replicationcontrollers, configmaps, secrets,persistentvolumeclaims,services, services.loadbalancers,services.nodeports
注意:
Quota依赖于资源管理器,可以使用资源对象limits或者在创建资源对象时为pod设置资源限制(resources),如果不设置,资源对象无法创建。当该namespace中的任意个额度达到预设Quota时,将无法创建资源对象。只会达到最大预设值。
Resource Quota示例:
cat > quota.yaml <<EOF
apiVersion: v1
kind: ResourceQuota
metadata:
namespace: aming
name: aming-quota
spec:
hard:
pods: 50 ## 该命名空间里最多支持启动50个Pods
requests.cpu: 0.5 ##最低保证0.5个CPU资源
requests.memory: 512Mi ##最低保证512M内存
limits.cpu: 5 ##最多使用5核CPU
limits.memory: 16Gi ##最多使用16G内存
configmaps: 20 ##最多支持20个configMaps
persistentvolumeclaims: 20 ##最多支持20个pvc
replicationcontrollers: 20 ##最多支持20个replicationControllers
secrets: 20 ##最多支持20个secrets
services: 50 ##最多支持50个services
EOF
下面进行示例演示说明:
1、定义quota,限制pod最大数为5
$ cat > quota.yaml <<EOF
apiVersion: v1
kind: ResourceQuota
metadata:
namespace: aming
name: aming-quota
spec:
hard:
pods: 5 ## 该命名空间里最多支持启动5个Pods
EOF
2、创建命名空间
$ k create ns aming
3、生效
$ k apply -f quota.yaml
4、查看
$ k get quota -n aming
NAME AGE REQUEST LIMIT
aming-quota 55s pods: 0/5
5、创建deployment,指定Pod副本为7,进行验证
$ k create deploy testdp --image=nginx:1.21.6 -n aming --replicas=7
6、查看deployment和pod,观察到因资源限制,所以只能创建5个
$ k get deploy,po -n aming
NAME READY UP-TO-DATE AVAILABLE AGE
deployment.apps/testdp 5/7 5 5 5m5s
NAME READY STATUS RESTARTS AGE
pod/testdp-7c66644bf8-6lrzj 1/1 Running 0 5m5s
pod/testdp-7c66644bf8-6vkbb 1/1 Running 0 5m5s
pod/testdp-7c66644bf8-8b5sv 1/1 Running 0 5m5s
pod/testdp-7c66644bf8-gfjdf 1/1 Running 0 5m5s
pod/testdp-7c66644bf8-wp72m 1/1 Running 0 5m5s
7、验证完成后,恢复环境
$ k delete deploy -n aming --all
2)Pod的limits和requests
Resource Quota是针对namespace下面所有的Pod的限制,而Pod自身也有限制。
下面进行示例演示说明:
1、定义quota,限制Pod CPU资源最多使用500m、限制内存资源最多使用2G、K8s要保证Pod使用的最小cpu资源为200m、K8s要保证Pod使用最小内存为512M
$ cat > quota-pod.yaml <<EOF
apiVersion: v1
kind: Pod
metadata:
name: quota-pod
namespace: aming
spec:
containers:
- image: nginx:1.21.6
name: ngx
imagePullPolicy: IfNotPresent
ports:
- containerPort: 80
resources:
limits:
cpu: 0.5 ##限制Pod CPU资源最多使用500m,这里的0.5=500m,1=1000m
memory: 2Gi ##限制内存资源最多使用2G
requests:
cpu: 200m ##K8s要保证Pod使用的最小cpu资源为200m,如果node上资源满足不了,则不会调度到该node上
memory: 512Mi ##K8s要保证Pod使用最小内存为512M,如果node上资源满足不了,则不会调度到该node上
EOF
2、创建命名空间
$ k create ns aming
3、生效
$ k apply -f quota-pod.yaml
4、查看
$ k describe po -n aming quota-pod
