Kubernetes 修改pod映像时,Replicaset不会更新中的pod

Kubernetes 修改pod映像时,Replicaset不会更新中的pod,kubernetes,replicaset,Kubernetes,Replicaset,我创建了一个复制集,其容器映像错误,配置如下 apiVersion: extensions/v1beta1 kind: ReplicaSet metadata: name: rs-d33393 namespace: default spec: replicas: 4 selector: matchLabels: name: busybox-pod template: metadata: labels: name: bus

我创建了一个复制集,其容器映像错误,配置如下

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
Pods信息:

$ 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编辑replicaset内的图像,并将图像更新为busybox

现在,我希望作为replicaset的一部分,使用适当的映像重新创建POD

这并不是确切的结果

谁能解释一下,为什么会这样


谢谢:)

使用
ReplicaSets
您必须直接杀死旧的pod,这样新的pod将使用正确的图像创建


如果您要使用
部署
,并且您应该这样做,则更改映像将强制重新创建pod。

复制集
不支持更新。只要存在与选择器标签匹配的所需数量的POD,replicaset的工作就完成了。您应该改用
部署

从文档中:

要以受控方式将POD更新为新规范,请使用部署,如图所示 ReplicaSet不直接支持滚动更新


部署是一个更高级别的概念,它管理复制集并为POD提供声明性更新。因此,建议使用部署而不是直接使用ReplicaSet,除非您根本不需要更新。(即,在使用部署时可能永远不需要操纵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 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

谢谢你的详细解释。我将参考文档并进一步练习部署。
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