文章目录

  • 工作负载
  • pod定义
  • pod分类
  • 关系
  • 静态pod
  • 控制器管理的pod
  • 镜像拉取策略
  • pod常用命令
  • 创建pod
  • 查看pod
  • 删除pod
  • 删除单个pod
  • 删除多个pod
  • pod的标签命令
  • 查看pod标签
  • 设置标签
  • 通过命令行设置标签
  • 通过yaml文件设置标签
  • 查询标签
  • 通过等值关系查看标签
  • 通过集合关系查看标签
  • 删除pod标签
  • pod内部镜像操作命令
  • 不用交互直接操作名
  • 和容器交互操作
  • Pod资源限制
  • 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
  • 使用yaml创建指定pod
  • 创建pod文件,例如pod.yaml
apiVersion: v1
kind: Pod
metadata:
  name: nginx1
spec:
  containers:
  - name: nginx
    image: nginx
  • 使用yaml文件创建pod
kubectl create -f pod.yaml
pod/nginx1 created
  • 查看pod
kubectl get pod|grep nginx1
nginx1   1/1     Running   0          2m10s
  • 使用yaml创建pod时可以使用creat或者apply
  • apply:使用apply时,如果pod已存在相当于执行更新操作
kubectl apply -f pod.yaml 
pod/nginx1 configured
  • create:使用create时,如果pod已存在会直接报错
kubectl create -f pod.yaml 
Error from server (AlreadyExists): error when creating "pod.yaml": pods "nginx1" already exists

查看pod

  • pod是一种计算资源,可以通过kubectl get pod来查看
kubectl get pod 
NAME   READY   STATUS    RESTARTS   AGE
pod    1/1     Running   0          21s
  • pod或pods都可以,不指定namespace,默认是名为default的namespace
kubectl get pod -n default
NAME   READY   STATUS    RESTARTS   AGE
pod    1/1     Running   0          28s
  • 查看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>
  • 描述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

删除pod

删除单个pod

  • 命令行直接删除
kubectl delete pod nginx
pod "nginx" deleted
  • 使用yaml资源清单文件删除
kubectl delete -f pod.yaml 
pod "nginx1" deleted
  • 删除某个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.

删除多个pod

  • 命令行删除,后面直接跟多个要删除的pod名称
  • 使用awk过滤删除
kubectl get pod |awk 'NR >1 {print $1}' |xargs kubectl delete pod 
pod "nginx1" deleted
pod "nginx2" deleted
  • 删除某个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>

设置标签

通过命令行设置标签
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
通过yaml文件设置标签
  • yaml清单文件
apiVersion: v1
kind: Pod
metadata:
  name: nginx2
  labels:
    env: dev
    zone: A
spec:
  containers:
    - name: nginx
      image: nginx
  • 验证
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

查询标签

通过等值关系查看标签
kubectl get pod -l env=dev
NAME     READY   STATUS    RESTARTS   AGE
nginx2   1/1     Running   0          3m10s
通过集合关系查看标签
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

删除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

pod内部镜像操作命令

不用交互直接操作名
  • 命令格式:kubectl exec pod名 -c 容器名 -- 命令
  • 不指定容器名,则默认为pod里的第1个容器
kubectl exec nginx1 -- date
Fri Aug 19 10:52:50 UTC 2022
和容器交互操作
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:/#

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秒后释放

Pod中多个容器网络共享

  • 编写yaml文件
apiVersion: v1
kind: Pod
metadata:
  name: pod-share-network
spec:
  containers:
    - name: c1
      image: nginx
    - name: c2
      image: nginx
      imagePullPolicy: IfNotPresent
  • 运行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