k8s-Pod基础管理,标签管理,rc控制器及重启策略实战

🌟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
相关推荐
LDG_AGI2 小时前
【人工智能】OpenClaw(一):MacOS极简安装OpenClaw之Docker版
运维·人工智能·深度学习·机器学习·docker·容器·推荐算法
returnthem2 小时前
最新版 Kubernetes 集群搭建教程(kubeadm 方式)
云原生·容器·kubernetes
Monster丶6262 小时前
Docker 部署 Ollama 全流程指南:支持 CPU/GPU、生产环境可用的工程化实践
运维·人工智能·docker·容器
白花生2 小时前
k8s集群内的ollama pod持久化调用本地大模型
云原生·容器·kubernetes
hkNaruto2 小时前
【Docker】关于hub.docker.com,无法打开,国内使用dockers.xuanyuan.me搜索容器镜像、查看容器镜像的使用文档
运维·docker·容器
秋刀鱼什么味_2 小时前
kubernetes服务质量之QoS类
容器·kubernetes
勇闯逆流河2 小时前
【Linux】linux进程概念(环境变量详解)
linux·运维·服务器
姚不倒2 小时前
从 Docker 到 Kubernetes:容器编排核心原理与网络实践
运维·云原生·容器·kubernetes
Lucky小小吴3 小时前
Apifox 被投毒!你的 SSH 密钥正在被上传
运维·ssh