侧边栏壁纸
博主头像
小周的知识站 博主等级

行动起来,活在当下

  • 累计撰写 80 篇文章
  • 累计创建 12 个标签
  • 累计收到 8 条评论

目 录CONTENT

文章目录
K8S

Pod控制器ReplicaSet

Administrator
2024-07-15 / 0 评论 / 0 点赞 / 4 阅读 / 0 字

Pod控制器 ReplicaSet

在K8S中,pod的创建方式分为两类:

静态Pod:也称之为无控制器管理的自主式Pod直接由特定节点上的Kubelet 守护进程管理,不需要API服务器看到它们,对于静态Pod而言,Kubelet 直接监控每个Pod,这种Pod删除之后就没有了,也不会重建。

控制器管理的Pod:控制器可以控制Pod的副本数,扩容和裁剪,版本更新与回滚等。

k8s的1.17之前版本中, kubectl run命令默认通过Deployment控制器创建Pod

在v1.18版本中, kubectl run命令改为创建静态pod

1 Pod 控制器概述

pod控制器是管理pod的中间层,使用了pod控制器之后,我们只需要告诉pod控制器,需要多少个什么样的pod就可以了,它就会创建出满足条件的pod,并确保每一个pod处于用户期望的状态,如果pod在运行中出现故障,控制器会基于指定的策略重新启动或重建pod

在k8s中,pod控制器的种类有很多,每种pod控制器的应用场景都不一样,常见的有下面这些:

  • ReplicationController:比较原始的pod控制器,目前已经被废弃,由ReplicaSet代替

  • ReplicaSet:保证指定数量的pod运行,并支持pod数量变更,镜像版本变更

  • Deployment:通过控制ReplicaSet来控制pod,包含ReplicaSet所有功能,还支持滚动升级,版本回退

  • Horizontal Pod Autoscaler:可以根据集群负载自动调整pod数量,实现pod容缩

  • DaemonSet: 确保全部(或者一些)Node 上运行一个 Pod 的副本,当有 Node 加入集群时,也会为他们新增一个 Pod ,当有 Node 从集群移除时,这些 Pod 也会被回收,删除 DaemonSet 将会删除它创建的所有 Pod

  • Job:它创建的pod只要完成就立即退出

    容器按照持续运行的时间可分为两类:服务类容器和工作类容器

    • 服务类容器通常持续提供服务,需要一直运行,比如 http serverdaemon

    • 工作类容器则是一次性任务,比如批处理程序,完成后容器就退出

  • Cronjob:它创建的pod会周期性的执行,用于执行周期性任务(常用在数据备份工作)

2 Pod 属性介绍

以下是对spec属性下常见的子属性介绍

  • containers #容器列表,用于定义容器的详细信息,这是pod配置中最关键的一项配置

  • nodeName #根据nodeName的值将pod调度到指定的Node节点上

  • nodeSelector #根据NodeSelector中定义的信息选择将该pod调度到包含这些label的Node节点

  • hostNetwork #是否使用主机网络模式,默认为false,如果设置为true,表示使用宿主机网络

  • volumes #存储卷,用于定义pod上面挂载的存储信息

  • restartPolicy #重启策略,表示pod在遇到故障时的处理策略

3 Pod 资源清单介绍

以下是比较详细的资源清单介绍
​
KIND:     Pod  #资源类型类型
VERSION:  v1   #资源版本
DESCRIPTION:   #资源描述
FIELDS:        #资源可配置的属性,如下
​
apiVersion: v1      #必选的一级属性,版本号,例如v1
kind: Pod           #必选的一级属性,资源类型,例如Pod
metadata:           #必选的一级属性,元数据
    name:           #必选的二级属性,Pod名称
    namespace: dev  #二级属性,Pod所属的名称空间,例如dev,默认为default名称空间
    labels:         #二级属性,自定义标签列表
     - name:        #三级属性,标签名称
spec:               #必选的一级属性,Pod中容器的详细定义
 containers:        #必选的二级属性,Pod中容器列表
 - name:            #必选的三级属性,容器名称
   image:           #必选的三级属性,容器镜像名称
   imagePullPolicy: #三级属性,镜像的拉取策略
   command:         #三级属性,容器的启动命令列表,如不指定,使用打包时使用的启动命令
   args:            #三级属性,容器的启动命令参数列表
   workingDir:      #三级属性,容器的工作目录
   volumeMounts:    #三级属性,挂载到容器内部的存储卷配置
   - name:          #四级属性,引用pod定义的共享存储卷的名称
     mountPath:     #四级属性,存储卷在容器内mount的绝对路径,应少于512字节
     readOnly:      #四级属性,是否为只读模式
   ports:           #三级属性,需要暴露的端口库号列表
   - name:          #四级属性,端口的名称
     containerPort: #四级属性,容器需要监听的端口号
     hostPort:      #四级属性,容器所在的主机需要监听的端口号,默认与Container相同
     protocol:      #四级属性,端口协议,支持TCP/UDP,默认为TCP
   env:             #三级属性,容器运行前需要设置的环境变量列表
   - name:          #四级属性,环境变量名称
     value:         #四级属性,环境变量的值
   resources:       #三级属性,资源限制和请求的设置        
     limits:        #四级属性,资源最大限制的设置
        CPU:        #五级属性,CPU资源限制,单位为core数,将用于docker run --cpu-shares参数
        memory:     #五级属性,内存资源限制,单位可以为Mib/Gib,将用于docker run --memory参数
     requests:      #四级属性,资源最小请求的设置
        CPU:        #五级属性,CPU请求,容器启动的初始可用数量
        memory:     #五级属性,内存请求,容器启动的初始可用数量
   lifecycle:       #三级属性,生命周期钩子
     postStart:     #四级属性,容器启动后立即执行此钩子,如果执行失败,会根据重启策略进行重启
     preStop:       #四级属性,容器终止前执行此钩子,无论结果如何,容器都会终止
   livenessProbe:   #三级属性,对Pod内个容器健康检查设置,当探测容器无响应后将自动重启该容器
   tcpSocket:       #三级属性,对Pod内容器健康检查方式
   initialDelaySeconds:     #三级属性,容器启动完成后,首次探测时间,单位为秒
   timeoutSeconds:          #三级属性,对容器健康检查探测等待相应的超时时间,单位秒,默认1秒
   periodSeconds:           #三级属性,对容器监控检查的定期探测时间设置,单位秒,默认10秒一次
 restartPolicy:     #二级属性,Pod的重启策略
 nodeName:          #二级属性,设置pod调度到指定的node节点上
 nodeSelector:      #二级属性,设置Pod调度到指定的label的node节点上
 imagePullSecrets:  #二级属性,拉取镜像时,使用secret名称,以key:secretkey格式指定
 hostNetwork:       #二级属性,是否使用主机网络模式,默认为false,如果设置为true,表示使用宿主机网络
 volumes:           #二级属性,在该Pod上定义共享存储卷列表
 - name:            #三级属性,共享存储卷名称
   emptyDir:        #三级属性,类型为emptyDir的存储卷,与Pod同生命周期的一个临时目录,为空值
   hostPath:        #三级属性,类型为hostPath的存储卷,挂载集群与定义的secret对象到容器内部
     path:          #四级属性,Pod所在宿主机的目录,将被用于容器中挂载的目录
   secret:          #三级属性,类型为secret的存储卷,挂载集群与定义的secret对象到容器内部
   configMap:       #三级属性,类型为configMap的存储卷,挂载预定义的configMap对象到容器内部
​

4 Pod containers属性介绍

通过下边命令可以获取containers支持的子属性

# kubectl explain pod.spec.containers
KIND:     Pod
VERSION:  v1
RESOURCE: containers    #容器列表,可以定义多个容器
FIELDS:
    name                #容器名称
    image               #容器镜像地址
    imagePullPolicy     #镜像拉取策略
    command             #容器启动的命令列表,如不指定,使用打包时使用的命令
    args                #容器启动的命令需要的参数列表
    env                 #容器环境变量的配置,类型
    ports               #容器需要暴露的端口号列表
    resources           #资源限制和资源请求的设置
​

5 Pod 控制器 ReplicaSet(RS)

ReplicaSet的主要作用是保证一定数量的pod能够正常的运行,它会持续监听这些pod的运行状态,一旦pod发生故障,就会重启或重建pod,同时还支持对pod数量的扩缩容和版本镜像的升级

ReplicaSet的资源清单文件查询方式

kubectl explain rs

kubectl explain rs.spec

kubectl explain rs.spec.selector

kubectl explain rs.spec.template

kubectl explain rs.spec.template.metadata

kubectl explain rs.spec.template.spec

案例:通过RS控制器创建3个Nginx Pod

# vim rs_nginx.yml
apiVersion: apps/v1     
kind: ReplicaSet        
metadata:               
    name: rs-nginx
    namespace: test     
spec:                   
    replicas: 3         #创建pod的副本数量,默认为1
    selector:           #标签选择器,通过它指定RS管理哪些pod
      matchLabels:      #标签类型(key=value)
        app: rs-nginx      #匹配pod的标签(表示deploy管理带有此标签的Pod)
    template:           #pod的配置模板,通过模板定义Pod中的容器
      metadata:
        labels:
          app: rs-nginx    #Pod的标签
      spec:
        containers:
        - name: nginx
          image: nginx:1.17.0
​
          
创建pod
# kubectl create -f rs_nginx.yml
​
​
查看pod详细信息
# kubectl get po -n test
​
​
过滤Pod标签
# kubectl describe pod -n test | grep Labels
​
​
查看pod控制器详细信息
# kubectl get rs -n test -o wide
​
DESIRED:期望的pod副本数量
CURRENT:当前的pod副本数量
READY:已经准备好提供服务的副本数量
​

案例:通过RS控制器实现Pod数量的扩缩容功能

通过edit(配置文件形式)可直接修改pod的副本数量
# kubectl edit rs rs-nginx -n test
...
spec:
  replicas: 6     #直接根据需求修改pod的副本数量即可
  
  
​
查看pod信息
# kubectl get pod -n test
​

案例:通过RS控制器实现镜像版本升级

通过edit(配置文件形式)可直接修改镜像版本
# kubectl edit rs rs-nginx -n test
...
    spec:
      containers:
      - image: nginx:1.18.0   #修改为1.18.0版本
​
​
查看rs详细信息
# kubectl get rs -n test -o wide
​

删除RS方式

命令删除方式
# kubectl delete rs rs-nginx -n test
​
​
查看rs信息
# kubectl get rs -n test
​
​
配置文件删除方式
# kubectl delete -f rs-nginx.yml
​


0
K8S
  1. 支付宝打赏

    qrcode alipay
  2. 微信打赏

    qrcode weixin

评论区