Skip to content

https://jimmysong.io/kubernetes-handbook/concepts/pod-overview.html

1. Pod操作

1.0 pod资源定义

yaml
# 必选,api版本号
apiVersion: v1
# 必选,类型为pod  
kind: pod 
# 必选,定义元数据
metadata: 
  # 必选,pod名称
  name: string 
  # pod所属的命名空间,默认在default的namespace
  namespace: string 
  # 自定义标签 
  lables: 
    # 自定义标签名字
    - name: string 
  # 自定义注释列表
  annotations: 
    - name: string 
# pod中容器的详细定义(期望)
spec: 
  # 通过nodeName调度到node1节点
  nodeName: node1
  # nodeSelector节点选择器 
  nodeSelector: 
    # 指定调度到标签为bussiness=game的节点
    bussiness: game 
  # 必选,pod中容器列表
  containers:
  # 必选,容器名称 
  - name: string 
    # 必选,容器的镜像名称
    image: string 
    # 获取镜像的策略,Alawys表示下载镜像,IfNotPresent表示优先使用本地镜像,否则下载镜像,Never表示仅使用本地镜像
    imagePullPolicy: [Always | Never | IfNotPresent] 
    # 容器的启动命令列表,如不指定,使用打包时使用的启动命令
    command: [string] 
    # 容器的启动命令参数列表
    args: [string] 
    # 容器的工作目录
    workingDir: string 
    # 挂载到容器内部的存储卷位置
    volumeMounts: 
    # 引用pod定义的共享存储卷的名称,需用volumes[]部分定义的卷名
    - name: string 
      # 存储卷在容器内mount的绝对路径,应少于512字符
      mountPath: string 
      # 是否为只读模式
      readOnly: boolean 
    # 需要暴露的端口号列表
    Ports: 
    # 端口号名称
    - name: string 
      # 容器需要监听的端口号
      containerPort: int 
      # 容器所在宿主机需要监听的端口号,默认与Container相同
      hostPort: int 
      # 端口协议,支持TCP和UDP,默认TCP
      protocol: string 
    # 容器运行前需设置的环境变量列表
    env: 
    # 环境变量名称
    - name: string 
      # 环境变量的值
      value: string
    # 资源限制和请求的设置 
    resources:  
      # 资源限制的设置
      limits: 
        # cpu的限制,单位为core数,将用于docker run --cpu-shares参数
        cpu: string 
        # 内存限制,单位可以为Mib/Gib,将用于docker run --memory参数
        memory: string 
      # 资源请求的限制
      requests: 
        # cpu请求,容器启动的初始可用数量
        cpu: string 
        # 内存请求,容器启动的初始可用数量
        memory: string 
    # 对Pod内个容器健康检查的设置,当探测无响应几次后将自动重启该容器,检查方法有exec、httpGet和tcpSocket,对一个容器只需设置其中一种方法即可
    livenessProbe: 
      # 对Pod容器内检查方式设置为exec方式
      exec: 
        # exec方式需要制定的命令或脚本
        command:  
          - cat 
          - /tmp/healthy
      # 对Pod内个容器健康检查方法设置为HttpGet,需要制定path、port
      httpGet: 
        path: string
        port: number
        host: string
        scheme: string
        HttpHeaders:
        - name: string
          value: string
      # 对Pod内个容器健康检查方式设置为tcpSocket方式
      tcpSocket: 
        port: number
        # 容器启动完成后首次探测的时间,单位为秒,pod启动延迟5秒后探测
        initialDelaySeconds: 0 
        # 对容器健康检查探测等待响应的超时时间,单位秒,默认1秒
        timeoutSeconds: 0 
        # 对容器监控检查的定期探测时间设置,单位秒,默认10秒一次
        periodSeconds: 0 
        successThreshold: 0
        failureThreshold: 0
        securityContext:
          privileged: false
    # Pod的重启策略,Always表示一旦不管以何种方式终止运行,kubelet都将重启,OnFailure表示只有Pod以非0退出码退出才重启,Never表示不再重启该Pod
    restartPolicy: [Always | Never | OnFailure] 
    # 设置NodeSelector表示将该Pod调度到包含这个label的node上,以key:value的格式指定
    nodeSelector: obeject  
    # pull镜像时使用的secret名称,以key:secretkey格式指定
    imagePullSecrets:
    - name: string
    # 是否使用主机网络模式,默认为false,如果设置为true,表示使用宿主机网络
    hostNetwork: false 
    # 在该pod上定义共享存储卷列表
    volumes: 
    # 共享存储卷名称 (volumes类型有很多种)
    - name: string 
      # 类型为emtyDir的存储卷,与Pod同生命周期的一个临时目录,为空值
      emptyDir: {} 
      # 类型为hostPath的存储卷,表示挂载Pod所在宿主机的目录
      hostPath: string  
        # Pod所在宿主机的目录,将被用于同期中mount的目录    
        path: string 
      # 类型为secret的存储卷,挂载集群与定义的secret对象到容器内部 
      secret: 
        scretname: string 
        items:    
        - key: string
          path: string
      # 类型为configMap的存储卷,挂载预定义的configMap对象到容器内部
      configMap: 
        name: string
        items:
        - key: string
          path: string
# 必选,api版本号
apiVersion: v1
# 必选,类型为pod  
kind: pod 
# 必选,定义元数据
metadata: 
  # 必选,pod名称
  name: string 
  # pod所属的命名空间,默认在default的namespace
  namespace: string 
  # 自定义标签 
  lables: 
    # 自定义标签名字
    - name: string 
  # 自定义注释列表
  annotations: 
    - name: string 
# pod中容器的详细定义(期望)
spec: 
  # 通过nodeName调度到node1节点
  nodeName: node1
  # nodeSelector节点选择器 
  nodeSelector: 
    # 指定调度到标签为bussiness=game的节点
    bussiness: game 
  # 必选,pod中容器列表
  containers:
  # 必选,容器名称 
  - name: string 
    # 必选,容器的镜像名称
    image: string 
    # 获取镜像的策略,Alawys表示下载镜像,IfNotPresent表示优先使用本地镜像,否则下载镜像,Never表示仅使用本地镜像
    imagePullPolicy: [Always | Never | IfNotPresent] 
    # 容器的启动命令列表,如不指定,使用打包时使用的启动命令
    command: [string] 
    # 容器的启动命令参数列表
    args: [string] 
    # 容器的工作目录
    workingDir: string 
    # 挂载到容器内部的存储卷位置
    volumeMounts: 
    # 引用pod定义的共享存储卷的名称,需用volumes[]部分定义的卷名
    - name: string 
      # 存储卷在容器内mount的绝对路径,应少于512字符
      mountPath: string 
      # 是否为只读模式
      readOnly: boolean 
    # 需要暴露的端口号列表
    Ports: 
    # 端口号名称
    - name: string 
      # 容器需要监听的端口号
      containerPort: int 
      # 容器所在宿主机需要监听的端口号,默认与Container相同
      hostPort: int 
      # 端口协议,支持TCP和UDP,默认TCP
      protocol: string 
    # 容器运行前需设置的环境变量列表
    env: 
    # 环境变量名称
    - name: string 
      # 环境变量的值
      value: string
    # 资源限制和请求的设置 
    resources:  
      # 资源限制的设置
      limits: 
        # cpu的限制,单位为core数,将用于docker run --cpu-shares参数
        cpu: string 
        # 内存限制,单位可以为Mib/Gib,将用于docker run --memory参数
        memory: string 
      # 资源请求的限制
      requests: 
        # cpu请求,容器启动的初始可用数量
        cpu: string 
        # 内存请求,容器启动的初始可用数量
        memory: string 
    # 对Pod内个容器健康检查的设置,当探测无响应几次后将自动重启该容器,检查方法有exec、httpGet和tcpSocket,对一个容器只需设置其中一种方法即可
    livenessProbe: 
      # 对Pod容器内检查方式设置为exec方式
      exec: 
        # exec方式需要制定的命令或脚本
        command:  
          - cat 
          - /tmp/healthy
      # 对Pod内个容器健康检查方法设置为HttpGet,需要制定path、port
      httpGet: 
        path: string
        port: number
        host: string
        scheme: string
        HttpHeaders:
        - name: string
          value: string
      # 对Pod内个容器健康检查方式设置为tcpSocket方式
      tcpSocket: 
        port: number
        # 容器启动完成后首次探测的时间,单位为秒,pod启动延迟5秒后探测
        initialDelaySeconds: 0 
        # 对容器健康检查探测等待响应的超时时间,单位秒,默认1秒
        timeoutSeconds: 0 
        # 对容器监控检查的定期探测时间设置,单位秒,默认10秒一次
        periodSeconds: 0 
        successThreshold: 0
        failureThreshold: 0
        securityContext:
          privileged: false
    # Pod的重启策略,Always表示一旦不管以何种方式终止运行,kubelet都将重启,OnFailure表示只有Pod以非0退出码退出才重启,Never表示不再重启该Pod
    restartPolicy: [Always | Never | OnFailure] 
    # 设置NodeSelector表示将该Pod调度到包含这个label的node上,以key:value的格式指定
    nodeSelector: obeject  
    # pull镜像时使用的secret名称,以key:secretkey格式指定
    imagePullSecrets:
    - name: string
    # 是否使用主机网络模式,默认为false,如果设置为true,表示使用宿主机网络
    hostNetwork: false 
    # 在该pod上定义共享存储卷列表
    volumes: 
    # 共享存储卷名称 (volumes类型有很多种)
    - name: string 
      # 类型为emtyDir的存储卷,与Pod同生命周期的一个临时目录,为空值
      emptyDir: {} 
      # 类型为hostPath的存储卷,表示挂载Pod所在宿主机的目录
      hostPath: string  
        # Pod所在宿主机的目录,将被用于同期中mount的目录    
        path: string 
      # 类型为secret的存储卷,挂载集群与定义的secret对象到容器内部 
      secret: 
        scretname: string 
        items:    
        - key: string
          path: string
      # 类型为configMap的存储卷,挂载预定义的configMap对象到容器内部
      configMap: 
        name: string
        items:
        - key: string
          path: string

1.1 查看

  • 查看帮助文档
bash
kubectl explain namespace
kubectl explain service.kind
kubectl explain service.metadata
kubectl explain pod.spec.containers
kubectl explain namespace
kubectl explain service.kind
kubectl explain service.metadata
kubectl explain pod.spec.containers

1. 查看pod运行节点

-o wide ,可以查看ip和运行节点

shell
[root@kube-master ~]# kubectl get pod -n kube-system -o wide |grep master
NAME                                       READY   STATUS             RESTARTS         AGE     IP               NODE           NOMINATED NODE   READINESS GATES
calico-node-hbkgs                          1/1     Running            1 (35m ago)      3h48m   10.103.236.201   k8s-master01   <none>          <none>
etcd-k8s-master01                          1/1     Running            1 (35m ago)      5h34m   10.103.236.201   k8s-master01   <none>          <none>
kube-apiserver-k8s-master01                1/1     Running            1 (35m ago)      5h34m   10.103.236.201   k8s-master01   <none>          <none>
kube-controller-manager-k8s-master01       1/1     Running            1 (35m ago)      5h34m   10.103.236.201   k8s-master01   <none>          <none>
kube-proxy-8z6lf                           1/1     Running            1 (35m ago)      5h34m   10.103.236.201   k8s-master01   <none>          <none>
kube-scheduler-k8s-master01                1/1     Running            1 (35m ago)      5h34m   10.103.236.201   k8s-master01   <none>          <none>
[root@kube-master ~]# kubectl get pod -n kube-system -o wide |grep master
NAME                                       READY   STATUS             RESTARTS         AGE     IP               NODE           NOMINATED NODE   READINESS GATES
calico-node-hbkgs                          1/1     Running            1 (35m ago)      3h48m   10.103.236.201   k8s-master01   <none>          <none>
etcd-k8s-master01                          1/1     Running            1 (35m ago)      5h34m   10.103.236.201   k8s-master01   <none>          <none>
kube-apiserver-k8s-master01                1/1     Running            1 (35m ago)      5h34m   10.103.236.201   k8s-master01   <none>          <none>
kube-controller-manager-k8s-master01       1/1     Running            1 (35m ago)      5h34m   10.103.236.201   k8s-master01   <none>          <none>
kube-proxy-8z6lf                           1/1     Running            1 (35m ago)      5h34m   10.103.236.201   k8s-master01   <none>          <none>
kube-scheduler-k8s-master01                1/1     Running            1 (35m ago)      5h34m   10.103.236.201   k8s-master01   <none>          <none>

2. 查看pod详细信息

shell
#pod以宿主机的ip网段启动的原因,在clico中配置了, hostNetwork: true
[root@kube-master ~]# kubectl get pod calico-typha-67c6dc57d6-5627c -oyaml -n kube-system
#pod以宿主机的ip网段启动的原因,在clico中配置了, hostNetwork: true
[root@kube-master ~]# kubectl get pod calico-typha-67c6dc57d6-5627c -oyaml -n kube-system
bash
kubectl get pods -o wide -n kube-public 
# 查看标签
kubectl get node -n kube-public --show-labels  

# 查看详细信息
kubectl describe pod 查看容器名 

# 以yaml形式查看
kubectl get pod 查看容器名 -o yaml 

# 查看容器日志
kubectl logs -f 容器名 

# 查看哪些pod在使用此标签
kubectl get pod -l app=my-nginx2 -n kube-public 
kubectl get endpoints --show-labels
kubectl get pods -o wide -n kube-public 
# 查看标签
kubectl get node -n kube-public --show-labels  

# 查看详细信息
kubectl describe pod 查看容器名 

# 以yaml形式查看
kubectl get pod 查看容器名 -o yaml 

# 查看容器日志
kubectl logs -f 容器名 

# 查看哪些pod在使用此标签
kubectl get pod -l app=my-nginx2 -n kube-public 
kubectl get endpoints --show-labels

1.2 交互Pod

shell
[root@kube-master ~]# kubectl exec -it pod_name -- /bin/bash
root@nginx-6799fc88d8-49dd6:/#
[root@kube-master ~]# kubectl exec -it pod_name -- /bin/bash
root@nginx-6799fc88d8-49dd6:/#

1.3 查看Pod阶段

shell
kubectl describe pod <pod_name>
kubectl describe pod <pod_name>

1.4 删除pod

bash
kubectl delete pod pod-name
kubectl delete pod pod-name

1.5 修改pod

bash
kubectl edit pod 查看容器名
kubectl edit pod 查看容器名

2. Deployment操作

2.1 创建

shell
[root@kube-master ~]# kubectl create deployment deployapp --image=nginx --replicas=3
deployment.apps/deployapp created
[root@kube-master ~]# kubectl create deployment deployapp --image=nginx --replicas=3
deployment.apps/deployapp created

2.2 查看

shell
[root@kube-master ~]# kubectl get pod
NAME                         READY   STATUS    RESTARTS      AGE
deployapp-7749464894-grrds   1/1     Running   0             3m1s
deployapp-7749464894-jb2xx   1/1     Running   0             3m1s
deployapp-7749464894-nhq4w   1/1     Running   0             3m1s

#查看pod的ip
[root@kube-master ~]# kubectl get pod -owide
NAME                         READY   STATUS    RESTARTS      AGE     IP              NODE          NOMINATED NODE   READINESS GATES
deployapp-7749464894-grrds   1/1     Running   0             3m8s    172.17.74.70    kube-node03   <none>           <none>
deployapp-7749464894-jb2xx   1/1     Running   0             3m8s    172.30.0.137    kube-node01   <none>           <none>
deployapp-7749464894-nhq4w   1/1     Running   0             3m8s    172.23.127.68   kube-node02   <none>           <none>
[root@kube-master ~]# kubectl get pod
NAME                         READY   STATUS    RESTARTS      AGE
deployapp-7749464894-grrds   1/1     Running   0             3m1s
deployapp-7749464894-jb2xx   1/1     Running   0             3m1s
deployapp-7749464894-nhq4w   1/1     Running   0             3m1s

#查看pod的ip
[root@kube-master ~]# kubectl get pod -owide
NAME                         READY   STATUS    RESTARTS      AGE     IP              NODE          NOMINATED NODE   READINESS GATES
deployapp-7749464894-grrds   1/1     Running   0             3m8s    172.17.74.70    kube-node03   <none>           <none>
deployapp-7749464894-jb2xx   1/1     Running   0             3m8s    172.30.0.137    kube-node01   <none>           <none>
deployapp-7749464894-nhq4w   1/1     Running   0             3m8s    172.23.127.68   kube-node02   <none>           <none>

2.3 扩展Pod副本

shell
#扩展,从3到5
kubectl scale deployment deployapp --replicas=5

#查看
[root@kube-master ~]# kubectl get pod
NAME                         READY   STATUS    RESTARTS      AGE
deployapp-7749464894-dkp72   1/1     Running   0             87s
deployapp-7749464894-grrds   1/1     Running   0             6m22s
deployapp-7749464894-jb2xx   1/1     Running   0             6m22s
deployapp-7749464894-nhq4w   1/1     Running   0             6m22s
deployapp-7749464894-wdbw9   1/1     Running   0             87s
#扩展,从3到5
kubectl scale deployment deployapp --replicas=5

#查看
[root@kube-master ~]# kubectl get pod
NAME                         READY   STATUS    RESTARTS      AGE
deployapp-7749464894-dkp72   1/1     Running   0             87s
deployapp-7749464894-grrds   1/1     Running   0             6m22s
deployapp-7749464894-jb2xx   1/1     Running   0             6m22s
deployapp-7749464894-nhq4w   1/1     Running   0             6m22s
deployapp-7749464894-wdbw9   1/1     Running   0             87s

2.4 缩减Pod副本

shell
kubectl scale deployment deployapp --replicas=3
kubectl scale deployment deployapp --replicas=3

2.5 发布应用

通过Service将应用发布出来,而后集群中的应用就可以通过ServiceIP或域名来访问该复制均衡

shell
--port: 集群内访问service的端口

--target-port: pod容器提供的端口

kubectl expose deployment deployapp --port=8888 --target-port=80

#查看service
[root@kube-master ~]# kubectl get svc
NAME         TYPE        CLUSTER-IP        EXTERNAL-IP   PORT(S)          AGE
deployapp    ClusterIP   192.168.132.134   <none>        8888/TCP         111s
kubernetes   ClusterIP   192.168.0.1       <none>        443/TCP          29h
nginx        NodePort    192.168.253.94    <none>        8080:32498/TCP   6h51m
--port: 集群内访问service的端口

--target-port: pod容器提供的端口

kubectl expose deployment deployapp --port=8888 --target-port=80

#查看service
[root@kube-master ~]# kubectl get svc
NAME         TYPE        CLUSTER-IP        EXTERNAL-IP   PORT(S)          AGE
deployapp    ClusterIP   192.168.132.134   <none>        8888/TCP         111s
kubernetes   ClusterIP   192.168.0.1       <none>        443/TCP          29h
nginx        NodePort    192.168.253.94    <none>        8080:32498/TCP   6h51m

2.6 创建流程

1.kubectl发送部署请求到API Server

2.API Server通知Controller Manager创建一个deployment资源

3.Scheduler执行调度任务,将三个副本Pod分别发到node节点

4.node节点上的kubectl在各自的节点上创建并运行Pod

5.API Server通知ControllerManger,调用ServiceController创建一个Service资源

6.kube-proxy Watch到Service资源创建,而后在本地节点创建对应负载均衡规则

7.CoreDNS Watch到Service资源创建,为其创建DNS解析记录,可以在内部通过dns进行访问

注解,

1.应用的配置和当前状态信息保存在etcd中,执行kubectl get pod时API Server会从etcd中读取这些数据

2.网络插件calico会为每个Pod都分配IP,可以实现跨节点通信,而无需NAT地址转换

image-20240411232310722

3. Pod Logs

3.1 崩溃前日志

  • 单容器
shell
kubectl logs pod-name --previous
kubectl logs pod-name --previous
  • 多容器
shell
kubectl logs pod-name --previous -c container-name
kubectl logs pod-name --previous -c container-name

4. 优雅关闭Pod

yaml
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
  labels:
    app: nginx
spec:
  replicas: 2
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:1.15
        ports:
        - containerPort: 80
        lifecycle:
          preStop:
            exec:
              command: [
                # Gracefully shutdown nginx
                "sleep 5 && /usr/sbin/nginx -s quit",
              ]
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
  labels:
    app: nginx
spec:
  replicas: 2
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:1.15
        ports:
        - containerPort: 80
        lifecycle:
          preStop:
            exec:
              command: [
                # Gracefully shutdown nginx
                "sleep 5 && /usr/sbin/nginx -s quit",
              ]

5. Pod查看pid

bash
kubectl describe pod  <podName>   -n  <namespace>
或者是登录对应节点 通过如下命令查询
#节点是dockerd运行时
1. docker ps  | grep   <podName>
2. docker inspect <容器id>   | grep -i pid
3. 或者使用这个命令:docker inspect <容器id> --format '{{.State.Pid}}'


#节点是containerd运行时
1. crictl pods | grep <pod>,取第1列为pod_id
2. crictl ps   | grep <pod_id>,取第1列为容器id
3. crictl inspect <容器id> | grep -i pid ,取第1行为容器pid
kubectl describe pod  <podName>   -n  <namespace>
或者是登录对应节点 通过如下命令查询
#节点是dockerd运行时
1. docker ps  | grep   <podName>
2. docker inspect <容器id>   | grep -i pid
3. 或者使用这个命令:docker inspect <容器id> --format '{{.State.Pid}}'


#节点是containerd运行时
1. crictl pods | grep <pod>,取第1列为pod_id
2. crictl ps   | grep <pod_id>,取第1列为容器id
3. crictl inspect <容器id> | grep -i pid ,取第1行为容器pid