修改 pod 镜像时,Replicaset 不会更新 pod

问题描述 投票:0回答:6

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

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。

这还不是确切的结果。

有人可以解释一下为什么会这样吗?

谢谢:)

kubernetes replicaset
6个回答
15
投票

直接使用

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

如果您要使用

Deployment
(而且您应该这样做),则更改图像将强制重新创建 Pod。


9
投票

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

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

来自文档:

要以受控方式将 Pod 更新到新规范,请使用 Deployment,如下所示 ReplicaSet 不支持直接滚动更新。


3
投票

部署是一个更高级别的概念,用于管理 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

2
投票

你可以使用

k scale rs new-replica-set --replicas=0

然后

k scale rs new-replica-set --replicas=<Your number of replicas>

0
投票

使用命令编辑副本集(假设其名为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
投票

编辑配置,将副本设置为

0
。然后使用:

kubectl replace -f your_definition_file.yml

然后再次编辑配置,将副本设置为

4
,然后使用:

kubectl replace -f your_definition_file.yml
© www.soinside.com 2019 - 2024. All rights reserved.