• k8s核心概念pod 基本定义和命令


    工作负载

    • 工作负载是在k8s集群中运行的应用程序,无论工作负载是单一服务还是集群构成,在k8s中都可以使用pod来运行它。

    pod定义

    • pod是k8s集群管理与调度的最小计算单元,表示处于运行状态的一组容器
    • pod不是进程,只是容器运行的环境
    • 一个pod可以封装任意个容器
    • 一个pod内的容器共享部分命令空间,例如:Net Namespace、IPC Namespace、UTS Namespace
    • 用户pod默认会被调度运行在node节点上(不运行在master节点上,但是也有例外)
    • pod内的IP不是固定的,集群外不能直接访问pod

    pod分类

    关系

    • workloads分为静态pod控制器管理的pod
    • pod通过控制器实现应用的运行、伸缩、升级等操作
    • controller在集群中管理pod
    • pod与controller之间通过label-selector进行关联,且是唯一的关联方式

    静态pod

    • 也称为无控制器管理的pod
    • 直接由特定节点上的 kubelet 守护进程管理, 不需要API 服务器看到它们
    • 尽管大多数 Pod 都是通过控制面(例如,Deployment) 来管理的,对于静态 Pod 而言,kubelet 直接监控每个 Pod,并在其失效时重启之。

    控制器管理的pod

    • 控制器可以控制pod的副本数,扩容与裁剪,版本更新与回滚等

    镜像拉取策略

    由imagePullPolicy参数控制

    • Always : 不管本地有没有镜像,都要从仓库中下载镜像
    • Never : 从来不从仓库下载镜像, 只用本地镜像,本地没有就算了
    • IfNotPresent: 如果本地存在就直接使用, 不存在才从仓库下载

    默认的策略是:

    • 当镜像标签版本是latest,默认策略就是Always
    • 如果指定特定版本默认拉取策略就是IfNotPresent。

    pod常用命令

    创建pod

    • 直接使用命令行创建pod,不推荐,测试自己玩玩就行
    # 创建
    kubectl run nginx --image=nginx
    pod/nginx created
    # 查看
    kubectl get pod                
    NAME    READY   STATUS              RESTARTS   AGE
    nginx   0/1     ContainerCreating   0          13s
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 使用yaml创建指定pod
      • 创建pod文件,例如pod.yaml
    apiVersion: v1
    kind: Pod
    metadata:
      name: nginx1
    spec:
      containers:
      - name: nginx
        image: nginx
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 使用yaml文件创建pod
    kubectl create -f pod.yaml
    pod/nginx1 created
    
    • 1
    • 2
    • 查看pod
    kubectl get pod|grep nginx1
    nginx1   1/1     Running   0          2m10s
    
    • 1
    • 2
    • 使用yaml创建pod时可以使用creat或者apply
      • apply:使用apply时,如果pod已存在相当于执行更新操作
    kubectl apply -f pod.yaml 
    pod/nginx1 configured
    
    • 1
    • 2
    • create:使用create时,如果pod已存在会直接报错
    kubectl create -f pod.yaml 
    Error from server (AlreadyExists): error when creating "pod.yaml": pods "nginx1" already exists
    
    • 1
    • 2

    查看pod

    • pod是一种计算资源,可以通过kubectl get pod来查看
    kubectl get pod 
    NAME   READY   STATUS    RESTARTS   AGE
    pod    1/1     Running   0          21s
    
    • 1
    • 2
    • 3
    • pod或pods都可以,不指定namespace,默认是名为default的namespace
    kubectl get pod -n default
    NAME   READY   STATUS    RESTARTS   AGE
    pod    1/1     Running   0          28s
    
    • 1
    • 2
    • 3
    • 查看pod详细信息-o wide
    kubectl get pod -o wide   
    NAME   READY   STATUS    RESTARTS   AGE   IP           NODE             NOMINATED NODE   READINESS GATES
    pod    1/1     Running   0          38s   10.1.0.114   docker-desktop   <none>           <none>
    
    • 1
    • 2
    • 3
    • 描述pod详细信息
    kubectl describe pod pod-stress [-n namespace  pod在非默认空间时需要指定pod所在的namespace]
    Name:         pod-stress   # pod名称
    Namespace:    default      # 所在命名空间
    Priority:     0   # 优先级
    Node:         docker-desktop/192.168.65.4    # 所在节点
    Start Time:   Fri, 19 Aug 2022 11:24:15 +0800   # 创建时间
    Labels:       <none>    # 标签
    Annotations:  <none>    # 标签描述
    Status:       Running   # pod状态
    IP:           10.1.0.109   # Pod IP地址
    IPs:        # IP地址
      IP:  10.1.0.109
    Containers: # Pod中的容器信息
      c1:    # c1容器
        Container ID:  docker://b80d5e7b88cc207978da99ef508c0772a60ac693d94c0a59cd12266d6883aa57    # 容器ID
        Image:         polinux/stress      # 镜像名
        Image ID:      docker-pullable://polinux/stress@sha256:b6144f84f9c15dac80deb48d3a646b55c7043ab1d83ea0a697c09097aaad21aa   # 镜像ID
        Port:          <none>  # 端口
        Host Port:     <none>  # 主机端口
        Command:      # 启动命令
          stress
        Args:      # 启动参数
          --vm     # CPU数
          1
          --vm-bytes  # 内存数
          100
          --vm-hang   # 进程数
          1
        State:          Running      # 容器状态
          Started:      Fri, 19 Aug 2022 11:24:33 +0800   # 容器启动时间
        Ready:          True   # 是否就绪
        Restart Count:  0   # 容器重启次数
        Environment:    <none> # 环境变量
        Mounts:    # 绑定位置
          /var/run/secrets/kubernetes.io/serviceaccount from kube-api-access-sqkts (ro)
    Conditions:
      Type              Status
      Initialized       True   # 初始化是否完成
      Ready             True      # 是否ready
      ContainersReady   True   # 容器是否ready
      PodScheduled      True   # pod调度
    Volumes:    
      kube-api-access-sqkts:
        Type:                    Projected (a volume that contains injected data from multiple sources)
        TokenExpirationSeconds:  3607
        ConfigMapName:           kube-root-ca.crt
        ConfigMapOptional:       <nil>
        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  102s  default-scheduler  Successfully assigned default/pod-stress to k8s-worker1
      Normal  Pulling    102s  kubelet            Pulling image "polinux/stress"
      Normal  Pulled     83s   kubelet            Successfully pulled image "polinux/stress" in 18.944533343s
      Normal  Created    83s   kubelet            Created container c1
      Normal  Started    82s   kubelet            Started container c1
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60

    删除pod

    删除单个pod

    • 命令行直接删除
    kubectl delete pod nginx
    pod "nginx" deleted
    
    • 1
    • 2
    • 使用yaml资源清单文件删除
    kubectl delete -f pod.yaml 
    pod "nginx1" deleted
    
    • 1
    • 2
    • 删除某个namespace会直接删除该命名空间下所有的pod
    # 查看test空间下pod
    kubectl get pod -n test
    NAME     READY   STATUS    RESTARTS   AGE
    nginx1   1/1     Running   0          16m
    nginx2   1/1     Running   0          16m
    # 删除test空间
    kubectl delete ns test
    namespace "test" deleted
    # 查看test空间下pod
    kubectl get pod -n test
    No resources found in test namespace.
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    删除多个pod

    • 命令行删除,后面直接跟多个要删除的pod名称
    • 使用awk过滤删除
    kubectl get pod |awk 'NR >1 {print $1}' |xargs kubectl delete pod 
    pod "nginx1" deleted
    pod "nginx2" deleted
    
    • 1
    • 2
    • 3
    • 删除某个namespace会直接删除该命名空间下所有的pod

    pod的标签命令

    • 为pod设置标签,便于控制器通过label和pod进行关联
    • 可以将标签理解成SQL中的查询条件

    查看pod标签

    kubectl get pod --show-labels
    NAME     READY   STATUS              RESTARTS   AGE   LABELS
    nginx1   0/1     ContainerCreating   0          2s    <none>
    
    • 1
    • 2
    • 3

    设置标签

    通过命令行设置标签
    kubectl label pod nginx1 env=test zone=beijing
    pod/nginx1 labeled
    kubectl get pod --show-labels                 
    NAME     READY   STATUS    RESTARTS   AGE   LABELS
    nginx1   1/1     Running   0          72s   env=test,zone=beijing
    
    • 1
    • 2
    • 3
    • 4
    • 5
    通过yaml文件设置标签
    • yaml清单文件
    apiVersion: v1
    kind: Pod
    metadata:
      name: nginx2
      labels:
        env: dev
        zone: A
    spec:
      containers:
        - name: nginx
          image: nginx
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 验证
    kubectl get pod --show-labels
    NAME     READY   STATUS    RESTARTS   AGE     LABELS
    nginx1   1/1     Running   0          4m29s   env=test,zone=beijing
    nginx2   1/1     Running   0          46s     env=dev,zone=A
    
    • 1
    • 2
    • 3
    • 4

    查询标签

    通过等值关系查看标签
    kubectl get pod -l env=dev
    NAME     READY   STATUS    RESTARTS   AGE
    nginx2   1/1     Running   0          3m10s
    
    • 1
    • 2
    • 3
    通过集合关系查看标签
    kubectl get pod -l "env in(dev,test,prod)"
    NAME     READY   STATUS    RESTARTS   AGE
    nginx1   1/1     Running   0          7m31s
    nginx2   1/1     Running   0          3m48s
    
    • 1
    • 2
    • 3
    • 4

    删除pod标签

    kubectl label pod nginx1 env- zone-
    pod/nginx1 labeled
    
    kubectl get pod --show-labels
    NAME     READY   STATUS    RESTARTS   AGE     LABELS
    nginx1   1/1     Running   0          8m59s   <none>
    nginx2   1/1     Running   0          5m16s   env=dev,zone=A
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    pod内部镜像操作命令

    不用交互直接操作名
    • 命令格式:kubectl exec pod名 -c 容器名 -- 命令
    • 不指定容器名,则默认为pod里的第1个容器
    kubectl exec nginx1 -- date
    Fri Aug 19 10:52:50 UTC 2022
    
    • 1
    • 2
    和容器交互操作
    kubectl exec -it nginx1 -c nginx -- /bin/bash
    root@nginx1:/# ls
    bin  boot  dev  docker-entrypoint.d  docker-entrypoint.sh  etc  home  lib  lib64  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var
    root@nginx1:/# 
    
    • 1
    • 2
    • 3
    • 4

    Pod资源限制

    apiVersion: v1
    kind: Namespace
    metadata:
      name: namespace1
    ---
    apiVersion: v1
    kind: Pod
    metadata:
      name: pod-stress2
      namespace: namespace1
    spec:
      containers:
      - name: c1
        image: polinux/stress
        imagePullPolicy: IfNotPresent
        resources:
          limits:
            memory: "200Mi"
          requests:
            memory: "100Mi"
        command: ["stress"]                    # 启动容器时执行的命令
        args: ["--vm", "1", "--vm-bytes", "150M", "--vm-hang", "1"]  # 产生1个进程分配150M内存1秒后释放
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22

    Pod中多个容器网络共享

    • 编写yaml文件
    apiVersion: v1
    kind: Pod
    metadata:
      name: pod-share-network
    spec:
      containers:
        - name: c1
          image: nginx
        - name: c2
          image: nginx
          imagePullPolicy: IfNotPresent
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 运行yaml文件
      ···shell
      kubectl apply -f share_network.yaml
      pod/pod-share-network created
    * 查看
    ```shell
    kubectl get pod                       
    NAME                READY   STATUS             RESTARTS   AGE
    pod-share-network   1/2     CrashLoopBackOff   13         44m
    
    • 1
    • 2
    • 3
    • 4
    • 5
  • 相关阅读:
    (附源码)springboot通用数据展示系统 毕业设计 200934
    【函数式编程】Optional接口
    【第93题】JAVA高级技术-网络编程12(简易聊天室7:使用Socket传递对象)
    USB CDC类
    【解决】设置pip安装依赖包路径默认路径在conda路径下,而不是C盘路径下
    实战:3D目标检测与跟踪PointPillar+CenterPoint+SimpleTrack(论文+代码 上篇)
    「九章云极DataCanvas」完成C+轮融资, 用云中云战略引领数据智能基础软件升级
    学成在线第二天-查询课程、查询课程分类、新增课程接口实现以及跨域的处理思路和全局异常处理的使用以及面试题
    Parcel配置public静态文件目录
    云原生超融合八大核心能力|ZStack Edge云原生超融合产品技术解读
  • 原文地址:https://blog.csdn.net/double_happiness/article/details/126427792