修改 pod 镜像时副本集不更新 pods

Replicaset doesnot update pods in when pod image is modified

我使用以下配置创建了一个包含错误容器镜像的副本集。

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 编辑复制集内的图像并将图像更新为 busybox.

现在,我期待 pods 作为副本集的一部分使用适当的图像重新创建。

这不是确切的结果。

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

谢谢:)

直接 ReplicaSets 你必须杀死旧的 pod,这样新的 pod 就会用正确的图像创建。

如果您要使用 Deployment,并且您应该使用,更改图像将强制重新创建广告连播。

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

https://kubernetes.io/docs/concepts/workloads/controllers/replicaset/

来自文档:

To update Pods to a new spec in a controlled way, use a Deployment, as ReplicaSets do not support a rolling update directly.

部署是一个更高级别的概念,它管理 ReplicaSets 并为 Pods 提供声明式更新。因此,建议使用 Deployments 而不是直接使用 ReplicaSets,除非你根本不需要更新。 (即在使用 Deployment 时可能永远不需要操作 ReplicaSet 对象)

使用 deployments 部署时很容易执行滚动更新和回滚。

$ 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>