Pod基本操作

1、运行一个pod

$ k run pod-demo --image=nginx:1.21.6

说明:如果不指定ns,则默认为default

查看pod状态,正常为running

$ k get po

2、从已知Pod导出YAML文件

 $ k get po pod-demo -o yaml  > pod-demo.yaml

3、使用YAML创建pod

$ vim ngx-pod.yaml
apiVersion: v1
kind: Pod
metadata:
  name: ngx-pod
  namespace: aming
  labels:  ## labels字段非常关键,它可以添加任意数量的Key-Value,目的是为了让pod的信息更加详细
    env: dev

spec:  ##用来定义该pod更多的资源信息,比如containers, volume, storage
  containers:  ##定义容器属性
  - image: nginx:1.23.2
    imagePullPolicy: IfNotPresent  ##镜像拉取策略,三种:Always/Never/IfNotPresent,一般默认是IfNotPresent,也就是说只有本地不存在才会远程拉取镜像,可以减少网络消耗。
    name: ngx
    env:  ##定义变量,类似于Dockerfile里面的ENV指令
      - name: os
        value: "Rocky Linux"
    ports:
    - containerPort: 80

$ k apply -f ngx-pod.yaml

4、删除pod

$ k delete -f ngx-pod.yaml

除了通过yaml文件进行删除外,也可以通过delete命令进行删除

$ k delete po ngx-pod

5、强制删除Pod

$ k delete po ngx-pod --grace-period=0 --force

默认情况下,所有的删除操作都会附有 30 秒钟的宽限期限。 kubectl delete 命令支持 --grace-period=<seconds> 选项,允许你重载默认值, 设定自己希望的期限值。

将宽限期限强制设置为 0 意味着立即从 API 服务器删除 Pod。 如果 Pod 仍然运行于某节点上,强制删除操作会触发 kubelet 立即执行清理操作。

注意事项:马上删除时不等待确认正在运行的资源已被终止。这些资源可能会无限期地继续在集群上运行。

Pod原理

Pod 是在 K8s集群中运行部署应用或服务的最小单元。

在同一个Pod中其实可以同时运行多个容器,这些容器能够共享网络、存储以及 CPU/内存等资源。

每个Pod都有一个特殊的被称为 “根容器” 的Pause容器。Pause容器的主要作用是为Pod中的其他容器提供一些基本的功能,比如网络和PID命名空间的共享、 负责管理Pod内其他容器的生命周期。

  • 网络命名空间共享:pause容器为整个Pod创建一个网络命名空间,Pod内的其他容器都将加入这个网络命名空间。这样,Pod中的所有容器都可以共享同一个IP地址和端口空间,从而实现容器间的紧密通信。
  • PID命名空间共享:pause容器充当Pod内其他容器的父容器,它们共享同一个PID命名空间。这使得Pod内的容器可以通过进程ID直接发现和相互通信,同时也使得Pod具有一个统一的生命周期。
  • 生命周期管理:pause容器作为Pod中其他容器的父容器,负责协调和管理它们的生命周期。当pause容器启动时,它会成为Pod中其他容器的根容器。当pause容器终止时,所有其他容器也会被自动终止,确保了整个Pod的生命周期的一致性。
  • 保持Pod状态:pause容器保持运行状态,即使Pod中的其他容器暂时停止或崩溃,也可以确保Pod保持活跃。这有助于Kubernetes更准确地监视和管理Pod的状态。

Pod生命周期

Pod生命周期包括以下几个阶段:

  • Pending:在此阶段,Pod已被创建,但尚未调度到运行节点上。此时,Pod可能还在等待被调度,或者因为某些限制(如资源不足)而无法立即调度。
  • Running:在此阶段,Pod已被调度到一个节点,并创建了所有的容器。至少有一个容器正在运行,或者正在启动或重启。
  • Succeeded:在此阶段,Pod中的所有容器都已成功终止,并且不会再次重启。
  • Failed:在此阶段,Pod中的至少一个容器已经失败(退出码非零)。这意味着容器已经崩溃或以其他方式出错。
  • Unknown:在此阶段,Pod的状态无法由Kubernetes确定。这通常是因为与Pod所在节点的通信出现问题。

除了这些基本的生命周期阶段之外,还有一些更详细的容器状态,用于描述容器在Pod生命周期中的不同阶段:

  • ContainerCreating:容器正在创建,但尚未启动。
  • Terminating:容器正在终止,但尚未完成。
  • Terminated:容器已终止。
  • Waiting:容器处于等待状态,可能是因为它正在等待其他容器启动,或者因为它正在等待资源可用。
  • Completed:有一种Pod是一次性的,不需要一直运行,只要执行完就会是此状态。

创建Pod流程

创建Pod流程图如下:

创建Pod流程

  1. 用户通过kubectl或其他API客户端提交Pod对象给API server。
  2. API server尝试将Pod对象的相关信息存入etcd中,写入操作完成后API server会返回确认信息至客户端。
  3. API server开始反映etcd中的状态变化。
  4. 所有的Kubernetes组件均使用watch机制来跟踪检查API server上的相关变化。
  5. Kube-scheduler通过其watcher观察到API server创建了新的Pod对象但尚未绑定至任何节点。
  6. Kube-scheduler为Pod对象挑选一个工作节点并将结果更新至API server。
  7. 调度结果由API server更新至etcd,而且API server也开始反映此Pod对象的调度结果。
  8. Pod 被调度的目标工作节点上的kubelet尝试在当前节点上调用Containerd启动容器,并将容器的结果状态返回至API server。
  9. API server将Pod 状态信息存入etcd。
  10. 在etcd确认写操作完成后,API server将确认信息发送至相关的kubelet。

删除Pod流程

删除Pod流程

  1. 请求删除Pod。
  2. API server将Pod标记为Terminating状态。
  3. (与第 2 步同时进行)kubelet在监控到Pod对象转为Terminating状态的同时启动Pod关闭过程。
  4. (与第 2 步同时进行)Service将Endpoint摘除。
  5. 如果当前Pod对象定义了preStop hook,则在其标记为Terminating后会以同步的方式执行,宽限期开始计时。
  6. Pod中的容器进程收到TERM信号。
  7. 宽限期结束后,若进程仍在运行,会收到SIGKILL信号。
  8. kubelet请求API server将此Pod对象的宽限期设置为0,从而完成删除操作。

Pod资源限制

1)Resource Quota

资源配额Resource Quotas(简称quota)是对namespace进行资源配额,限制资源使用的一种策略。

K8S是一个多用户架构,当多用户或者团队共享一个K8S系统时,SA使用quota防止用户(基于namespace的)的资源抢占,定义好资源分配策略。

Quota应用在Namespace上,默认情况下,没有Resource Quota的,需要另外创建Quota,并且每个Namespace最多只能有一个Quota对象。

可限定资源类型:

计算资源:limits.cpu(最多能用多少cpu)、requests.cpu(最少能用多少cpu)、limits.memory(最多能用多少内存)、requests.memory(最少能用多少内存)

存储资源,包括存储资源的总量以及指定storage class的总量

requests.storage:存储资源总量,如500Gi

persistentvolumeclaims:pvc的个数

对象数,即可创建的对象的个数

pods, replicationcontrollers, configmaps, secrets,persistentvolumeclaims,services, services.loadbalancers,services.nodeports

注意:

Quota依赖于资源管理器,可以使用资源对象limits或者在创建资源对象时为pod设置资源限制(resources),如果不设置,资源对象无法创建。当该namespace中的任意个额度达到预设Quota时,将无法创建资源对象。只会达到最大预设值。

Resource Quota示例:

cat > quota.yaml <<EOF
apiVersion: v1
kind: ResourceQuota
metadata:
  namespace: aming
  name: aming-quota

spec:
  hard:
    pods: 50  ## 该命名空间里最多支持启动50个Pods
    requests.cpu: 0.5 ##最低保证0.5个CPU资源
    requests.memory: 512Mi ##最低保证512M内存
    limits.cpu: 5  ##最多使用5核CPU
    limits.memory: 16Gi ##最多使用16G内存
    configmaps: 20 ##最多支持20个configMaps
    persistentvolumeclaims: 20 ##最多支持20个pvc
    replicationcontrollers: 20 ##最多支持20个replicationControllers
    secrets: 20 ##最多支持20个secrets
    services: 50 ##最多支持50个services
EOF

下面进行示例演示说明:

1、定义quota,限制pod最大数为5

$ cat > quota.yaml <<EOF
apiVersion: v1
kind: ResourceQuota
metadata:
  namespace: aming
  name: aming-quota

spec:
  hard:
    pods: 5  ## 该命名空间里最多支持启动5个Pods
EOF

2、创建命名空间

$ k create ns aming

3、生效

$ k apply -f quota.yaml

4、查看

$ k get quota -n aming

NAME          AGE   REQUEST     LIMIT
aming-quota   55s   pods: 0/5

5、创建deployment,指定Pod副本为7,进行验证

$ k create deploy testdp --image=nginx:1.21.6 -n aming --replicas=7

6、查看deployment和pod,观察到因资源限制,所以只能创建5个

$ k get deploy,po -n aming

NAME                     READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/testdp   5/7     5            5           5m5s

NAME                          READY   STATUS    RESTARTS   AGE
pod/testdp-7c66644bf8-6lrzj   1/1     Running   0          5m5s
pod/testdp-7c66644bf8-6vkbb   1/1     Running   0          5m5s
pod/testdp-7c66644bf8-8b5sv   1/1     Running   0          5m5s
pod/testdp-7c66644bf8-gfjdf   1/1     Running   0          5m5s
pod/testdp-7c66644bf8-wp72m   1/1     Running   0          5m5s

7、验证完成后,恢复环境

$ k delete  deploy -n aming --all

2)Pod的limits和requests

Resource Quota是针对namespace下面所有的Pod的限制,而Pod自身也有限制。

下面进行示例演示说明:

1、定义quota,限制Pod CPU资源最多使用500m、限制内存资源最多使用2G、K8s要保证Pod使用的最小cpu资源为200m、K8s要保证Pod使用最小内存为512M

$ cat > quota-pod.yaml <<EOF
apiVersion: v1
kind: Pod
metadata:
  name: quota-pod
  namespace: aming

spec:
  containers:
  - image: nginx:1.21.6
    name: ngx
    imagePullPolicy: IfNotPresent
    ports:
    - containerPort: 80
    resources:
      limits:
        cpu: 0.5  ##限制Pod CPU资源最多使用500m,这里的0.5=500m,1=1000m
        memory: 2Gi ##限制内存资源最多使用2G
      requests:
        cpu: 200m  ##K8s要保证Pod使用的最小cpu资源为200m,如果node上资源满足不了,则不会调度到该node上
        memory: 512Mi ##K8s要保证Pod使用最小内存为512M,如果node上资源满足不了,则不会调度到该node上
EOF

2、创建命名空间

$ k create ns aming

3、生效

$ k apply -f quota-pod.yaml

4、查看

$ k describe po -n aming quota-pod

Pod的limits和requests