🌟pod的容器类型
什么是Pod
所谓的Pod是K8S集群调度的最小单元,所谓的最小单元就是不可拆分。
Pod是一组容器的集合,其包含三种容器类型: (启动顺序依次是:基础架构容器,初始化容器,业务容器,对于用户而言,只需要额外关注后两者的容器类型即可。 )
为Pod提供基础linux名称空间(ipc,net,time,user)共享。
基础架构容器无需运维人员部署,而是有kubelet组件自行维护。
- 初始化容器
可选的容器类型,一般情况下,为业务容器做初始化工作。可以定义多个初始化容器。
- 业务容器
用户的实际业务。可以定义多个业务容器。
K8S一切皆资源
master组件
bash
[root@master231 ~]# kubectl get cs
[root@master231 ~]# kubectl get componentstatuses

查看worker组件
bash
[root@master231 ~]# kubectl get no
[root@master231 ~]# kubectl get nodes
[root@master231 ~]# kubectl get nodes -o wide

查看K8S集群内置的资源
bash
[root@master231 ~]# kubectl api-resources

查看Pod
bash
[root@master231 opt]# kubectl get pods
[root@master231 opt]# kubectl get pods -o wide
[root@master231 opt]# kubectl get po -o wide
[root@master231 opt]# kubectl get po

删除Pod
bash
[root@master231 opt]# kubectl delete po xiuxian-v1
[root@master231 opt]# kubectl delete po --all

创建Pod
bash
[root@master231 opt]# kubectl run xiuxian --image=registry.cn-hangzhou.aliyuncs.com/yinzhengjie-k8s/apps:v1

修改Pod
bash
[root@master231 opt]# kubectl set image po xiuxian xiuxian=registry.cn-hangzhou.aliyuncs.com/yinzhengjie-k8s/apps:v2

🌟故障排查技巧之describe
describe概述
使用kubectl describe可以查看资源的详细信息,包含其运行的状态及事件。
实战案例1
查看pod资源的状态
bash
[root@master231 ~]# kubectl describe pod xiuxian
Name: xiuxian
Namespace: default
...
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Warning FailedScheduling 53s (x4 over 4m7s) default-scheduler 0/3 nodes are available: 1 node(s) had taint {node-role.kubernetes.io/master: }, that the pod didn't tolerate, 2 node(s) had taint {node.kubernetes.io/unreachable: }, that the pod didn't tolerate.
[root@master231 ~]#
分析
根据报错信息可知,目前集群有3个节点可用,有一个节点有污点,另外两个节点无法访问。
检查集群状态
bash
[root@master231 ~]# kubectl get nodes
NAME STATUS ROLES AGE VERSION
master231 Ready control-plane,master 47h v1.23.17
worker232 NotReady <none> 47h v1.23.17
worker233 NotReady <none> 47h v1.23.17
[root@master231 ~]#
如上所示, 很明显,集群不正常工作。将集群的状态调整到Ready状态即可。
实战案例2
故障现象
bash
[root@master231 ~]# kubectl run xiuxian2 --image=registry.cn-hangzhou.aliyuncs.com/yinzhengjie-k8s/apps:V1
pod/xiuxian2 created
[root@master231 ~]#
[root@master231 ~]# kubectl get pods -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
xiuxian 1/1 Running 1 (35m ago) 39m 10.100.2.5 worker233 <none> <none>
xiuxian2 0/1 ErrImagePull 0 7s 10.100.2.6 worker233 <none> <none>
[root@master231 ~]#
[root@master231 ~]# kubectl describe pod xiuxian2
Name: xiuxian2
Namespace: default
...
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal Scheduled 27s default-scheduler Successfully assigned default/xiuxian2 to worker233
Normal BackOff 25s kubelet Back-off pulling image "registry.cn-hangzhou.aliyuncs.com/yinzhengjie-k8s/apps:V1"
Warning Failed 25s kubelet Error: ImagePullBackOff
Normal Pulling 12s (x2 over 26s) kubelet Pulling image "registry.cn-hangzhou.aliyuncs.com/yinzhengjie-k8s/apps:V1"
Warning Failed 12s (x2 over 25s) kubelet Failed to pull image "registry.cn-hangzhou.aliyuncs.com/yinzhengjie-k8s/apps:V1": rpc error: code = Unknown desc = Error response from daemon: manifest for registry.cn-hangzhou.aliyuncs.com/yinzhengjie-k8s/apps:V1 not found: manifest unknown: manifest unknown
Warning Failed 12s (x2 over 25s) kubelet Error: ErrImagePull
[root@master231 ~]#
如上所示,根据报错信息,发现kubelet说'Failed to pull image '拉取镜像失败。
解决方案
- 1.检查镜像是否合法,比如镜像写错可能会导致这个错误,远程仓库压根就不存在该镜像;
- 2.如果镜像是正确的,可能是你的虚拟机无法联网,导致下载失败;
- 3.可能是权限错误,说白了,这个镜像可能是私有仓库,需要登录后才能下载;
🌟资源的描述五个维度
- apiVersion: 表示资源API的版本号。
- kind: 资源的类型。
- metatada: 资源的元数据信息,包含资源的名称,标签,名称空间,资源注解等信息。
- spec: 期望资源的运行状态,需要自行定义。
- status: 资源的实际运行状态,由K8S集群自行维护。
声明式管理Pod资源
创建工作目录
bash
[root@master231 opt]# mkdir -pv /zhu/manifests/
mkdir: created directory '/zhu'
mkdir: created directory '/zhu/manifests/'
[root@master231 opt]# cd /zhu/manifests/
[root@master231 manifests]# mkdir pods
[root@master231 manifests]# cd pods/
编写资源清单
bash
[root@master231 ~]# vim 01-pods-xiuxian.yaml
# 指定资源的版本
apiVersion: v1
# 指定资源的类型
kind: Pod
# 指定资源的元数据
metadata:
# 指定资源的名称
name: xixi
# 期望资源的运行状态
spec:
# 定义运行的容器信息
containers:
# 容器的名称
- name: c1
# 指定容器的镜像
image: registry.cn-hangzhou.aliyuncs.com/yinzhengjie-k8s/apps:v1
创建资源
bash
[root@master231 pods]# kubectl create -f 01-pods-xiuxian.yaml

修改资源
bash
[root@master231 ~]# vim 01-pods-xiuxian.yaml
# 指定资源的版本
apiVersion: v1
# 指定资源的类型
kind: Pod
# 指定资源的元数据
metadata:
# 指定资源的名称
name: xixi
# 期望资源的运行状态
spec:
# 定义运行的容器信息
containers:
# 容器的名称
- name: c1
# 指定容器的镜像
#image: registry.cn-hangzhou.aliyuncs.com/yinzhengjie-k8s/apps:v1
image: registry.cn-hangzhou.aliyuncs.com/yinzhengjie-k8s/apps:v2

删除资源
bash
[root@master231 pods]# kubectl delete -f 01-pods-xiuxian.yaml
[root@master231 pods]# kubectl delete pods --all

🌟容器的三种状态
编写资源清单
bash
[root@master231 pods]# vim 02-pods-multiple-xiuxian.yaml
apiVersion: v1
kind: Pod
metadata:
name: haha
spec:
containers:
- name: c1
image: registry.cn-hangzhou.aliyuncs.com/yinzhengjie-k8s/apps:v1
- name: c2
image: registry.cn-hangzhou.aliyuncs.com/yinzhengjie-k8s/apps:v2
[root@master231 pods]# kubectl apply -f 02-pods-multiple-xiuxian.yaml
查看资源
bash
[root@master231 pods]# kubectl describe po xixi
[root@master231 pods]# kubectl get pods -o wide
Name: xixi
Namespace: default
Priority: 0
Node: worker233/10.0.0.233
Start Time: Sun, 21 Sep 2025 11:27:44 +0800
Labels: <none>
Annotations: <none>
Status: Running # Pod状态,此处为Runing表示当前Pod最少有一个容器处于运行状态。
IP: 10.100.2.9 # Pod的IP地址
IPs:
IP: 10.100.2.9
Containers: # 这里是容器的相关信息
c1: # 容器的名称为c1
Container ID: docker://ebb83f40bfa2ad6d4990790f78f547a7cb9fe54292c95b9299f60d4c29017919
Image: registry.cn-hangzhou.aliyuncs.com/yinzhengjie-k8s/apps:v1
...
State: Running # 很明显,当前容器处于运行状态。
Started: Sun, 21 Sep 2025 11:27:45 +0800
...
c2: # 容器的名称为c2
Container ID: docker://986591f3a8bea5fd83a72870903d17493b0e6cdedfc593be057528b24e4a38d9
Image: registry.cn-hangzhou.aliyuncs.com/yinzhengjie-k8s/apps:v2
...
State: Waiting # 容器的状态处于Waitting
Reason: CrashLoopBackOff
Last State: Terminated # 说白了,c2容器已经终止了。
Reason: Error
Exit Code: 1
Started: Sun, 21 Sep 2025 11:28:29 +0800
Finished: Sun, 21 Sep 2025 11:28:31 +0800
Ready: False
Restart Count: 2 # 重启的次数
...
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal Scheduled 60s default-scheduler Successfully assigned default/haha to worker233
Normal Pulled 59s kubelet Container image "registry.cn-hangzhou.aliyuncs.com/yinzhengjie-k8s/apps:v1" already present on machine
Normal Created 59s kubelet Created container c1
Normal Started 59s kubelet Started container c1
Normal Pulled 15s (x4 over 59s) kubelet Container image "registry.cn-hangzhou.aliyuncs.com/yinzhengjie-k8s/apps:v2" already present on machine
Normal Created 15s (x4 over 59s) kubelet Created container c2
Normal Started 15s (x4 over 59s) kubelet Started container c2
Warning BackOff 0s (x5 over 53s) kubelet Back-off restarting failed container
[root@master231 pods]#

综上所述:
容器有三种状态,分别对应为: Waiting,Running,Termining。
- Running
表示容器处于正常运行状态。
- Termining
表示容器处于终止状态,一般情况下在删除时才会出现。
- Waiting
表示既没有Running,也没有Termining,属于一种等待状态,比如容器无法正常启动,或者正在拉取镜像。
温馨提示: 当查看Pod状态时,有CrashLoopBackOff关键字时,说明该Pod内有容器正在重启。
🌟容器的类型验证之pause提供网络名称空间案例
查看pod列表
bash
[root@master231 pods]# kubectl get pods -o wide
[root@master231 pods]# curl 10.100.1.6

温馨提示: 从上面可以看出Pod有2个容器,只有一个容器正常运行,Pod调度到worker233节点。
去相应节点查看容器信息
bash
[root@worker232 ~]# docker ps -a | grep xixi

温馨提示:
- A.虽然我们写了2个容器c1和c2,但是去对应的worker233节点发现有三个容器。
- B.c1容器正常运行Up,c2容器Exited
- C.还有一个基础架构容器,为Pod提供名称空间(ipc,net,time,user);
删除业务容器时,发现会自动重启,且IP地址并不会发生变化
查看重启测试
bash
[root@master231 pods]# kubectl get pods -o wide

删除容器
bash
[root@worker232 ~]# docker rm -f 0b42187a579d

查看重启次数
bash
[root@master231 pods]# kubectl get pods -o wide

删除基础架构容器后业务容器也会重启,IP地址会发生变化
删除基础架构容器
bash
[root@worker232 ~]# docker rm -f 9e747c057e95

验证服务端
bash
[root@master231 pods]# kubectl get pods -o wide

Linux证据
bash
[root@worker232 ~]# docker inspect -f {{.State.Pid}} 3d83183f8356
113730
[root@worker232 ~]# docker inspect -f {{.State.Pid}} 1af9274b9ff9
113604
[root@worker232 ~]# ll /proc/113730/ns/
[root@worker232 ~]# ll /proc/113604/ns/

分析为什么c2没有起来呢?
有一个共同特点,都会使用80端口,基础架构为c1和c2同时提供网络名称空间,但是80端口仅有一个,因此c2无法启动成功!
说白了,就是端口冲突导致的。
🌟一个Pod中运行多个容器案例之command
编写资源清单
bash
[root@master231 pods]# vim 03-pods-multiple-xiuxian.yaml
apiVersion: v1
kind: Pod
metadata:
name: xixi
spec:
containers:
- name: c1
image: registry.cn-hangzhou.aliyuncs.com/yinzhengjie-k8s/apps:v1
- name: c2
image: registry.cn-hangzhou.aliyuncs.com/yinzhengjie-k8s/apps:v2
command: ["sleep","365d"]
查看容器状态
bash
[root@master231 pods]# kubectl apply -f 03-pods-multiple-xiuxian.yaml
[root@master231 pods]# kubectl get pods -o wide

去相应节点查看容器的启动命令
bash
[root@worker232 ~]# docker ps -a --no-trunc | grep xixi | awk '{print $3,$4,$5,$6,$7}'

🌟在Pod指定容器中运行命令案例
在Pod指定容器中运行命令
bash
[root@master231 pods]# kubectl get pods -o wide
[root@master231 pods]# kubectl exec xixi -c c1 -- ps -ef
[root@master231 pods]# kubectl exec xixi -c c2 -- ps -ef

连接到指定容器
bash
[root@master231 pods]# kubectl exec xixi -c c2 -it -- sh
/ # sed -i '/listen/s#80#81#' /etc/nginx/conf.d/default.conf

访问测试
bash
[root@master231 pods]# kubectl get pods -o wide
[root@master231 pods]# curl 10.100.1.8:81

🌟响应式管理Pods标签
查看pod标签
bash
[root@master231 pods]# kubectl get pods --show-labels
[root@master231 pods]# kubectl get pods --show-labels -o wide

为pod打标签
bash
[root@master231 pods]# kubectl label pod xixi app=v1

修改标签
bash
[root@master231 pods]# kubectl label pod xixi app=v2 --overwrite

删除标签
bash
[root@master231 pods]# kubectl label pod xixi app-

标签的应用案例
基于标签进行过滤
bash
[root@master231 pods]# kubectl get pods -o wide --show-labels -l app=v2

基于标签删除Pod
bash
[root@master231 pods]# kubectl delete pods -l app=v2

🌟声明式管理Pods标签
编写资源清单创建pod
bash
[root@master231 pods]# vim 04-pods-labels.yaml
apiVersion: v1
kind: Pod
metadata:
name: xixi
spec:
containers:
- name: c1
image: registry.cn-hangzhou.aliyuncs.com/yinzhengjie-k8s/apps:v1
---
apiVersion: v1
kind: Pod
metadata:
name: haha
spec:
containers:
- name: c1
image: registry.cn-hangzhou.aliyuncs.com/yinzhengjie-k8s/apps:v1
[root@master231 pods]# kubectl apply -f 04-pods-labels.yaml

添加标签
bash
[root@master231 pods]# vim 04-pods-labels.yaml
apiVersion: v1
kind: Pod
metadata:
name: xixi
labels:
apps: v1
spec:
containers:
- name: c1
image: registry.cn-hangzhou.aliyuncs.com/yinzhengjie-k8s/apps:v1
---
apiVersion: v1
kind: Pod
metadata:
name: haha
labels:
apps: v2
spec:
containers:
- name: c1
image: registry.cn-hangzhou.aliyuncs.com/yinzhengjie-k8s/apps:v1
[root@master231 pods]# kubectl apply -f 04-pods-labels.yaml

修改标签
bash
[root@master231 pods]# vim 04-pods-labels.yaml
apiVersion: v1
kind: Pod
metadata:
name: xixi
labels:
apps: v1
zhu: xixi
spec:
containers:
- name: c1
image: registry.cn-hangzhou.aliyuncs.com/yinzhengjie-k8s/apps:v1
---
apiVersion: v1
kind: Pod
metadata:
name: haha
labels:
apps: v2
zhu: haha
spec:
containers:
- name: c1
image: registry.cn-hangzhou.aliyuncs.com/yinzhengjie-k8s/apps:v1
[root@master231 pods]# kubectl apply -f 04-pods-labels.yaml

回收资源
bash
[root@master231 pods]# kubectl delete pods --all

🌟rc控制器实战
什么是rc
rc全称为"ReplicationController",表示副本控制器,其作用就是控制指定Pod副本数量始终存活。
编写资源清单
bash
[root@master231 replicationcontrollers]# vim 01-rc-xiuxian.yaml
apiVersion: v1
kind: ReplicationController
metadata:
name: rc-xiuxian
labels:
zhu: xixi
spec:
# 指定Pod的副本数量
replicas: 3
# 定义标签选择器基于标签关联Pod
selector:
version: v1
# 指定Pod的模板
template:
metadata:
labels:
app: xiuxian
version: v1
spec:
containers:
- name: c1
image: registry.cn-hangzhou.aliyuncs.com/yinzhengjie-k8s/apps:v1
创建rc资源
bash
[root@master231 replicationcontrollers]# kubectl apply -f 01-rc-xiuxian.yaml
replicationcontroller/rc-xiuxian created
[root@master231 replicationcontrollers]# kubectl get rc
[root@master231 replicationcontrollers]# kubectl get rc --show-labels

同时查看rc和pods资源
bash
[root@master231 replicationcontrollers]# kubectl get rc,po
[root@master231 replicationcontrollers]# kubectl get rc,po --show-labels

删除pod副本后rc会自动拉起指定副本数量的Pod
bash
[root@master231 replicationcontrollers]# kubectl delete pods -l app=xiuxian


删除rc会自动级联删除pod
bash
[root@master231 replicationcontrollers]# kubectl delete rc rc-xiuxian

🌟Pod的三种重启策略
编写资源清单(Always重启策略)
当Pod内的容器退出时,始终重启容器。
bash
[root@master231 pods]# vim 05-pods-restartPolicy.yaml
apiVersion: v1
kind: Pod
metadata:
name: xiuxian-restartpolicy-001
labels:
app: xiuxian
version: v1
spec:
# 指定Pod的重启策略,有效值为: Always, OnFailure,Never
# Always:
# 当Pod内的容器退出时,始终重启容器。
# Never:
# 当Pod内的容器退出时,始终不重启容器。
# OnFailure:
# 当容器异常退出时,则会重启容器。如果正常退出,则不会重启容器。
# rc控制器不支持该字段。
#
# 如果不指定该字段,则默认值: Always。所谓的重启指的是重新创建新的容器。
restartPolicy: Always
#restartPolicy: OnFailure
#restartPolicy: Never
containers:
- name: c1
image: registry.cn-hangzhou.aliyuncs.com/yinzhengjie-k8s/apps:v1
# command相当于替换了Dockerfile的ENTRYPOINT指令。
command:
- sleep
# args相当于替换了Dockerfile的CMD指令。
args:
#- "300"
- "10"
创建资源
bash
[root@master231 pods]# kubectl apply -f 05-pods-labels.yaml
测试验证
bash
[root@master231 pods]# kubectl get pods -o wide

编写资源清单(OnFailure重启策略)
当容器异常退出时,则会重启容器。如果正常退出,则不会重启容器。
rc控制器不支持该字段。
bash
apiVersion: v1
kind: Pod
metadata:
name: xiuxian-restartpolicy-001
labels:
app: xiuxian
version: v1
spec:
# 指定Pod的重启策略,有效值为: Always, OnFailure,Never
# Always:
# 当Pod内的容器退出时,始终重启容器。
# Never:
# 当Pod内的容器退出时,始终不重启容器。
# OnFailure:
# 当容器异常退出时,则会重启容器。如果正常退出,则不会重启容器。
# rc控制器不支持该字段。
#
# 如果不指定该字段,则默认值: Always。所谓的重启指的是重新创建新的容器。
#restartPolicy: Always
restartPolicy: OnFailure
#restartPolicy: Never
containers:
- name: c1
image: registry.cn-hangzhou.aliyuncs.com/yinzhengjie-k8s/apps:v1
# 相当于替换了Dockerfile的ENTRYPOINT指令。
command:
- sleep
# 相当于替换了Dockerfile的CMD指令。
args:
#- "300"
- "10"
创建资源
bash
[root@master231 pods]# kubectl apply -f 05-pods-labels.yaml

测试验证
bash
[root@worker232 ~]# docker inspect c7c3407698d7
[root@worker232 ~]# docker ps -a | grep xixi
[root@worker232 ~]# kill -9 249255

编写资源清单(Never重启策略)
bash
apiVersion: v1
kind: Pod
metadata:
name: xiuxian-restartpolicy-001
labels:
app: xiuxian
version: v1
spec:
# 指定Pod的重启策略,有效值为: Always, OnFailure,Never
# Always:
# 当Pod内的容器退出时,始终重启容器。
# Never:
# 当Pod内的容器退出时,始终不重启容器。
# OnFailure:
# 当容器异常退出时,则会重启容器。如果正常退出,则不会重启容器。
# rc控制器不支持该字段。
#
# 如果不指定该字段,则默认值: Always。所谓的重启指的是重新创建新的容器。
#restartPolicy: Always
#restartPolicy: OnFailure
restartPolicy: Never
containers:
- name: c1
image: registry.cn-hangzhou.aliyuncs.com/yinzhengjie-k8s/apps:v1
# 相当于替换了Dockerfile的ENTRYPOINT指令。
command:
- sleep
# 相当于替换了Dockerfile的CMD指令。
args:
#- "300"
- "10"
创建资源
bash
[root@master231 pods]# kubectl apply -f 05-pods-labels.yaml
测试验证
bash
[root@master231 pods]# kubectl get pods -o wide
