Как в kubernetes "kubectl apply" не обновляются существующие развертывания - PullRequest
2 голосов
/ 10 октября 2019

У меня есть веб-приложение .NET-core. Это развертывается в реестре контейнеров Azure. Я развертываю это в своей службе Azure Kubernetes, используя

kubectl apply -f testdeployment.yaml

с файлом yaml ниже

apiVersion: apps/v1
kind: Deployment
metadata:
  name: myweb
spec:
  replicas: 1
  selector:
    matchLabels:
      app: myweb
  template:
    metadata:
      labels:
        app: myweb
    spec:
      containers:
      - name: myweb
        image: mycontainerregistry.azurecr.io/myweb:latest
        ports:
        - containerPort: 80
      imagePullSecrets:
        - name: my-registry-key

Это прекрасно работает, но когда я изменяю какой-то код, помещаю новый код в контейнер и запускаю

kubectl apply -f testdeployment

снова, веб-сайт AKS / не обновляется, пока я не удалю развертывание с помощью

kubectl удалить развертывание myweb

Чтоя должен сделать, чтобы перезаписать все, что развернуто? Я хотел бы добавить что-то в мой yaml-файл. (Я пытаюсь использовать это для непрерывной доставки в DevOps Azure).

Ответы [ 3 ]

6 голосов
/ 10 октября 2019

kubectl не видит никаких изменений в файле развертывания yaml, поэтому он не будет вносить никаких изменений. Это одна из проблем, связанных с использованием тега latest.

Пометьте свое изображение на какой-нибудь инкрементной версии или номере сборки и замените latest на этот тег в конвейере CI (например, envsubst или аналогичным),Таким образом, kubectl знает, что изображение изменилось. И вы также знаете, какая версия образа работает. Тегом latest может быть любая версия изображения.

Упрощенный пример для DevOps Azure:

# <snippet>
        image: mycontainerregistry.azurecr.io/myweb:${TAG}
# </snippet>

Конвейер YAML:

stages:
- stage: Build
  jobs:
  - job: Build
    variables:
    - name: TAG
      value: $(Build.BuildId)
    steps:
    - script: |
        envsubst '${TAG}' < deployment-template.yaml > deployment.yaml
      displayName: Replace Environment Variables

В качестве альтернативы вы также можете использовать другуюинструмент, подобный Замена токенов (другой синтаксис: #{TAG}#).

2 голосов
/ 10 октября 2019

Я считаю, что вы ищете, imagePullPolicy. По умолчанию используется ifNotPresent, что означает, что последняя версия не будет извлечена.

https://kubernetes.io/docs/concepts/containers/images/

apiVersion: apps/v1
kind: Deployment
metadata:
  name: myweb
spec:
  replicas: 1
  selector:
    matchLabels:
      app: myweb
  template:
    metadata:
      labels:
        app: myweb
    spec:
      containers:
      - name: myweb
        image: mycontainerregistry.azurecr.io/myweb
        imagePullPolicy: Always
        ports:
        - containerPort: 80
      imagePullSecrets:
        - name: my-registry-key

Чтобы убедиться, что модуль воссоздан, лучше запустите:

kubectl delete -f testdeployment && kubectl apply -f testdeployment
0 голосов
/ 10 октября 2019

Проблема здесь в том, что модуль, работающий в kubernetes для этого развертывания, старый. Вот почему вы не видите изменений в приложении.

Всякий раз, когда вы развертываете или нажимаете новый код, вы должны удалить работающий модуль. Затем он извлечет образ из реестра контейнера, и ваши новые изменения будут видны вам.

Я предлагаю вам сделать этот шаг в конвейере CI / CD после применения файла развертывания. Если вы применяете файл deploy.yml вручную, то вам нужно удалить модуль вручную, используя команду: kubectl delete pod

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...