• K8s之Replicaset控制器详解


    一、ReplicaSet 控制器介绍

    官方中文参考文档:

    ReplicaSet是k8s中一种资源对象,简写 rs用于管理Pod副本数量和健康状态,在spec.replicas 字段中可以定义Pod副本数量,ReplicaSet会始终保持Pod在指定数量,当发现Pod数量大于副本数量时,会移除多出的Pod,当发现Pod小于副本数量会自动创建Pod,使其始终维护在副本数量,此外,ReplicaSet还会监控Pod的健康状态,如果某个Pod出现故障,ReplicaSet会自动替换它

    ReplicaSet特点如下:

    • 自动化管理:ReplicaSet可以自动地创建、删除和更新Pod副本,以确保指定数量的Pod副本一直在运行。
    • 健康检查:ReplicaSet会定期检查Pod的健康状态,并根据需要重启或替换不健康的Pod。
    • 水平扩展:通过增加或减少Pod副本的数量,可以实现应用程序的水平扩展,以满足不同的负载需求。
    • 选择器:ReplicaSet使用标签选择器来选择要管理的Pod副本。
    • 有状态管理:ReplicaSet可以管理有状态的应用程序,例如数据库,以确保数据的一致性和可用性。
    • 更新:不支持滚动更新,需要手动删除旧Pod实现更新

    ReplicaSet常用字段解释:

    apiVersion: apps/v1      # RS版本
    kind: ReplicaSet         # 定义RS资源类型  
    metadata:                # RS元数据
      name: nginx-replicaset # RS名称
      namespace: default     # RS命名空间
      labels:                # RS标签
        app: web
        env: uat
    spec: 
      replicas: 3            # 关联Pod副本数量
      selector:              
        matchLabels:         # 关联具有app=web的Pod
          app: web
      template:              # Pod模板
        metadata:            # Pod元数据
          namespace: default # Pod命名空间
          labels:            # Pod标签
            app: web
            env: uat
        spec:
          containers:        # Pod定义容器
          - name: web-nginx  # 容器名称
            image: nginx     # 容器使用镜像
            imagePullPolicy: IfNotPresent  # 容器镜像下载策略
            ports:         
            - containerPort: 80            # 容器内端口
    
    • 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

    二、ReplicaSet案例

    1、Pod副本扩缩容案例

    通过修改 spec.replicas 值来进行动态扩容、缩容,使用 nginx镜像定义副本数量 3,并添加了一些必要的探测,如下:

    cat replicaset.yaml 
    
    ---
    apiVersion: apps/v1     
    kind: ReplicaSet 
    metadata:                
      name: nginx-replicaset
      namespace: default   
      labels:               
        app: web
    spec: 
      replicas: 3           
      selector:              
        matchLabels:       
          app: web
      template:             
        metadata:            
          namespace: default 
          labels:            
            app: web
        spec:
          containers:       
          - name: web-nginx 
            image: nginx:1.18.0
            imagePullPolicy: IfNotPresent  
            ports:         
            - containerPort: 80 
            startupProbe:
              tcpSocket:
                port: 80
            livenessProbe:
              httpGet:
                path: /index.html
                port: 80
            readinessProbe:
              httpGet:
                path: /index.html
                port: 80
    
    • 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

    执行YAML文件:

    kubectl apply -f replicaset.yaml 
    
    • 1

    查看Pod、RS状态,是否创建且正常:

    kubectl get rs,pod -l app=web
    
    • 1

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ZNCdEd20-1685257135299)(D:\MD归档文档\IMG\image-20230528133211004.png)]

    当我们删除Pod时,RS会自动为我们创建出来,RS会始终维护Pod数量为3 删除命令如下:

    kubectl delete pod nginx-replicaset-7mh2r
    
    • 1

    动态扩容副本数量,更新副本数量为5:

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-2AHacQTU-1685257135300)(D:\MD归档文档\IMG\image-20230528133458570.png)]

    重新 apply 一下 YAML文件:

    kubectl apply -f replicaset.yaml 
    
    • 1

    验证,Pod数量:

    kubectl get pod -l app=web
    
    • 1

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-E4AEtJpV-1685257135301)(D:\MD归档文档\IMG\image-20230528133646092.png)]

    缩容也是同样操作,更改replicas数值重新apply一下即可,此处省略。

    2、Pod更新版本案例

    所需镜像下载地址

    ReplicaSet,不支持动态更新,只能是通过删除旧Pod方式,案例演示如下:

    使用 web:v1 镜像 创建ReplicaSet资源

    cat replicaset.yaml 
    ---
    apiVersion: apps/v1     
    kind: ReplicaSet 
    metadata:                
      name: nginx-replicaset
      namespace: default   
      labels:               
        app: web
    spec: 
      replicas: 3          
      selector:              
        matchLabels:       
          app: web
      template:             
        metadata:            
          namespace: default 
          labels:            
            app: web
        spec:
          containers:       
          - name: web-nginx 
            image: web:v1     # V1 镜像
            imagePullPolicy: IfNotPresent  
            ports:         
            - containerPort: 80 
    
    • 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

    执行文件:

    kubectl apply -f replicaset.yaml
    kubectl get pod -l app=web
    
    • 1
    • 2

    查看PodIP地址,并访问:

    kubectl describe pod nginx-replicaset-wht6q|grep IP
    
    • 1

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-xeRqOgj6-1685257135302)(D:\MD归档文档\IMG\image-20230528144500659.png)]

    根据以上更新使用 web:v2 镜像:

    编辑上面 YAML 文件 只更改镜像版本即可如下图:

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-uWGTenzq-1685257135302)(D:\MD归档文档\IMG\image-20230528144647385.png)]

    执行文件:

    kubectl apply -f replicaset.yaml
    kubectl get pod -l app=web
    
    • 1
    • 2

    注意,此时curl Pod返回内容依旧是 旧版Pod内容,需要手动删除旧Pod资源,RS会自动创建Pod,自动创建的Pod才会使用新的镜像

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-pXMdKw2n-1685257135302)(D:\MD归档文档\IMG\image-20230528145222569.png)]

    删除Pod,根据自己当前环境pod名称进行删除:

    kubectl delete pod nginx-replicaset-ff5pl nginx-replicaset-rvr9k nginx-replicaset-wht6q
    
    • 1

    删除后,RS会自动创建,查看新的Pod:

    kubectl get pod -l app=web
    
    • 1

    访问Pod:

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-lfXPHJsB-1685257135303)(D:\MD归档文档\IMG\image-20230528145620136.png)]

  • 相关阅读:
    Spark新特性与核心概念
    总结线程安全问题的原因和解决方案
    今日伦敦金行情分析方法分享
    MSDC 4.3 接口规范(16)
    安全狗持续4年零失误实力守护金鸡颁奖典礼
    凭借这份180道最全高级岗面试题及答案,成功入职,美团定级T4
    Spring 框架使用的设计模式
    面经汇总--校招--北京顺丰同城
    spring-初识spring
    脚手架安装
  • 原文地址:https://blog.csdn.net/weixin_45310323/article/details/130912882