replicaset是新一代的replication controller。区别是 replica set 的标签选择器比 rc 更强。

  1. apiVersion: apps/v1
  2. kind: ReplicaSet
  3. metadata:
  4. name: frontend
  5. labels:
  6. app: guestbook
  7. tier: frontend
  8. spec:
  9. replicas: 3
  10. selector:
  11. matchLabels:
  12. tier: frontend
  13. template:
  14. metadata:
  15. labels:
  16. tier: frontend
  17. spec:
  18. containers:
  19. - name: php-redis
  20. image: gcr.io/google_samples/gb-frontend:v3

你可以观察一下它和RC的区别

apiVersion: v1
kind: ReplicationController
metadata:
  name: nginx
spec:
  replicas: 3
  selector:
    app: nginx
  template:
    metadata:
      name: nginx
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx
        ports:
        - containerPort: 80

可以说是非常相似的。因为我这里RS用了最简单的 matchLabels 选择器。
更具表达力的 matchExpression 选择器是这样的

selector:
    matchExpresions:
      - key: app
        operator: In
      values:
          - kubia
selector:
  matchLabels:
    component: redis
  matchExpressions:
    - {key: tier, operator: In, values: [cache]}
    - {key: environment, operator: NotIn, values: [dev]}

可以看出实际上你可以配置成任意的逻辑表达式
operator 的可选项有 In, NotIn, Exists, DoesNotExist

kubectl describe rs/frontend

这样可以查看到frontend这个rs的描述信息。

注意事项

rs 是根据选择器去判断的,因此你手工创建的 pod 只要匹配了选择器,也会被 rs 认为这是它的一部分。
pod被删除的顺序

  1. pending 的 pod 会被优先释放
  2. 注解 controller.kubernetes.io/pod-deletion-cost 较小的 pod 会被优先释放
  3. pod较多的node 上的pod会被优先释放

如果上面的规则都没生效,那么pod会被随机释放


  1. 如何配置

    rs 主要写两个部分,.spec.selector.spec.template
    将 rs 用作一个水平扩展器
    当 cpu 占用率超过 50 时扩容。
    apiVersion: autoscaling/v1
    kind: HorizontalPodAutoscaler
    metadata:
    name: frontend-scaler
    spec:
    scaleTargetRef:
     kind: ReplicaSet
     name: frontend
    minReplicas: 3
    maxReplicas: 10
    targetCPUUtilizationPercentage: 50
    

参考文献

[1]: k8s 官方文档rs章节 https://kubernetes.io/docs/concepts/workloads/controllers/replicaset/