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

创建命名空间

bash 复制代码
[root@k8s-master ~]# kubectl get namespaces timinglee
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

删除命名空间

bash 复制代码
[root@k8s-master ~]# kubectl delete namespaces  timinglee
namespace "timinglee" deleted

2.pod管理

查看pod的运行情况和在哪里运行

bash 复制代码
[root@k8s-master ~]# kubectl get pods  -o wide
No resources found in default namespace.

创建pod

bash 复制代码
[root@k8s-master ~]# kubectl run  lee --image nginx:latest
pod/lee created
bash 复制代码
[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创建出现问题

bash 复制代码
[root@k8s-master ~]# kubectl run  error --image lee:v1
bash 复制代码
[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运行的详细信息

bash 复制代码
[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"
  

删除

bash 复制代码
[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.生成实验所需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

2.kubectl命令使用方法

create

命令式创建资源,只做新建。如果同名资源已经存在,直接报错AlreadyExists

bash 复制代码
[root@k8s-master ~]# kubectl create deployment webcluster --replicas 2 --image myapp:v1
deployment.apps/webcluster created
bash 复制代码
[root@k8s-master ~]# kubectl get deployments.apps
NAME         READY   UP-TO-DATE   AVAILABLE   AGE
webcluster   2/2     2            2           15s
bash 复制代码
[root@k8s-master ~]# kubectl get pods
NAME                          READY   STATUS    RESTARTS   AGE
webcluster-77c87d9946-28thm   1/1     Running   0          24s
webcluster-77c87d9946-vwrsq   1/1     Running   0          24s
bash 复制代码
[root@k8s-master ~]# kubectl delete deployments.apps webcluster
deployment.apps "webcluster" deleted from default namespace
bash 复制代码
[root@k8s-master ~]# kubectl get pods
No resources found in default namespace.

edit

直接在线编辑集群中正在运行的资源

会把资源的 yaml 打开在系统编辑器(默认 vi/vim),修改保存退出后,K8s 会实时更新该资源

bash 复制代码
[root@k8s-master ~]# kubectl create deployment webcluster --image myapp:v1
bash 复制代码
[root@k8s-master ~]# kubectl get pods
NAME                          READY   STATUS    RESTARTS   AGE
webcluster-77c87d9946-2cgr7   1/1     Running   0          36s
bash 复制代码
[root@k8s-master ~]# kubectl edit deployments.apps webcluster
  replicas: 2
bash 复制代码
[root@k8s-master ~]# kubectl get pods
NAME                          READY   STATUS    RESTARTS   AGE
webcluster-77c87d9946-2cgr7   1/1     Running   0          36s
webcluster-77c87d9946-2wqn7   1/1     Running   0          103s

patch

局部打补丁更新资源,只修改指定的一小段字段,不需要写完整 yaml

bash 复制代码
[root@k8s-master ~]# kubectl patch deployments.apps webcluster -p '{"spec":{"replicas":1}}'
deployment.apps/webcluster patched
bash 复制代码
[root@k8s-master ~]# kubectl get pods
NAME                          READY   STATUS    RESTARTS   AGE
webcluster-77c87d9946-2wqn7   1/1     Running   0          6m20s

expose

快速把Deployment、Pod、ReplicaSet暴露成 Service,命令式创建 Service,不用手写 yaml

bash 复制代码
[root@k8s-master ~]# kubectl expose deployment webcluster --port  80 --target-port 80
service/webcluster exposed
bash 复制代码
[root@k8s-master ~]# kubectl get service
NAME         TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)   AGE
kubernetes   ClusterIP   10.96.0.1      <none>        443/TCP   6h
webcluster   ClusterIP   10.97.61.108   <none>        80/TCP    18s
bash 复制代码
[root@k8s-master ~]# kubectl describe  svc webcluster
Name:                     webcluster
Namespace:                default
Labels:                   app=webcluster
Annotations:              <none>
Selector:                 app=webcluster
Type:                     ClusterIP
IP Family Policy:         SingleStack
IP Families:              IPv4
IP:                       10.97.61.108
IPs:                      10.97.61.108
Port:                     <unset>  80/TCP
TargetPort:               80/TCP
Endpoints:                10.244.1.11:80,10.244.5.10:80,10.244.5.9:80 + 1 more...
Session Affinity:         None
Internal Traffic Policy:  Cluster
Events:                   <none>
bash 复制代码
[root@k8s-master ~]# curl 10.97.61.108/hostname.html
webcluster-77c87d9946-gh9v7
[root@k8s-master ~]# curl 10.97.61.108/hostname.html
webcluster-77c87d9946-gh9v7
[root@k8s-master ~]# curl 10.97.61.108/hostname.html
webcluster-77c87d9946-m69wl
[root@k8s-master ~]# curl 10.97.61.108/hostname.html
webcluster-77c87d9946-4p4mz
[root@k8s-master ~]# curl 10.97.61.108/hostname.html
webcluster-77c87d9946-2wqn7

logs

查看 Pod 容器输出的日志,排查 Pod 报错最核心命令

bash 复制代码
[root@k8s-master ~]# kubectl logs pods/webcluster-77c87d9946-gh9v7
10.244.0.0 - - [20/Aug/2026:08:43:52 +0000] "GET /hostname.html HTTP/1.1" 200 28 "-" "curl/7.76.1" "-"
10.244.0.0 - - [20/Aug/2026:08:43:52 +0000] "GET /hostname.html HTTP/1.1" 200 28 "-" "curl/7.76.1" "-"

attach

附着到 Pod 里正在运行的容器,连接容器的标准输入输出

对接容器主进程本身,不创建新进程

bash 复制代码
[root@k8s-master ~]# kubectl run -it testpod --image busybox:latest
All commands and output from this session will be recorded in container logs, including credentials and sensitive information passed through the command prompt.
If you don't see a command prompt, try pressing enter.
/ #
/ #
/ #  <ctrl+pq>
bash 复制代码
[root@k8s-master ~]# kubectl get pods
NAME                          READY   STATUS    RESTARTS   AGE
testpod                       1/1     Running   0          55s
bash 复制代码
[root@k8s-master ~]# kubectl attach pods/testpod -it
All commands and output from this session will be recorded in container logs, including credentials and sensitive information passed through the command prompt.
If you don't see a command prompt, try pressing enter.
/ #
/ #
/ #

exec

在已经运行的 Pod 容器内部执行新进程 / 命令

bash 复制代码
[root@k8s-master ~]# kubectl run  testpod --image  nginx:latest
bash 复制代码
[root@k8s-master ~]# kubectl get pods
NAME      READY   STATUS    RESTARTS   AGE
testpod   1/1     Running   0          4s
bash 复制代码
[root@k8s-master ~]# kubectl exec -it pods/testpod -c testpod -- /bin/bash
root@testpod:/#

cp

本地机器 ↔ Pod 容器之间拷贝文件,类似 Linux 的scp

bash 复制代码
[root@k8s-master ~]# kubectl cp  testpod:/usr/share/nginx/html/index.html  /mnt/test
tar: Removing leading `/' from member names
bash 复制代码
[root@k8s-master ~]# kubectl cp  testpod:/usr/share/nginx/html  /mnt/
tar: Removing leading `/' from member names
bash 复制代码
[root@k8s-master ~]# ls /mnt/
50x.html  docker.service  file1  hgfs  index.html  test
bash 复制代码
[root@k8s-master ~]# echo timinglee > /mnt/index.html
[root@k8s-master ~]# kubectl cp /mnt/index.html testpod:/usr/share/nginx/html/index.html
bash 复制代码
[root@k8s-master ~]# kubectl get pods  -o wide
NAME      READY   STATUS    RESTARTS   AGE    IP            NODE        NOMINATED NODE   READINESS GATES
testpod   1/1     Running   0          6m3s   10.244.1.12   k8s-node1   <none>           <none>
bash 复制代码
[root@k8s-master ~]# curl  10.244.1.12
timinglee

rollout

专门管理 Deployment、DaemonSet、StatefulSet 的版本发布、滚动更新、回滚

Pod、Service、Ingress 不支持 rollout

bash 复制代码
[root@k8s-master pod]# kubectl create deployment webcluster --image myapp:v1 --replicas 2 --dry-run=client -o yaml > webcluster.yml
bash 复制代码
[root@k8s-master pod]# 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
bash 复制代码
[root@k8s-master pod]# kubectl apply -f webcluster.yml
deployment.apps/webcluster created
[root@k8s-master pod]# kubectl get deployments.apps
NAME         READY   UP-TO-DATE   AVAILABLE   AGE
webcluster   2/2     2            2           7s
[root@k8s-master pod]# kubectl get pods
NAME                          READY   STATUS    RESTARTS   AGE
webcluster-77c87d9946-5qbxt   1/1     Running   0          16s
webcluster-77c87d9946-95b2g   1/1     Running   0          16s
bash 复制代码
[root@k8s-master pod]# kubectl rollout status  deployment webcluster
deployment "webcluster" successfully rolled out

deployment.apps/webcluster resumed
bash 复制代码
[root@k8s-master pod]# kubectl rollout  restart   deployment webcluster
deployment.apps/webcluster restarted
[root@k8s-master pod]# kubectl get pods
NAME                          READY   STATUS    RESTARTS   AGE
webcluster-7bfd865747-jmhwl   1/1     Running   0          6s
webcluster-7bfd865747-qv2xt   1/1     Running   0          8s
bash 复制代码
[root@k8s-master pod]# kubectl rollout  restart   deployment webcluster
deployment.apps/webcluster restarted
[root@k8s-master pod]# kubectl get pods
NAME                          READY   STATUS              RESTARTS   AGE
webcluster-7bfd865747-jmhwl   1/1     Running             0          19s
webcluster-7bfd865747-qv2xt   0/1     Completed           0          21s
webcluster-9787d97f6-z7xv5    1/1     Running             0          1s
webcluster-9787d97f6-zl6q2    0/1     ContainerCreating   0          0s

scale

命令式调整副本数 replicas

只修改副本数量,不会触发滚动更新,不会新增 rollout 历史 revision

bash 复制代码
[root@k8s-master pod]# kubectl scale deployment webcluster --replicas 4
deployment.apps/webcluster scaled
bash 复制代码
[root@k8s-master pod]# kubectl get pods
NAME                         READY   STATUS    RESTARTS   AGE
webcluster-9787d97f6-bh796   1/1     Running   0          2s
webcluster-9787d97f6-bh8jd   1/1     Running   0          2s
webcluster-9787d97f6-z7xv5   1/1     Running   0          89s
webcluster-9787d97f6-zl6q2   1/1     Running   0          88s
bash 复制代码
[root@k8s-master pod]# kubectl scale deployment webcluster --replicas 1
deployment.apps/webcluster scaled
bash 复制代码
[root@k8s-master pod]# kubectl get pods
NAME                         READY   STATUS    RESTARTS   AGE
webcluster-9787d97f6-zl6q2   1/1     Running   0          93s

label

给 K8s 资源打标签 label,标签是 key‑value 键值对,用于筛选、匹配

bash 复制代码
[root@k8s-master pod]# kubectl label pods webcluster-9787d97f6-zl6q2 app=webcluster
pod/webcluster-9787d97f6-zl6q2 labeled
bash 复制代码
[root@k8s-master pod]# kubectl get pods  --show-labels
NAME                         READY   STATUS    RESTARTS   AGE     LABELS
webcluster-9787d97f6-zl6q2   1/1     Running   0          6m57s   app=webcluster,pod-template-hash=9787d97f6

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

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
bash 复制代码
[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
bash 复制代码
[root@k8s-master ~]# kubectl apply -f webcluster.yml
deployment.apps/webcluster created
bash 复制代码
[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
bash 复制代码
[root@k8s-master ~]# kubectl rollout history deployment webcluster
deployment.apps/webcluster
REVISION  CHANGE-CAUSE
1         <none>
bash 复制代码
[root@k8s-master ~]# kubectl expose deployment webcluster --port 80 --target-port 80 --type NodePort
bash 复制代码
[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
bash 复制代码
[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
bash 复制代码
[root@k8s-master ~]# kubectl annotate deployment webcluster kubernetes.io/change-cause="myappv2" --overwrite			#为此次更新设定标签
bash 复制代码
[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
bash 复制代码
[root@k8s-master ~]# kubectl rollout history deployment webcluster
deployment.apps/webcluster
REVISION  CHANGE-CAUSE
1         <none>
2         <none>
bash 复制代码
[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>
bash 复制代码
[root@k8s-master ~]# kubectl rollout undo deployment webcluster --to-revision 3
deployment.apps/webcluster rolled back
bash 复制代码
[Administrator.DESKTOP-VJ307M3] ➤ curl http://172.25.254.100:30713
Hello MyApp | Version: v1 | <a href="hostname.html">Pod Name</a>

四、利用yaml文件声明资源

1.在pod中运行多容器

bash 复制代码
[root@k8s-master ~]# kubectl run  testpod --image  myapp:v1  --dry-run=client -o yaml > testpod.yaml
bash 复制代码
[root@k8s-master ~]# vim testpod.yaml
apiVersion: v1
kind: Pod
metadata:
  labels:
    run: testpod
  name: testpod
spec:
  containers:
  - image: myapp:v1
    name: myapp1
  - image: busyboxplus:latest
    name: busybox
    command:
    - /bin/sh
    - -c
    - sleep 10000
bash 复制代码
[root@k8s-master ~]# kubectl apply -f testpod.yaml
[root@k8s-master ~]# kubectl get pods
NAME      READY   STATUS    RESTARTS   AGE
testpod   2/2     Running   0          2m41s
bash 复制代码
[root@k8s-master ~]# kubectl exec -it pods/testpod -c busybox -- /bin/sh
/ # curl  127.0.0.1
Hello MyApp | Version: v1 | <a href="hostname.html">Pod Name</a>

2.在pod运行主机中暴露端口

bash 复制代码
[root@k8s-master pod]# vim testpod.yaml
apiVersion: v1
kind: Pod
metadata:
  labels:
    run: testpod
  name: testpod
spec:
  containers:
  - image: myapp:v1
    name: myapp1
    ports:
    - name: http
      containerPort: 80			#pod内部容器端口
      hostPort: 80				#pod所在节点端口
      protocol: TCP				#端口所用协议
bash 复制代码
[root@k8s-master pod]# kubectl apply -f testpod.yaml
root@k8s-master pod]# kubectl get pods   -o wide
NAME      READY   STATUS    RESTARTS   AGE     IP            NODE        NOMINATED NODE   READINESS GATES
testpod   1/1     Running   0          3m33s   10.244.5.43   k8s-node2   <none>           <none>
bash 复制代码
[root@k8s-master pod]# curl  k8s-node2
Hello MyApp | Version: v1 | <a href="hostname.html">Pod Name</a>

3.在pod主机中指定变量

bash 复制代码
[root@k8s-master pod]# vim mysql.yml
apiVersion: v1
kind: Pod
metadata:
  labels:
    run: mysql
  name: mysql
spec:
  containers:
  - image: mysql:8.0
    name: mysql8
    env:
    - name: MYSQL_ROOT_PASSWORD
      value: lee

  - image: phpmyadmin:latest
    name: mysqladmin
    env:
    - name: PMA_ARBITRARY
      value: "1"
    ports:
    - name: phpadminport
      containerPort: 80
      hostPort: 80
      protocol: TCP
bash 复制代码
[root@k8s-master pod]# kubectl apply -f mysql.yml
[root@k8s-master pod]# kubectl get pods  -o wide
NAME    READY   STATUS    RESTARTS   AGE   IP            NODE        NOMINATED NODE   READINESS GATES
mysql   2/2     Running   0          36s   10.244.1.44   k8s-node1   <none>           <none>

在浏览器中访问 node下面看到的主机ip

4.选择运行节点

bash 复制代码
[root@k8s-master ~]# kubectl get nodes --show-labels
NAME         STATUS   ROLES           AGE   VERSION   LABELS
k8s-master   Ready    control-plane   29h   v1.35.7   beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/arch=amd64,kubernetes.io/hostname=k8s-master,kubernetes.io/os=linux,node-role.kubernetes.io/control-plane=,node.kubernetes.io/exclude-from-external-load-balancers=
k8s-node1    Ready    <none>          29h   v1.35.7   beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/arch=amd64,kubernetes.io/hostname=k8s-node1,kubernetes.io/os=linux
k8s-node2    Ready    <none>          24h   v1.35.7   beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/arch=amd64,kubernetes.io/hostname=k8s-node2,kubernetes.io/os=linux
bash 复制代码
[root@k8s-master pod]# vim mysql.yml
apiVersion: v1
kind: Pod
metadata:
  labels:
    run: mysql
  name: mysql
spec:
  nodeSelector:
    kubernetes.io/hostname: k8s-node2
  containers:
  - image: mysql:8.0
    name: mysql8
    env:
    - name: MYSQL_ROOT_PASSWORD
      value: lee

  - image: phpmyadmin:latest
    name: mysqladmin
    env:
    - name: PMA_ARBITRARY
      value: "1"
    ports:
    - name: phpadminport
      containerPort: 80
      hostPort: 80
      protocol: TCP
bash 复制代码
[root@k8s-master pod]# kubectl apply -f mysql.yml
pod/mysql created
[root@k8s-master pod]# kubectl get pods  -o wide
NAME    READY   STATUS              RESTARTS   AGE   IP       NODE        NOMINATED NODE   READINESS GATES
mysql   0/2     ContainerCreating   0          11s   <none>   k8s-node2   <none>           <none>

5.共享宿主机网络

bash 复制代码
[root@k8s-master pod]# vim testpod.yaml
apiVersion: v1
kind: Pod
metadata:
  labels:
    run: testpod
  name: testpod
spec:
  hostNetwork: true
  containers:
  - image: busybox:latest
    name: busybox
    command:
    - /bin/sh
    - -c
    - sleep 10000
bash 复制代码
[root@k8s-master pod]# kubectl apply -f testpod.yaml
[root@k8s-master pod]# kubectl exec -it pods/testpod -c busybox -- /bin/sh
/ # ifconfig
cni0      Link encap:Ethernet  HWaddr 16:CB:58:6A:2A:5D
          inet addr:10.244.5.1  Bcast:10.244.5.255  Mask:255.255.255.0
          inet6 addr: fe80::d8df:1aff:fecb:258d/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1450  Metric:1
          RX packets:581 errors:0 dropped:0 overruns:0 frame:0
          TX packets:223 errors:0 dropped:1 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:40865 (39.9 KiB)  TX bytes:17252 (16.8 KiB)

docker0   Link encap:Ethernet  HWaddr 0E:46:B9:8F:F4:B1
          inet addr:172.17.0.1  Bcast:172.17.255.255  Mask:255.255.0.0
          UP BROADCAST MULTICAST  MTU:1500  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:3 overruns:0 carrier:0
          collisions:0 txqueuelen:0
          RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)

eth0      Link encap:Ethernet  HWaddr 00:0C:29:E9:E3:90
          inet addr:172.25.254.20  Bcast:172.25.254.255  Mask:255.255.255.0
          inet6 addr: fe80::dfb0:1fb2:dde4:e5e7/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:753787 errors:0 dropped:0 overruns:0 frame:0
          TX packets:44359 errors:0 dropped:1 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:1100617086 (1.0 GiB)  TX bytes:5635916 (5.3 MiB)

flannel.1 Link encap:Ethernet  HWaddr DE:5A:26:1C:E5:A0
          inet addr:10.244.5.0  Bcast:0.0.0.0  Mask:255.255.255.255
          inet6 addr: fe80::dc5a:26ff:fe1c:e5a0/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1450  Metric:1
          RX packets:144 errors:0 dropped:0 overruns:0 frame:0
          TX packets:110 errors:0 dropped:22 overruns:0 carrier:0
          collisions:0 txqueuelen:0
          RX bytes:8836 (8.6 KiB)  TX bytes:11091 (10.8 KiB)

lo        Link encap:Local Loopback
          inet addr:127.0.0.1  Mask:255.0.0.0
          inet6 addr: ::1/128 Scope:Host
          UP LOOPBACK RUNNING  MTU:65536  Metric:1
          RX packets:4503 errors:0 dropped:0 overruns:0 frame:0
          TX packets:4503 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:342298 (334.2 KiB)  TX bytes:342298 (334.2 KiB)

veth4d79cff0 Link encap:Ethernet  HWaddr 16:C9:7B:BB:BB:36
          inet6 addr: fe80::14c9:7bff:febb:bb36/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1450  Metric:1
          RX packets:16 errors:0 dropped:0 overruns:0 frame:0
          TX packets:82 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0
          RX bytes:1172 (1.1 KiB)  TX bytes:6448 (6.2 KiB)

/ #

6.资源优先级

BestEffort没有做任何资源限制,资源使用优先级最低

bash 复制代码
[root@k8s-master pod]# vim testpod.yaml
apiVersion: v1
kind: Pod
metadata:
  labels:
    run: testpod
  name: testpod
spec:
  hostNetwork: true
  containers:
  - image: busybox:latest
    name: busybox
    command:
    - /bin/sh
    - -c
    - sleep 10000
apiVersion: v1
kind: Pod
metadata:
  labels:
    run: testpod
  name: testpod
spec:
  hostNetwork: true
  containers:
  - image: busybox:latest
    name: busybox
    command:
    - /bin/sh
    - -c
    - sleep 10000
bash 复制代码
[root@k8s-master pod]# kubectl describe pods  testpod  | grep "QoS Class:"
QoS Class:                   BestEffort

Burstable 设定了资源限制,但是期望值和限制值不同,资源使用优先级次之

bash 复制代码
[root@k8s-master pod]# vim testpod.yaml
apiVersion: v1
kind: Pod
metadata:
  labels:
    run: testpod
  name: testpod
spec:
  hostNetwork: true
  containers:
  - image: busybox:latest
    name: busybox
    command:
    - /bin/sh
    - -c
    - sleep 10000
apiVersion: v1
kind: Pod
metadata:
  labels:
    run: testpod
  name: testpod
spec:
  hostNetwork: true
  containers:
  - image: busybox:latest
    name: busybox
    command:
    - /bin/sh
    - -c
    - sleep 10000
	resources:
      limits:
        cpu: 700m
        memory: 200M
      requests:
        cpu: 500m
        memory: 100M
bash 复制代码
[root@k8s-master pod]# kubectl apply -f testpod.yaml
pod/testpod unchanged

[root@k8s-master pod]# kubectl describe pods  testpod  | grep "QoS Class:"
QoS Class:                   Burstable

Guaranteed期望值和最大使用限制相同,优先级最高

bash 复制代码
[root@k8s-master pod]# vim testpod.yaml
apiVersion: v1
kind: Pod
metadata:
  labels:
    run: testpod
  name: testpod
spec:
  hostNetwork: true
  containers:
  - image: busybox:latest
    name: busybox
    command:
    - /bin/sh
    - -c
    - sleep 10000
apiVersion: v1
kind: Pod
metadata:
  labels:
    run: testpod
  name: testpod
spec:
  hostNetwork: true
  containers:
  - image: busybox:latest
    name: busybox
    command:
    - /bin/sh
    - -c
    - sleep 10000
	resources:
      limits:
        cpu: 500m
        memory: 100M
      requests:
        cpu: 500m
        memory: 100M
bash 复制代码
[root@k8s-master pod]# kubectl apply -f testpod.yaml
pod/testpod created
[root@k8s-master pod]# kubectl describe pods  testpod  | grep "QoS Class:"
QoS Class:                   Guaranteed

7.容器重启规则

Always 无论什么原因都会重新运行pod

bash 复制代码
apiVersion: v1
kind: Pod
metadata:
  labels:
    run: testpod
  name: testpod
spec:
  hostNetwork: true
  restartPolicy: Always
  containers:
  - image: busybox:latest
    name: busybox
    command:
    - /bin/sh
    - -c
    - sleep 60

删除一个pod会重新运行一个新的pod

OnFailure 非正常关闭会重启pod

bash 复制代码
apiVersion: v1
kind: Pod
metadata:
  labels:
    run: testpod
  name: testpod
spec:
  hostNetwork: true
  restartPolicy: OnFailure
  containers:
  - image: busybox:latest
    name: busybox
    command:
    - /bin/sh
    - -c
    - sleep 30

在pod运行节点上删除pod,会重启pod

等待30秒后容器中命令运行完成后不会重启pod

Never pod关闭后不重启

bash 复制代码
apiVersion: v1
kind: Pod
metadata:
  labels:
    run: testpod
  name: testpod
spec:
  hostNetwork: true
  restartPolicy: OnFailure
  containers:
  - image: busybox:latest
    name: busybox
    command:
    - /bin/sh
    - -c
    - sleep 30

五、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
bash 复制代码
[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

init容器启动后才运行后续容器

2.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
bash 复制代码
[root@k8s-master pod]# kubectl apply -f livness-example.yaml

测试操作

bash 复制代码
[root@k8s-master pod]# kubectl exec  -it  pods/webserver -c webserver  -- /bin/sh
# nginx -s stop

查看pod的状态仍然是runing,但是访问此pod时访问失败

bash 复制代码
[root@k8s-node2 ~]# curl 10.244.5.47
curl: (7) Failed to connect to 10.244.5.47 port 80: 拒绝连接

有存活探针时

bash 复制代码
apiVersion: v1
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
bash 复制代码
[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
bash 复制代码
[root@k8s-master pod]# curl 10.244.5.66
curl: (7) Failed to connect to 10.244.5.66 port 80: 拒绝连接

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
bash 复制代码
[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>

删除默认发布文件

bash 复制代码
[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中被下架

bash 复制代码
[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>

业务问题

bash 复制代码
[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
bash 复制代码
[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>

复现问题

bash 复制代码
/ # rm -fr /usr/share/nginx/html/index.html

恢复

bash 复制代码
/ # echo timinglee > /usr/share/nginx/html/index.html
/ #
相关推荐
志栋智能1 小时前
迈向真正的超自动化巡检
运维·自动化
荣合技术服务1 小时前
电脑多,单个加域麻烦?下载此AD域加域助手,批量加域速度快
运维·服务器·ad域控
小王C语言2 小时前
云服务器重置后,vscode无法远程连接
运维·服务器
Doep_key2 小时前
Kubenetes控制器
运维·docker·容器
RoboWizard2 小时前
金士顿高性能存储 赋能工控行业多场景深度落地
运维·服务器
会飞的土拨鼠呀3 小时前
Linux 真实内存使用率的核心计算标准
linux·运维·服务器
小小谈电商3 小时前
2026 年 8 月|国内企业级商城源码服务商全方位测评报告
大数据·运维·小程序
hxhy004 小时前
异地组网实战:从 frp 中转到 Tailscale 直连,SSH 延迟 410ms → 29ms
运维·ssh
志栋智能4 小时前
从安全超自动化到超自动化安全的认知飞跃
运维·安全·自动化