在k8s中的控制器和部署服务-ReplicationController和ReplicaSet

  pod 代表了 k8s 中的基本部署单元,但是在实际应用场景中,服务不可能是单个pod运行的,否则会出现“单点”。在 k8s 中对 pod 的托管部署,专门抽象成了单独的资源。其中包含了 ReplicationController 或 Deloyment ,由他们来管理实际的 pod。

  试想一下,当你创建未托管的 pod 的时候,会选择一个集群来运行 pod,在集群中选择节点来运行容器。如果节点中某些 pod 丢失,或者失败,这时候就需要自动重启他们,并且产生新的 pod 来替代他们,这些工作就是有 ReplicationController 的资源来进行托管的。

ReplicationController

  下面找了幅图来说明,ReplicationController 旨在创建和管理一个 pod 的多个副本(replica),这就是 ReplicationController 的由来。

 

 

  在 k8s 中,ReplicationController 的工作就是确保 pod 的数量始终和其标签选择器匹配,如果不匹配则需要适当的“调度”来满足。这里可以想象成 k8s 始终在循环的检查对应的 RepliactionController 资源状态,如果符合 yaml 文件的描述则跳过,如果不满足则进行调度调整。

 

   在创建 ReplicationController 中,声明 yaml 只需要三个主要的部分:

  • label seoector(标签选择器),用于确定 ReplicationController 作用域中有哪些 pod
  • replica count(副本个数),指定运行的 pod 数量
  • pod template(pod模板),用于创建 pod 副本
apiVersion: v1
kind: ReplicationController
metadata:
  name: kubia             // ReplicationController 的名字
spec:
  replicas: 3
  selector:
    app: kubia              // 确保标签选择器 app=kubia 的pod实例始终只有3个
  template:
    metadata:
      name: kubia
      labels:
        app: kubia         // 这里可以不指定,它会被自动配置,如果指定必须和上面的 selector一致
    spec:                     // 创建新 pod 所用的 pod 模板
      containers:
      - name: kubia
        image: luksa/kubia
        ports:
        - containerPort: 8080        

  相关执行命令

# 创建 ReplicationController
$ kubectl create -f ./kubia-rc.yaml

# 查看 rc
$ kubectl get rc

# 查看详情
$ kubectl describe rc {ReplicationController名称}

# 将pod移入或移出,只需要更改标签即可
$ kubectl label pod {pod名字} {标签名}={标签值} --overwrite

## 这里的标签修改后,与rc的不匹配则会导致 ReplicationController 重新拉起一个 pod,并且这个被修改的pod是完全独立的,并且会一直运行直到你手动删除它

# 修改 rc 模板
$ kubectl edit rc {ReplicationController名称}

# 扩缩容
$ kubectl scale rc {ReplicationController名称} --replicas={副本数量}

# 删除 ReplicationController
$ kubectl delete rc {ReplicationController名称} 

 

ReplicaSet

  ReplicaSet 的功能其实和 ReplicationController 一模一样,但是不同的是 ReplicaSet 对于 pod 的选择器提供更多的语法来进行匹配。

  举个栗子,单纯 ReplicationController 无法将 pod 与标签 env=dev 和 env=prod 的进行同时匹配,但是 ReplicaSet 可以进行同时符合这连个标签的 pod 来进行管理。

  比较简单的选择器 selector.matchLabels

apiVersion: apps/v1beta2
kind: ReplicaSet
metadata:
    name: kubia-rs
spec:
    selector:
        matchLabels:
            app: kubia-rs
    template:
        ....后面和ReplicationController一样

  更复杂的选择器 selector.matchExpressions

selector:
    matchExpressions:
        - key: app      // 此选择器要求该 pod 包含名为"app"的标签,下面则是对 app 这个标签的筛选
          operator: In
          values:
              - kubia-rs

选择器每个表达式必须包含一个 key,和一个 operator 运算符。其中运算符分为:

- In:Label 的值必须与其中一个指定的 values 匹配
- NotIn: Label 的值与任何指定的 values 不匹配
- Exists: pod 必须包含一个指定名称的标签
- DoesNotExist: pod 不得包含有指定名称的标签

 

posted @ 2022-07-30 19:00  Blackbinbin  阅读(183)  评论(0编辑  收藏  举报