replicaset是新一代的replication controller。区别是 replica set 的标签选择器比 rc 更强。
apiVersion: apps/v1
kind: ReplicaSet
metadata:
name: frontend
labels:
app: guestbook
tier: frontend
spec:
replicas: 3
selector:
matchLabels:
tier: frontend
template:
metadata:
labels:
tier: frontend
spec:
containers:
- name: php-redis
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
注意事项
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/