CloneSet 允许用户配置 PVC 模板 volumeClaimTemplates,用来给每个 Pod 生成独享的 PVC,这是 Deployment 所不支持的。 如果用户没有指定这个模板,CloneSet 会创建不带 PVC 的 Pod。
3、现在来创建一个带有 PVC 模板的例子
apiVersion: apps.kruise.io/v1alpha1 kind: CloneSet metadata: labels: app: nginx-2 name: nginx-2 spec: replicas: 5 selector: matchLabels: app: nginx-2 template: metadata: labels: app: nginx-2 spec: containers: - name: nginx image: nginx:alpine volumeMounts: - name: data-vol mountPath: /usr/share/nginx/html volumeClaimTemplates: - metadata: name: rbd spec: accessModes: [ "ReadWriteOnce" ] storageClassName: rbd resources: requests: storage: 2Gi部署
[root@qd01-stop-k8s-master001 demo]# kubectl apply -f CloneSet.yaml cloneset.apps.kruise.io/nginx-2 created [root@qd01-stop-k8s-master001 demo]# kubectl get pv|grep data-vol pvc-0fde19f3-ea4b-47e0-81be-a8e43812e47b 2Gi RWO Delete Bound default/data-vol-nginx-2-t55h8 rbd 83s pvc-72accf10-57a6-4418-a1bc-c64633b84434 2Gi RWO Delete Bound default/data-vol-nginx-2-t49mk rbd 82s pvc-8fc8b9a5-afe8-446a-9190-08fcee0ec9f6 2Gi RWO Delete Bound default/data-vol-nginx-2-jw2zp rbd 84s pvc-c9fba396-e357-43e8-9510-616f698da765 2Gi RWO Delete Bound default/data-vol-nginx-2-b5fdd rbd 84s pvc-e5302eab-a9f2-4a71-a5a3-4cd43205e8a0 2Gi RWO Delete Bound default/data-vol-nginx-2-l54dz rbd 84s [root@qd01-stop-k8s-master001 demo]# kubectl get po|grep nginx nginx-2-b5fdd 1/1 Running 0 97s nginx-2-jw2zp 1/1 Running 0 97s nginx-2-l54dz 1/1 Running 0 97s nginx-2-t49mk 1/1 Running 0 96s nginx-2-t55h8 1/1 Running 0 96s从部署结果可以看到,每个pod都创建了一个PVC,这个是原生的Deployment不能实现的。
注意: 每个被自动创建的 PVC 会有一个 ownerReference 指向 CloneSet,因此 CloneSet 被删除时,它创建的所有 Pod 和 PVC 都会被删除。 每个被 CloneSet 创建的 Pod 和 PVC,都会带一个 apps.kruise.io/cloneset-instance-id: xxx 的 label。关联的 Pod 和 PVC 会有相同的 instance-id,且它们的名字后缀都是这个 instance-id。 如果一个 Pod 被 CloneSet controller 缩容删除时,这个 Pod 关联的 PVC 都会被一起删掉。 如果一个 Pod 被外部直接调用删除或驱逐时,这个 Pod 关联的 PVC 还都存在;并且 CloneSet controller 发现数量不足重新扩容时,新扩出来的 Pod 会复用原 Pod 的 instance-id 并关联原来的 PVC。 当 Pod 被重建升级时,关联的 PVC 会跟随 Pod 一起被删除、新建。 当 Pod 被原地升级时,关联的 PVC 会持续使用。4、指定 Pod 缩容
当一个 CloneSet 被缩容时,有时候用户需要指定一些 Pod 来删除。这对于 StatefulSet 或者 Deployment 来说是无法实现的,因为 StatefulSet 要根据序号来删除 Pod,而 Deployment/ReplicaSet 目前只能根据控制器里定义的排序来删除。
CloneSet 允许用户在缩小 replicas 数量的同时,指定想要删除的 Pod 名字。
现在我们来修改上面例子的部署文件,指定删除nginx-2-t55h8这个Pod
apiVersion: apps.kruise.io/v1alpha1 kind: CloneSet metadata: labels: app: nginx-2 name: nginx-2 spec: replicas: 4 scaleStrategy: podsToDelete: - nginx-2-t55h8然后更新yaml文件
[root@qd01-stop-k8s-master001 demo]# kubectl apply -f CloneSet.yaml cloneset.apps.kruise.io/nginx-2 configured [root@qd01-stop-k8s-master001 demo]# kubectl get po|grep nginx nginx-2-b5fdd 1/1 Running 0 11m nginx-2-jw2zp 1/1 Running 0 11m nginx-2-l54dz 1/1 Running 0 11m nginx-2-t49mk 1/1 Running 0 11m现在看输入结果,已经没有nginx-2-t55h8这个Pod了
这个功能很实用,比如某台机器故障了,或者负载太高,你想删除指定的pod。
5、升级功能
CloneSet 提供了和 Advanced StatefulSet 相同的 3 个升级方式,默认为 ReCreate: ReCreate: 控制器会删除旧 Pod 和它的 PVC,然后用新版本重新创建出来。 InPlaceIfPossible: 控制器会优先尝试原地升级 Pod,如果不行再采用重建升级。目前,只有修改 spec.template.metadata.* 和 spec.template.spec.containers[x].image 这些字段才可以走原地升级。 InPlaceOnly: 控制器只允许采用原地升级。因此,用户只能修改上一条中的限制字段,如果尝试修改其他字段会被 Kruise 拒绝。现在我们来尝试原地升级Pod功能,把nginx镜像由nginx:alpine 升级为 nginx:latest
首先修改yaml文件,这里只粘贴出文件的修改的部分