replicaset
1.Replicaset概念
Kubernetes中的ReplicaSet主要的作用是维持一组Pod副本的运行,它的主要作用就是保证一定数量的 Pod 能够在集群中正常运行,它会持续监听这些 Pod 的运行状态,在 Pod 发生故障时重启pod,pod数量减少时重新运行新的 Pod 副本,因此,它通常被用来保证特定数量相同的Pods的可用性。
2.replicaset怎么工作
ReplicaSet由字段定义,包括一个选择器,该选择器指定如何找到它所管理的Pod、维护多少个pod,以及pod的模板。ReplicaSet通过创建和删除Pod来满足期望的pod数量。当ReplicaSet需要创建新的Pod时,它将使用其Pod模板。ReplicaSet通过Pods的metadata.ownerReferences字段链接到其Pod,该字段指定当前对象所拥有的资源。由ReplicaSet获取的所有Pod在其ownerReferences字段中都有其自己的ReplicaSet的标识信息。通过此链接,ReplicaSet可以知道它正在维护的Pod的状态,并据此计划。
ReplicaSet通过使用其选择器标识要获取的新Pod。如果存在没有OwnerReference的Pod或OwnerReference不是控制器,并且它与ReplicaSet的选择器匹配,它将由所述的ReplicaSet立即获取
3.什么时候使用replicaset
replicaSet确保在任何给定时间都运行指定数量的Pod副本。但是,Deployment是一个高级概念,用于管理副本集,并提供对Pod的声明性更新以及许多其他有用的功能。因此,除非你需要自定义更新编排或根本不需要更新,否则我们使用Deployment而不是直接使用replicaset。这实际上意味着你可能永远不需要操纵ReplicaSet对象:改用Deployment,然后在spec部分中定义你的应用程序。
例子:
apiVersion: apps/v1
kind: ReplicaSet
metadata:
name: frontend
labels:
app: guestbook
tire: frontend
spec:
replicas: 3
selector:
matchLabels:
app: guestbook
tire: frontend
template:
metadata:
labels:
app: guestbook
tire: frontend
spec:
containers:
- name: php-redis
image: yecc/gcr.io-google_samples-gb-frontend:v3
编写replicaset资源清单文件
与所有其他 Kubernetes API对象一样,ReplicaSet需要apiVersion、kind、和metadata,ReplicaSet 也需要.spec部分。对于replicaset副本集来说,kind只能是replicaset,在kubernetes1.9+之后,apiversion默认的版本是apps/v1,apps/v1beta2已经被废弃了。
Pod template
.spec.template是一个Pod模板,还需要在其上放置标签。在我们的replicaset.yaml示例中,我们有一个标签:tier: frontend。注意不要与其他控制器的选择器重叠。对于 重启策略,.spec.template.spec.restartPolicy 唯一允许的取值是 Always,这也是默认值.
pod selector
.spec.selector字段是标签选择器。可以选择它所匹配的拥有相同标签的pod。在我们的 replicaset.yaml示例中,选择器为:
matchLabels:
tier: frontend
在ReplicaSet中,.spec.template.metadata.labels必须匹配spec.selector,否则将被API拒绝。
注意:对于指定相同.spec.selector但不同的.spec.template.metadata.labels和.spec.template.spec字段的2个replicaset,每个replicaset都会忽略另一个replicaset创建的Pod。
Replicas
通过设置 .spec.replicas 您可以指定要同时运行多少个 Pod。 在任何时间运行的 Pod 数量可能高于或低于 .spec.replicas 指定的数量,例如在副本刚刚被增加或减少后、或者 Pod 正在被优雅地关闭、以及替换提前开始。
如果您没有指定 .spec.replicas, 那么默认值为 1
删除
如果我们在 Kubernetes 集群中删除一个 ReplicaSet 持有的 Pod,那么控制器会重新同步 ReplicaSet 的状态并启动一个新的 Pod,但是如果删除集群中的 ReplicaSet 所有相关的 Pod 也都会被删除:
kubectl delete rs example