Kubernetes: Resource: ReplicationController

 8th March 2021 at 7:48pm

ReplicationController 用来表示要在集群中运行一定数量的某个 pod。下面将 ReplicationController 简称 rc。

rc 的关键点在于:

  • 定义 label selector,表示带这些标签的 pod 属于这个 rc 的管控之下
  • 定义副本个数
  • 定义 pod template,表示生成怎样的 pod

rc 不足够灵活,使用时应该用 deployment。比如 rc 在做滚动更新时,建议的做法是:

  • 新建一个新的 rc,用上新版本的 pod template,使其 replicas 为 1
  • 不停地将老 rc replicas 减 1,新 rc 加 1,直至发布完

这个过程就非常繁琐。Deployment 可以自行解决这些问题。

创建 rc

早前的 k8s 版本可以用 kubectl run 搭配 --generator=run/v1 参数来创建 rc。但是这个做法由于容易引起混乱,被移除了。应该使用 kubectl create 搭配一个 YAML 来创建 rc。而 kubectl run 只能用来创建 pod,跟 docker run 的功能类似。

YAML 样例:

apiVersion: v1
kind: ReplicationController     
metadata:
  name: kubia                      
spec:
  replicas: 3                 # Replicas count
  selector:                   # Label selector
    app: kubia 
  template:                   # Pod template
    metadata:                      
      labels:                 # 应该跟 rc 的 label selector 一致,否则 rc 会无限生成新 pod
        app: kubia                 
    spec:                          
      containers:                  
      - name: kubia                
        image: luksa/kubia         
        ports:                     
        - containerPort: 8080

其中 不建议定义 rc 的 selector,不定义时 k8s 从 pod template 中取 labels 作为 selector,减少出错可能。

为 rc 创建 service

kubectl expose rc kubia --type=LoadBalancer --name kubia-http

上面创建了一个名为 kubia-http、类型为 LoadBalancer 的 service。

查询 rc

kubectl get rc
NAME        DESIRED    CURRENT   READY   AGE
kubia       3          3         2       17m

扩缩容 rc

kubectl scale rc kubia --replicas=3

手工修改 pod 的 label 的效果

  • 如果 managed pod 被修改后,label 不再满足 rc 的 selector,pod 变成 unmanaged;rc 因为 pod 数量不足,产生新 pod
  • 如果 unmanaged pod 被修改后,label 满足了 rc 的 selector,pod 变成 managed;rc 因为 pod 数量过多,杀掉部分 pod

修改 rc 的 selector 后的效果

不太重要。可以忽略。

如果 rc 当前管理的 pod,在 rc 修改 selector 其 label 不再能匹配 selector,这些 pod 会变成 unmanaged pod,不受管理。rc 会生成新的 pod,但假如你不同时修改 pod template 中的 label 使其匹配新的 selector,那 rc 可能无限制地生成新的 pod。

修改 rc 中的 pod template 后的效果

虽然现时的 pod 跟 rc 定义的 template 已经不同,但是 rc 不会杀掉当前的 pod,而是在 pod 被销毁(容器进程退出或手工删除 pod)时,再以新的 template 生成 pod:

删除 rc

删除 rc 时会同时删除其管理的 pod。如果想要不删除 pod,使用 --cascade=false

kubectl delete rc kubia --cascade=false