系列目录php
说到ReplicaSet对象,得先说说ReplicationController(简称为RC)。在旧版本的Kubernetes中,只有ReplicationController对象。它的主要做用是确保Pod以你指定的副本数运行
,即若是有容器异常退出,会自动建立新的 Pod 来替代;而异常多出来的容器也会自动回收。能够说,经过ReplicationController,Kubernetes实现了集群的高可用性。html
在新版本的 Kubernetes 中建议使用 ReplicaSet(简称为RS )来取代 ReplicationController。ReplicaSet 跟 ReplicationController 没有本质的不一样,只是名字不同,而且 ReplicaSet 支持集合式的 selector(ReplicationController 仅支持等式)。nginx
虽然也 ReplicaSet 能够独立使用,但建议使用 Deployment 来自动管理 ReplicaSet,这样就无需担忧跟其余机制的不兼容问题(好比 ReplicaSet 不支持 rolling-update 但 Deployment 支持),而且Deployment还支持版本记录、回滚、暂停升级等高级特性。Deployment 的详细介绍和使用方法参见。redis
ReplicationController和Pod同样,都是Kubernetes中的对象,所以建立方式相似。经过yaml或json描述文件来定义一个ReplicationController对象。一个最简单的ReplicationController的定义以下:json
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
下面简要解释一下上述ReplicationController描述文件中的关键点:api
kind字段表明你要新建的对象类型。此处指定为ReplicationController。bash
spec.selector字段指定为你须要管理的Pod的label(label的意义体如今此处)。这儿将spec.selector设置为app: nginx,意味着全部包含label:app: nginx的Pod都将被这个RC管理。app
spec.replicas字段表明了受此RC管理的Pod,须要运行的副本数。frontend
template模块用于定义Pod,包括Pod的名字,Pod拥有的label以及Pod中运行的应用。google
上面的RC经过kubectl apply命令建立成功后,Kubernetes会在全部可用的Node上,新建三个Pod。每一个Pod都有一个app: nginx的label,而且每一个Pod中都运行一个nginx容器。一旦其中某个Pod发生故障中止运行了,Controller Manager都可以及时发现,而后根据当前RC定义,建立出一个新的Pod,从而使包含label:app: nginx的Pod的运行副本数始终为3。
Kubernetes官方强烈建议避免直接使用ReplicaSet,而应该经过Deployment来建立RS和Pod。
因为ReplicaSet是ReplicationController的代替物,所以用法基本相同,惟一的区别在于ReplicaSet支持集合式的selector。一个典型的RS描述文件以下:
apiVersion: apps/v1 kind: ReplicaSet metadata: name: frontend labels: app: guestbook tier: frontend spec: replicas: 3 selector: matchLabels: tier: frontend matchExpressions: - {key: tier, operator: In, values: [frontend]} template: metadata: labels: app: guestbook tier: frontend spec: containers: - name: php-redis image: gcr.io/google_samples/gb-frontend:v3 resources: requests: cpu: 100m memory: 100Mi env: - name: GET_HOSTS_FROM value: dns ports: - containerPort: 80
以上RS描述文件中,selector除了可使用matchLabels,还支持集合式的操做:
matchExpressions: - {key: tier, operator: In, values: [frontend]}
使用kubectl delete命令会删除此RS以及它管理的Pod。在Kubernetes删除RS前,会将RS的replica调整为0,等待全部的Pod被删除后,在执行RS对象的删除。
若是但愿仅仅删除RS对象(保留Pod),请使用kubectl delete命令时添加--cascade=false
选项。
经过修改.spec.replicas的值能够实时修改RS运行的Pod数量。
RS能够经过HPA来根据一些运行时指标实现自动伸缩,下面是一个简单的例子:
apiVersion: autoscaling/v1 kind: HorizontalPodAutoscaler metadata: name: frontend-scaler spec: scaleTargetRef: kind: ReplicaSet name: frontend minReplicas: 3 maxReplicas: 10 targetCPUUtilizationPercentage: 50
能够经过kubectl create -f来建立HPA或者使用
# 注意此命令并不会调用HAP定义,而是直接经过命令达到自动扩容效果,与上面经过yml效果相似 kubectl autoscale rs frontend --max=10