我使用以下配置创建了一个包含错误容器映像的副本集。
apiVersion: extensions/v1beta1
kind: ReplicaSet
metadata:
name: rs-d33393
namespace: default
spec:
replicas: 4
selector:
matchLabels:
name: busybox-pod
template:
metadata:
labels:
name: busybox-pod
spec:
containers:
- command:
- sh
- -c
- echo Hello Kubernetes! && sleep 3600
image: busyboxXXXXXXX
name: busybox-container
Pod 信息:
$ kubectl get pods
NAME READY STATUS RESTARTS AGE
rs-d33393-5hnfx 0/1 InvalidImageName 0 11m
rs-d33393-5rt5m 0/1 InvalidImageName 0 11m
rs-d33393-ngw78 0/1 InvalidImageName 0 11m
rs-d33393-vnpdh 0/1 InvalidImageName 0 11m
此后,我尝试使用 kubectl edit replicasets.extensions rs-d33393 编辑副本集中的图像,并将图像更新为 busybox。
现在,我期望使用正确的图像作为副本集的一部分重新创建 Pod。
这还不是确切的结果。
有人可以解释一下为什么会这样吗?
谢谢:)
直接使用
ReplicaSets
,您必须杀死旧的pod,这样新的pod将使用正确的图像创建。
如果您要使用
Deployment
(而且您应该这样做),则更改图像将强制重新创建 Pod。
Replicaset
不支持更新。只要存在与选择器标签匹配的所需数量的 Pod,复制集的工作就完成了。您应该使用 Deployment
来代替。
https://kubernetes.io/docs/concepts/workloads/controllers/replicaset/
来自文档:
要以受控方式将 Pod 更新到新规范,请使用 Deployment,如下所示 ReplicaSet 不支持直接滚动更新。
部署是一个更高级别的概念,用于管理 ReplicaSet 并向 Pod 提供声明性更新。因此,建议使用 Deployments 而不是直接使用 ReplicaSet,除非你根本不需要更新。 (即,在使用 Deployment 时可能永远不需要操作 ReplicaSet 对象)
使用部署进行部署时,可以轻松执行滚动更新和回滚。
$ kubectl create deployment busybox --image=busyboxxxxxxx --dry-run -o yaml > busybox.yaml
$ cat busybox.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
creationTimestamp: null
labels:
app: busybox
name: busybox
spec:
replicas: 1
selector:
matchLabels:
app: busybox
strategy: {}
template:
metadata:
creationTimestamp: null
labels:
app: busybox
spec:
containers:
- image: busyboxxxxxxx
name: busyboxxxxxxx
ubuntu@dlv-k8s-cluster-master:~$ kubectl create -f busybox.yaml --record=true
deployment.apps/busybox created
检查推出历史记录
ubuntu@dlv-k8s-cluster-master:~$ kubectl rollout history deployment busybox
deployment.apps/busybox
REVISION CHANGE-CAUSE
1 kubectl create --filename=busybox.yaml --record=true
更新部署时的映像
ubuntu@dlv-k8s-cluster-master:~$ kubectl set image deployment.app/busybox *=busybox --record
deployment.apps/busybox image updated
ubuntu@dlv-k8s-cluster-master:~$ kubectl rollout history deployment busybox
deployment.apps/busybox
REVISION CHANGE-CAUSE
1 kubectl create --filename=busybox.yaml --record=true
2 kubectl set image deployment.app/busybox *=busybox --record=true
回滚部署
ubuntu@dlv-k8s-cluster-master:~$ kubectl rollout undo deployment busybox
deployment.apps/busybox rolled back
ubuntu@dlv-k8s-cluster-master:~$ kubectl rollout history deployment busybox
deployment.apps/busybox
REVISION CHANGE-CAUSE
2 kubectl set image deployment.app/busybox *=busybox --record=true
3 kubectl create --filename=busybox.yaml --record=true
你可以使用
k scale rs new-replica-set --replicas=0
然后
k scale rs new-replica-set --replicas=<Your number of replicas>
使用命令编辑副本集(假设其名为replicaset.yaml)文件:
kubectl edit rs replicaset
现在,您需要删除副本集或删除现有的 Pod:
kubectl delete rs new-replica-set
kubectl delete pod pod_1 pod_2 pod_2 pod_4
replicaset 应该使用新镜像启动新的 pod。
编辑配置,将副本设置为
0
。然后使用:
kubectl replace -f your_definition_file.yml
然后再次编辑配置,将副本设置为
4
,然后使用:
kubectl replace -f your_definition_file.yml