Replicaset не обновляет модули при изменении изображения модуля - PullRequest
1 голос
/ 08 января 2020

Я создал репликац с неправильным изображением контейнера с конфигурацией ниже.

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

Информация о модулях:

$ 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 отредактируйте replicasets.extensions rs-d33393 и обновите изображение как busybox .

Теперь я ожидаю, что модули будут воссозданы с соответствующим изображением как часть replicaset.

Это не был точный результат.

Может кто-нибудь объяснить, почему это так?

Спасибо:)

Ответы [ 3 ]

3 голосов
/ 08 января 2020

Replicaset не поддерживает обновления. До тех пор, пока существует необходимое количество модулей, соответствующих меткам селектора, задание репликации выполняется. Вместо этого вы должны использовать Deployment.

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

Из документов:

Чтобы обновить стручки до новой спецификации c контролируемым образом, используйте Развертывание, так как наборы ReplicaSets не поддерживают прямое обновление напрямую.

2 голосов
/ 08 января 2020

При непосредственном ReplicaSets вам придется убить старый модуль, поэтому новые будут созданы с правильным изображением.

Если вы используете Deployment, и вам следует изменить изображение заставит стручок быть воссозданным.

0 голосов
/ 08 января 2020

Развертывание - это концепция более высокого уровня, которая управляет наборами ReplicaSets и предоставляет декларативные обновления для модулей. Поэтому рекомендуется использовать Deployments вместо прямого использования ReplicaSets, если только вам вообще не нужны обновления . (т. е. никогда не нужно манипулировать объектами 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
...