k8s的pod管理

一.命令式对象管理

1.命名空间管理

bash 复制代码
[root@k8s-master ~]# kubectl get namespaces		#查看命名空间
NAME              STATUS   AGE
default           Active   4h20m
kube-flannel      Active   3h31m
kube-node-lease   Active   4h20m
kube-public       Active   4h20m
kube-system       Active   4h20m

#创建命名空间
[root@k8s-master ~]# kubectl get namespaces
NAME              STATUS   AGE
default           Active   4h22m
kube-flannel      Active   3h32m
kube-node-lease   Active   4h22m
kube-public       Active   4h22m
kube-system       Active   4h22m
timinglee         Active   5s

#删除命名空间
[root@k8s-master ~]# kubectl delete namespaces  timinglee
namespace "timinglee" deleted

2.pod管理

bash 复制代码
#查看pod的运行情况和在哪里运行
[root@k8s-master ~]# kubectl get pods  -o wide
No resources found in default namespace.

#创建pod
[root@k8s-master ~]# kubectl run  lee --image nginx:latest
pod/lee created


[root@k8s-master ~]# kubectl get pods  -o wide
NAME   READY   STATUS    RESTARTS   AGE   IP            NODE        NOMINATED NODE   READINESS GATES
lee    1/1     Running   0          25s   10.244.1.10   k8s-node1   <none>           <none>


#当pod创建出现问题
[root@k8s-master ~]# kubectl run  error --image lee:v1
[root@k8s-master ~]# kubectl get pods -o wide
NAME    READY   STATUS             RESTARTS   AGE   IP            NODE        NOMINATED NODE   READINESS GATES
error   0/1     ImagePullBackOff   0          38s   10.244.2.3    k8s-node2   <none>           <none>
lee     1/1     Running            0          91s   10.244.1.10   k8s-node1   <none>           <none>

#查看pod运行的详细信息
[root@k8s-master ~]# kubectl describe  pods  error
Name:             error
Namespace:        default
Priority:         0
Service Account:  default
Node:             k8s-node2/172.25.254.20
Start Time:       Thu, 20 Aug 2026 15:08:30 +0800
Labels:           run=error
Annotations:      <none>
Status:           Pending
IP:               10.244.2.3
IPs:
  IP:  10.244.2.3
Containers:
  error:
    Container ID:
    Image:          lee:v1
    Image ID:
    Port:           <none>
    Host Port:      <none>
    State:          Waiting
      Reason:       ImagePullBackOff
    Ready:          False
    Restart Count:  0
    Environment:    <none>
    Mounts:
      /var/run/secrets/kubernetes.io/serviceaccount from kube-api-access-kfcjl (ro)
Conditions:
  Type                        Status
  PodReadyToStartContainers   True
  Initialized                 True
  Ready                       False
  ContainersReady             False
  PodScheduled                True
Volumes:
  kube-api-access-kfcjl:
    Type:                    Projected (a volume that contains injected data from multiple sources)
    TokenExpirationSeconds:  3607
    ConfigMapName:           kube-root-ca.crt
    Optional:                false
    DownwardAPI:             true
QoS Class:                   BestEffort
Node-Selectors:              <none>
Tolerations:                 node.kubernetes.io/not-ready:NoExecute op=Exists for 300s
                             node.kubernetes.io/unreachable:NoExecute op=Exists for 300s
Events:
  Type     Reason     Age                From               Message
  ----     ------     ----               ----               -------
  Normal   Scheduled  87s                default-scheduler  Successfully assigned default/error to k8s-node2
  Warning  Failed     28s (x2 over 65s)  kubelet            spec.containers{error}: Failed to pull image "lee:v1": Error response from daemon: failed to resolve reference "docker.io/library/lee:v1": docker.io/library/lee:v1: not found
  Warning  Failed     28s (x2 over 65s)  kubelet            spec.containers{error}: Error: ErrImagePull
  Normal   BackOff    16s (x2 over 64s)  kubelet            spec.containers{error}: Back-off pulling image "lee:v1"
  Warning  Failed     16s (x2 over 64s)  kubelet            spec.containers{error}: Error: ImagePullBackOff
  Normal   Pulling    2s (x3 over 86s)   kubelet            spec.containers{error}: Pulling image "lee:v1"
  
#删除  
[root@k8s-master ~]# kubectl delete  pods error
[root@k8s-master ~]# kubectl delete pods --all
pod "error" deleted from default namespace
pod "lee" deleted from default namespace

二.kubectl 命令实操

1.上传实验镜像到仓库library中

bash 复制代码
[root@k8s-master ~]# docker load  -i myapp.tar.gz
[root@k8s-master ~]# docker tag timinglee/myapp:v1 reg.timinglee.org/library/myapp:v1
[root@k8s-master ~]# docker push  reg.timinglee.org/library/myapp:v1
[root@k8s-master ~]# docker tag timinglee/myapp:v2 reg.timinglee.org/library/myapp:v2
[root@k8s-master ~]# docker push  reg.timinglee.org/library/myapp:v2

2.生成实验所需yml文件

bash 复制代码
[root@k8s-master ~]# vim replica.yml
apiVersion: apps/v1
kind: ReplicaSet
metadata:
  labels:
    app: replica	#设定控制器标签
  name: replica
spec:
  replicas: 2		#启动pod数量
  selector:
    matchLabels:
      app: replica	#控制器标签选择器
  template:
    metadata:
      labels:
        app: replica	#开启pod的属性模板
    spec:
      containers:
      - image: myapp:v1
        name: myapp

3.kubectl命令使用方法

命令 作用 示例
create 创建资源(通过 yaml 文件或者命令直接创建) kubectl create -f pod.yaml
edit 直接编辑在线运行的资源,修改后即时生效 kubectl edit deployment nginx
patch 打补丁,局部修改资源,不用完整 yaml kubectl patch pod pod-name -p '{"spec":{"...":...}}'
expose 将 Pod/Deployment 暴露为 Service,创建访问入口 kubectl expose deployment nginx --port=80 --type=NodePort
logs 查看 Pod 容器日志,排错最常用 kubectl logs -f pod-name -f实时跟踪日志
attach 附着到 Pod 里面的进程,连接容器(不常用) kubectl attach pod-name
exec 在 Pod 容器内部执行命令,进入容器终端 kubectl exec -it pod-name -- /bin/bash
cp 宿主机和 Pod 容器之间拷贝文件 kubectl cp 本地文件 pod名称:/容器路径
rollout 管理版本滚动更新:查看历史、回滚、重启 kubectl rollout history deployment nginx``kubectl rollout undo deployment nginx回滚上一版本
scale 扩缩副本数,调整 deployment/pod 副本数量 kubectl scale deployment nginx --replicas=3
label 给资源打标签 / 删除标签,用于筛选资源 kubectl label pod pod-name env=test删除标签:kubectl label pod pod-name env-

三.利用控制器实现版本更替

1.建立控制器(在做以下实验时harbor仓库中的library项目中必须有myapp:v1和myapp:v2两个镜像 )

bash 复制代码
[root@k8s-master ~]# kubectl create deployment webcluster --image myapp:v1 --replicas 2 --dry-run=client -o yaml > webcluster.yml

root@k8s-master ~]# vim webcluster.yml
apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app: webcluster
  name: webcluster
spec:
  replicas: 2
  selector:
    matchLabels:
      app: webcluster
  template:
    metadata:
      labels:
        app: webcluster
    spec:
      containers:
      - image: myapp:v1
        name: myapp

[root@k8s-master ~]# kubectl apply -f webcluster.yml
deployment.apps/webcluster created
[root@k8s-master ~]# kubectl get pods
NAME                          READY   STATUS    RESTARTS   AGE
webcluster-77c87d9946-2xl44   1/1     Running   0          3s
webcluster-77c87d9946-cd9zv   1/1     Running   0          3s
[root@k8s-master ~]# kubectl rollout history deployment webcluster
deployment.apps/webcluster
REVISION  CHANGE-CAUSE
1         <none>


[root@k8s-master ~]# kubectl expose deployment webcluster --port 80 --target-port 80 --type NodePort

[root@k8s-master ~]# kubectl get svc
NAME         TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)        AGE
kubernetes   ClusterIP   10.96.0.1    <none>        443/TCP        24h
webcluster   NodePort    10.99.3.32   <none>        80:30713/TCP   2m54s


[Administrator.DESKTOP-VJ307M3] ➤ curl http://172.25.254.100:30713/hostname.html
webcluster-77c87d9946-2xl44

2.更新业务版本

bash 复制代码
[root@k8s-master ~]# kubectl set image deployments webcluster myapp=myapp:v2
deployment.apps/webcluster image updated
[root@k8s-master ~]# kubectl annotate deployment webcluster kubernetes.io/change-cause="myappv2" --overwrite			#为此次更新设定标签

[root@k8s-master ~]# kubectl get pods
NAME                          READY   STATUS    RESTARTS   AGE
webcluster-6c8b4bb9d7-hpxf7   1/1     Running   0          7s
webcluster-6c8b4bb9d7-kz46j   1/1     Running   0          8s
[root@k8s-master ~]# kubectl rollout history
daemonset    deployment   statefulset
[root@k8s-master ~]# kubectl rollout history deployment webcluster
deployment.apps/webcluster
REVISION  CHANGE-CAUSE
1         <none>
2         <none>

[2026-08-21 11:30.21]  ~
[Administrator.DESKTOP-VJ307M3] ➤ curl http://172.25.254.100:30713
Hello MyApp | Version: v2 | <a href="hostname.html">Pod Name</a>

3.版本回退

bash 复制代码
[root@k8s-master ~]# kubectl rollout history deployment webcluster
deployment.apps/webcluster
REVISION  CHANGE-CAUSE
2         <none>
3         <none>

[root@k8s-master ~]# kubectl rollout undo deployment webcluster --to-revision 3
deployment.apps/webcluster rolled back

[Administrator.DESKTOP-VJ307M3] ➤ curl http://172.25.254.100:30713
Hello MyApp | Version: v1 | <a href="hostname.html">Pod Name</a>

四.利用yaml文件声明资源

  1. Pod 运行多容器

一个 Pod 可以写多个containers数组,共享网络、存储,但是容器相互隔离

bash 复制代码
spec:
  containers:
  - name: nginx
    image: nginx
  - name: busybox
    image: busybox
  1. Pod 暴露端口
bash 复制代码
spec:
  containers:
  - name: nginx
    image: nginx
    ports:
    - containerPort: 80
  1. Pod 指定环境变量 env
bash 复制代码
spec:
  containers:
  - name: nginx
    image: nginx
    env:
    - name: "TEST_ENV"
      value: "hello"
  1. 选择运行节点 nodeSelector
bash 复制代码
spec:
  nodeSelector:
    disk: ssd   # 节点需要打对应标签
  1. 共享宿主机网络 hostNetwork: true
bash 复制代码
spec:
  hostNetwork: true
  containers:
  - name: nginx
    image: nginx
  1. QoS 资源优先级(3 种)
QoS 类别 条件 优先级
Guaranteed 每个容器 requests.cpu/memory = limits.cpu/memory 最高,OOM 最后被杀
Burstable 设置了 requests,requests ≠ limits 中等
BestEffort 完全不写 requests、limits 资源配置 最低,内存不足最先被 OOM 杀死
  1. 容器重启策略 restartPolicy

  2. Always:无论容器正常退出 / 异常崩溃,永远重启(Deployment 默认)

  3. OnFailure:只有异常退出(返回码≠0)才重启;正常退出不重启

  4. Never :不管成功失败,绝不重启(一次性任务,Job 使用)

五.pod的生命周期

1.init容器

bash 复制代码
[root@k8s-master pod]# kubectl run  webserver --image myapp:v1 --dry-run=client -o yaml > init-example.yml
[root@k8s-master pod]# vim init-example.yml
apiVersion: v1
kind: Pod
metadata:
  labels:
    run: webserver
  name: webserver
spec:
  initContainers:
  - name: busybox
    image: busybox:latest
    command:
    - /bin/sh
    - -c
    - "until test -e /testfile;do echo wating for myservice; sleep 2;done"
  containers:
  - image: myapp:v1
    name: webserver
  restartPolicy: Always


[root@k8s-master pod]# watch -n 1 kubectl get pods  -o wide

[root@k8s-master pod]# kubectl apply -f init-example.yml
pod/webserver created

[root@k8s-master pod]# kubectl exec -it pods/webserver -c busybox -- /bin/sh
/ #
/ # touch /testfile

Livness存活探针

bash 复制代码
[root@k8s-master pod]# kubectl run  testpod --image  myapp:v1  --dry-run=client -o yaml > livness-example.yaml
[root@k8s-master pod]# vim livness-example.yaml
apiVersion: v1
kind: Pod
metadata:
  labels:
    run: webserver
  name: webserver
spec:
  containers:
  - image: myapp:v1
    name: webserver
    command: ["/bin/sh", "-c"]
    args:
    - |
      nginx -g "daemon off;"
      sleep 10000
  restartPolicy: Always

[root@k8s-master pod]# kubectl apply -f livness-example.yaml

#监控程序
[root@k8s-master pod]# watch -n 1 kubectl get pods  -o wide

#测试操作:
[root@k8s-master pod]# kubectl exec  -it  pods/webserver -c webserver  -- /bin/sh
# nginx -s stop

#查看pod的状态仍然是runing,但是访问此pod时访问失败
[root@k8s-node2 ~]# curl 10.244.5.47
curl: (7) Failed to connect to 10.244.5.47 port 80: 拒绝连接

2.存活探针livness

bash 复制代码
[root@k8s-master pod]# kubectl delete -f livness-example.yaml  --force
kind: Pod
metadata:
  labels:
    run: webserver
  name: webserver
spec:
  containers:
  - image: myapp:v1
    name: testpod
    command: ["/bin/sh", "-c"]
    args:
    - |
      nginx -g "daemon off;"
      sleep 10000
    livenessProbe:
      tcpSocket:
        port: 80
      initialDelaySeconds: 3
      periodSeconds: 1
      timeoutSeconds: 1
  restartPolicy: Always


[root@k8s-master pod]# kubectl get pods  -o wide  -w

[root@k8s-master pod]#  kubectl exec -it pods/webserver -c webserver -- /bin/sh
/ #  nginx -s stop
2026/08/23 03:59:45 [notice] 15#15: signal process started

/ # exit
[root@k8s-master pod]# curl 10.244.5.66
curl: (7) Failed to connect to 10.244.5.66 port 80: 拒绝连接
[root@k8s-master pod]# curl 10.244.5.66
curl: (7) Failed to connect to 10.244.5.66 port 80: 拒绝连接
[root@k8s-master pod]# curl 10.244.5.66
curl: (7) Failed to connect to 10.244.5.66 port 80: 拒绝连接
[root@k8s-master pod]# curl 10.244.5.66
curl: (7) Failed to connect to 10.244.5.66 port 80: 拒绝连接
[root@k8s-master pod]# curl 10.244.5.66
Hello MyApp | Version: v1 | <a href="hostname.html">Pod Name</a>

3.readness 就绪探针

没有就绪探针情况

bash 复制代码
[root@k8s-master pod]# vim readness-example.yml
apiVersion: v1
kind: Pod
metadata:
  labels:
    run: webserver
  name: webserver
spec:
  containers:
  - image: myapp:v1
    name: webserver
  restartPolicy: Always

---
apiVersion: v1
kind: Service
metadata:
  labels:
    run: webserver
  name: webserver
spec:
  ports:
  - port: 80
    protocol: TCP
    targetPort: 80
  selector:
    run: webserver

[root@k8s-master pod]# kubectl apply -f readness-example.yml
pod/webserver unchanged
service/webserver created
[root@k8s-master pod]# kubectl describe  svc webserver
Name:                     webserver
Namespace:                default
Labels:                   run=webserver
Annotations:              <none>
Selector:                 run=webserver
Type:                     ClusterIP
IP Family Policy:         SingleStack
IP Families:              IPv4
IP:                       10.102.162.217
IPs:                      10.102.162.217
Port:                     <unset>  80/TCP
TargetPort:               80/TCP
Endpoints:                10.244.5.67:80
Session Affinity:         None
Internal Traffic Policy:  Cluster
Events:                   <none>

#删除默认发布文件
[root@k8s-master ~]# kubectl exec -it pods/webserver -c webserver -- /bin/sh
/ # cd /usr/share/nginx/
/usr/share/nginx # ls
html
/usr/share/nginx # cd html/
/usr/share/nginx/html # ls
50x.html    index.html
/usr/share/nginx/html # rm -fr index.html
/usr/share/nginx/html # ls
50x.html
/usr/share/nginx/html #

#验证是否在访问service时endpoints中被下架
[root@k8s-master pod]# kubectl describe  svc webserver
Name:                     webserver
Namespace:                default
Labels:                   run=webserver
Annotations:              <none>
Selector:                 run=webserver
Type:                     ClusterIP
IP Family Policy:         SingleStack
IP Families:              IPv4
IP:                       10.102.162.217
IPs:                      10.102.162.217
Port:                     <unset>  80/TCP
TargetPort:               80/TCP
Endpoints:                10.244.5.67:80			#还在
Session Affinity:         None
Internal Traffic Policy:  Cluster
Events:                   <none>


#业务问题
[root@k8s-master pod]# curl  10.102.162.217
<html>
<head><title>403 Forbidden</title></head>
<body bgcolor="white">
<center><h1>403 Forbidden</h1></center>
<hr><center>nginx/1.12.2</center>
</body>
</html>

有就绪探针情况

bash 复制代码
[root@k8s-master pod]# vim readness-example.yml
apiVersion: v1
kind: Pod
metadata:
  labels:
    run: webserver
  name: webserver
spec:
  containers:
  - image: myapp:v1
    name: webserver
    readinessProbe:
      httpGet:
        path: /index.html
        port: 80
      initialDelaySeconds: 3
      periodSeconds: 2
      timeoutSeconds: 1
  restartPolicy: Always
---
apiVersion: v1
kind: Service
metadata:
  labels:
    run: webserver
  name: webserver
spec:
  ports:
  - port: 80
    protocol: TCP
    targetPort: 80
  selector:
    run: webserver


[root@k8s-master pod]# kubectl get pods  -o wide
NAME        READY   STATUS    RESTARTS   AGE   IP            NODE        NOMINATED NODE   READINESS GATES
webserver   1/1     Running   0          7s    10.244.5.69   k8s-node2   <none>           <none>
[root@k8s-master pod]# kubectl describe  svc webserver
Name:                     webserver
Namespace:                default
Labels:                   run=webserver
Annotations:              <none>
Selector:                 run=webserver
Type:                     ClusterIP
IP Family Policy:         SingleStack
IP Families:              IPv4
IP:                       10.110.248.237
IPs:                      10.110.248.237
Port:                     <unset>  80/TCP
TargetPort:               80/TCP
Endpoints:                10.244.5.69:80
Session Affinity:         None
Internal Traffic Policy:  Cluster
Events:                   <none>


#复现问题
/usr/share/nginx/html # command terminated with exit code 137
[root@k8s-master ~]#
/ # rm -fr /usr/share/nginx/html/index.html
/ # echo timinglee > /usr/share/nginx/html/index.html
相关推荐
Yiiz.1 小时前
Kubernetes Pod 与控制器知识点
云原生·容器·kubernetes
qetfw1 小时前
Debian Samba 与 OpenLDAP 统一认证配置
linux·debian
初願致夕霞2 小时前
《为什么公网访问不了内网?正向代理、内网穿透与 NAT 打洞一次说清》
linux·网络·tcp/ip·智能路由器
高磊20052 小时前
Kubernetes Pod 管理实战详解
linux·容器·kubernetes
喜欢吃燃面2 小时前
Linux网络编程深度解析:从Socket API到自定义协议设计
linux·网络·arm开发
流星白龙2 小时前
【Docker】9.Docker 镜像仓库实战
运维·docker·容器
想要成为老金高手2 小时前
Kubernetes 实战笔记(一):Pod 管理与 kubectl 核心命令全解
笔记·容器·kubernetes
张洛闻Eren2 小时前
云原生k8s【第六课】:K8s 访问控制
运维·docker·云原生·容器·kubernetes·k8s
Kina_C2 小时前
Kubernetes Pod 全生命周期管理:从命令实操到控制器版本更替
云原生·容器·kubernetes