ThinkChat2.0新版上线,更智能更精彩,支持会话、画图、视频、阅读、搜索等,送10W Token,即刻开启你的AI之旅 广告
副本集 ReplicaSet 是一种 Kubernetes 资源对象,它可以保证 Pod 始终处于运行状态,如果 Pod 因任何原因消失,ReplicaSet 会注意到缺少了 Pod 并创建新的 Pod 进行替代。 ReplicaSet 主要用于创建和管理一个 Pod 的多个副本(replicas),核心标准是确保 Pod 的数量始终与其标签选择器匹配,它会持续监控正在运行的 Pod 列表,并保证带有对应标签的 Pod 数量与期望相符,如果运行的 Pod 太少会根据 Pod 模板创建新的副本;如果运行的 Pod 太多就会删除多余的副本。 因此 ReplicaSet 由 3 个部分组成: * 标签选择器(label selector): 确定 ReplicaSet 作用域中有哪些 Pod * 副本个数(replica count): 指定应运行的 Pod 数量 * Pod 模板(pod template): 用于创建新的 Pod 副本 上述的 3 个部分都可以随时修改,只有副本个数的变更会影响到现有的 Pod,更改标签选择器和 Pod 模板对现有的 Pod 没有影响。如果更改标签选择器会使现有的 Pod 脱离 ReplicaSet 的范围,ReplicaSet 会停止关注它们;如果更改模板,只会对新创建的 Pod 应用新的模板,并不会影响现在存在的 Pod。 使用 ReplicaSet 有以下 3 大好处: * 保证 Pod 持续运行,如果现有 Pod 数量不符合预期将会自动调整 Pod 的数量; * 当集群节点发生故障时,在故障节点受 ReplicaSet 控制的所有 Pod 会被创建新的替代副本; * 可以轻松实现 Pod 的水平伸缩。 注意:这里的标签选择器可以匹配如下的标签: * 具有某个特定标签名和值的 Pod * 缺少某个标签的 Pod * 包含特定标签名,不管其值为多少的 Pod * 匹配多个标签,只要符合其中一个标签就认为是符合标准的 现在我们来创建一个 ReplicaSet,在`/home/shiyanlou`目录下新建`nginx-replicaset.yaml`文件并向其中写入如下代码: ~~~yaml apiVersion: apps/v1 kind: ReplicaSet metadata: name: nginx spec: replicas: 3 selector: matchLabels: app: nginx template: metadata: labels: app: nginx spec: containers: - name: nginx image: registry.cn-hangzhou.aliyuncs.com/chenshi-kubernetes/nginx:1.9.1 ~~~ 执行创建: ~~~bash $ kubectl create -f nginx-replicaset.yaml replicaset.apps/nginx created ~~~ 查看创建的 Pods 和 ReplicaSet: ~~~bash $ kubectl get pods NAME READY STATUS RESTARTS AGE nginx-45h47 1/1 Running 0 48s nginx-gpu 1/1 Running 0 17m nginx-pp6xw 1/1 Running 0 48s nginx-vf2rg 1/1 Running 0 48s $ kubectl get rs NAME DESIRED CURRENT READY AGE nginx 3 3 3 1m ~~~ 查看详细的描述: ~~~bash $ kubectl describe rs Name: nginx Namespace: default Selector: app=nginx Labels: app=nginx Annotations: <none> Replicas: 3 current / 3 desired Pods Status: 3 Running / 0 Waiting / 0 Succeeded / 0 Failed Pod Template: Labels: app=nginx Containers: nginx: Image: registry.cn-hangzhou.aliyuncs.com/chenshi-kubernetes/nginx:1.9.1 Port: <none> Host Port: <none> Environment: <none> Mounts: <none> Volumes: <none> Events: Type Reason Age From Message ---- ------ ---- ---- ------- Normal SuccessfulCreate 2m replicaset-controller Created pod: nginx-pp6xw Normal SuccessfulCreate 2m replicaset-controller Created pod: nginx-45h47 Normal SuccessfulCreate 2m replicaset-controller Created pod: nginx-vf2rg ~~~ 除了使用 matchLabels 属性外,还可以使用功能更加强大的 matchExpressions 属性,在这个属性中可以使用表达式,使标签匹配能够更加丰富。现在我们来改写上面的标签表达式: ~~~yaml selector: matchExpressions: - key: app operator: In values: - nginx ~~~ 使用 matchExpressions 属性一般包含 3 个部分:一个 key、一个 operator(运算符)、以及可能还有一个 values 列表(这取决于运算符)。 operator 运算符一般有 4 种: * In: 标签的值必须与其中一个指定的 values 匹配 * NotIn: 标签的值必须与指定的 values 不匹配 * Exists: Pod 必须包含一个指定名称的标签(值不重要),这时候就不需要指定 values * DoesNotExist: Pod 不能够包含有指定名称的标签,这时候也不需要指定 values 如果指定了多个表达式或者同时混合使用了 matchLabels 和 matchExpressions 属性,,这些表达式必须都为 true 才能和 Pod 进行匹配。 最后也可以删除定义的 ReplicaSet: ~~~bash $ kubectl delete rs nginx replicaset.extensions "nginx" deleted ~~~ 在删除 nginx ReplicaSet 时也会删除对应匹配的所有 Pod。