replicaset是新一代的replication controller。区别是 replica set 的标签选择器比 rc 更强。
apiVersion: apps/v1kind: ReplicaSetmetadata:name: frontendlabels:app: guestbooktier: frontendspec:replicas: 3selector:matchLabels:tier: frontendtemplate:metadata:labels:tier: frontendspec:containers:- name: php-redisimage: 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
注意事项
rs 是根据选择器去判断的,因此你手工创建的 pod 只要匹配了选择器,也会被 rs 认为这是它的一部分。
pod被删除的顺序
- pending 的 pod 会被优先释放
- 注解
controller.kubernetes.io/pod-deletion-cost较小的 pod 会被优先释放 - pod较多的node 上的pod会被优先释放
如果上面的规则都没生效,那么pod会被随机释放
如何配置
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/
