• 【05】Kubernets:资源清单(控制器


    写在前面的话

    从上一章节开始,我们一直在学习关于自主式 Pod 的资源清单编写, 但是自主式 Pod 存在着一个问题,就是和我们直接 docker run 运行 docker 容器一样。如果我们想以集群的形式并配合复杂的处理逻辑就不那么好用了。

    针对这点,我们将 Pod 的处理交给了控制器。

    关于控制器

    再详细讲解控制器怎么使用之前,我们得知道控制器是啥,以及我们需要使用哪些。

    在讲解 K8S 的 Master 组成的时候说过,Master 节点有个重要组件叫做 Controller Manager。

    Controller Manager 由 kube-controller-manager 和 cloud-controller-manager 组成,是 K8S 的核心。

    Cloud controller 一般在配合云服务的时候再使用,所以不是我们关心得重点。

    kube-controller-manager 由以下主要的控制器组成:

    1. Replication Controller(已经废弃)

    2. Replicaset

    3. Deployment Controller

    4. DaemonSet Controller

    5. Job / CronJob Controller

    6. Volume Controller

    7. StatefulSet Controller

    8. Node Controller

    9. Service Controller

    10. 等等...

    常见控制器说明

    Replication Controller

    保证了再特定时间内运行的副本数了,多退少补。并且不会去关注 pod 的状态,只要你被删除或者被终止,自动就把你替换掉。他就像一个进程管理器监管着多个节点的 pod。 

    该控制器只对 restartPolicy 配置为默认 Always 的生效,且控制器永远不会自己关闭。但我们更希望控制器是伴随着服务的生命周期创建删除,因为程序会更新。

    ReplicaSet

    新一代的副本控制器,属于 Replication Controller 的升级版,区别在于新版本支持更为高级的 selector。

    包含 3 个关键点:用户期望副本数,标签选择器,Pod 资源模板。

    Deployment

    调度 ReplicaSet 实现我们的需求,官方也建议我们使用 Deployment 替代 ReplicaSet。例如:

    使用 Deployment 来创建 ReplicaSet,ReplicaSet 会在后台启动相关的 Pod 并检测其状态。

    当我们更新 Deployment 中定义的 Pod 状态时,会新建 ReplicaSet 并根据配置的策略,让 ReplicaSet 按照一定的规则来重建 Pod,实现切换。

    StatefulSet

    主要用于解决有状态的服务的问题。后面会专门用到。

    DaemonSet

    保证每个节点上都有运行一个副本,常用来作为集群日志收集,监控。

    Replicaset Controller 资源清单

    对于 Replicaset Controller 的资源清单,我们也可以像查看 Pod 一样查看:

    kubectl explain rs

    我们可以将 ReplicaSet 简写成为 rs,就像之前我们使用 service 简写成 svc 一样。

    在 ReplicaSet 中,前面提到了 3 个关键点:副本数,标签选择器,Pod 资源模板。其结果如下表:

    rs
    apiVersion     extensions/v1beta1
    kind     ReplicaSet
    metadata      
      name   rs 的名称
      namespace   所属命名空间
      labels   rs 的标签
      annotations   rs 的说明
    spec      
      replicas   副本数
      selector   标签选择器
        matchExpressions KV 列表
        matchLabels 标签选择键值对
      template   模板
        metadata Pod 的 metadata
        spec Pod 的 spec

    相当于在 Pod 外面嵌套了一层,用来定义 rs 的相关信息,如副本数,标签选择器。例如(红色部分就是 Pod 定义):

    apiVersion: extensions/v1beta1
    kind: ReplicaSet
    metadata:
      name: rs-demo
      namespace: default
      labels:
        app: rs
        release: stable
      annotations:
        ezops.cn/create-by: "Dylan"
    spec:
      replicas: 3
      selector:
        matchLabels:
          app: erp
          release: stable
      template:
        metadata:
          name: rs-pod
          namespace: default
          labels:
            app: erp
            release: stable
          annotations:
            ezops.cn/create-by: "Dylan"
        spec:
          containers:
          - name: rs-container
            image: ikubernetes/myapp:v1
            imagePullPolicy: IfNotPresent
            ports:
            - name: http
              containerPort: 80
            - name: https
              containerPort: 443

    创建查看:

    kubectl create -f rs-demo.yaml
    kubectl get rs -o wide

    结果如下:

    对于 ReplicaSet 有几点需要我们注意:

    1. 标签选择器中的标签在我们的 Pod 中必须有满足条件的。

    2. ReplicaSet 创建完成后再去删除 Pod 会自动创建新的 Pod。

    3. 修改集群中其他 Pod 的标签,改为满足 ReplicaSet 中标签选择器定义的需求。ReplicaSet 会干掉自己的 Pod,知道数量等于 replicas 定义的副本数。

    4. 直接使用 edit 修改 ReplicaSet 的副本数量能够生效,但是修改镜像需要 Pod 在重启以后才能生效。

    执行测试:

    kubectl get pods
    # 修改副本数为 5
    kubectl edit rs rs-demo
    # 再度查看
    kubectl get pods
    # 修改镜像版本为 v2
    kubectl edit rs rs-demo
    # 查看
    kubectl get rs -o wide
    # 访问查看
    curl 10.1.2.4

    结果如图:

    小结

    我这里准备将每个点都单独作为一个独立的章节记录,ReplicaSet 其实在之后的不会用到,但是我们需要理解原理,因为 Deployment 调度的其实就是 ReplicaSet。

  • 相关阅读:
    mybatis 之 占位符#{} 和 ${}
    mybatis的#{}占位符和${}拼接符的区别
    MyBatis 批量操作、集合遍历-foreach
    Oracle查看和修改连接数
    linux下启动关闭oracle
    kafka的OffsetOutOfRangeError
    redis批量删除key
    mysql连接慢,修改配置文件
    [linux] ping服务器脚本
    oracle游标
  • 原文地址:https://www.cnblogs.com/Dy1an/p/10950058.html
Copyright © 2020-2023  润新知