Kubernetes не применяет новое обновление службы из докера

У меня есть приложение Node JS, которое я развертываю в кубернетах.

Я внес изменения в приложение JS узла и повторно развертываю приложение на K8s.

Однако я замечаю, что развертывание не происходит.

Я проверил свой докер-хаб, и да, последний образ развертывается. Это мой файл service.yaml ниже

apiVersion: v1
kind: Service
metadata:
  name: fourthapp
spec:
  type: LoadBalancer #Exposes the service as a node port
  ports:
  - port: 3000
    protocol: TCP
    targetPort: 3000
  selector:
    app: webapp

а это мой файл deploy.yaml

apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: fourthapp
spec:
  replicas: 2
  template:
    metadata:
      labels:
        app: webapp
    spec:
      containers:
      - name: webapp
        image: index.docker.io/leexha/nodejsapp:latest
        ports:
        - containerPort: 3000
        resources:
          requests: 
            memory: 500Mi
            cpu: 0.5
          limits:
            memory: 500Mi
            cpu: 0.5
        imagePullPolicy: Always

когда я запускаю service.yaml, он читает

C:\Users\adrlee\Desktop\oracle\Web_projects>kubectl apply -f service.yml
service "fourthapp" unchanged

Что-то я делаю не так?

Вы хотите либо изменить службу, либо развернуть новый образ докера?

Giorgio Cerruti 05.09.2018 12:56

я хочу развернуть новый образ докера для службы

Adam 05.09.2018 13:06

Мне удалось решить это сейчас. Я сделал небольшую корректировку в своем файле yml, и он сработал, добавив тег изображения

Adam 05.09.2018 17:43
Развертывание модели машинного обучения с помощью Flask - Angular в Kubernetes
Развертывание модели машинного обучения с помощью Flask - Angular в Kubernetes
Kubernetes - это портативная, расширяемая платформа с открытым исходным кодом для управления контейнерными рабочими нагрузками и сервисами, которая...
Как создать PHP Image с нуля
Как создать PHP Image с нуля
Сегодня мы создадим PHP Image from Scratch для того, чтобы легко развернуть базовые PHP-приложения. Пожалуйста, имейте в виду, что это разработка для...
1
3
535
3

Ответы 3

Если вы не дадите каждой сборке своего образа отдельное имя, трудно заставить Kubernetes перезапустить развертывание при изменении базового образа: у него нет возможности узнать, что «последний» тег в Docker Hub теперь означает что-то еще. (imagePullPolicy: Always, по крайней мере, заставит его получить новый образ, если он все равно перезапускается.) Когда вы запускаете kubectl apply, он просматривает загружаемое вами развертывание, видит, что оно соответствует тому, что уже запущено, и ничего не делает.

Лучшая практика - не использовать «последний» тег и давать какой-то уникальный идентификатор (временная метка, идентификатор фиксации системы контроля версий, ...). Затем вы можете обновить идентификатор изображения в спецификации модуля, kubectl apply увидит, что что-то не так, а Kubernetes выполнит за вас последовательное обновление запущенных модулей. Это также имеет то преимущество, что, если сборка плохая, вы можете легко вернуться назад, изменив тег изображения обратно на предыдущую сборку.

поэтому я попытался добавить к изображению уникальный тег, например 0d4992bcf07932cecedfb462fcace2ef9620d916. Тем не менее, он по-прежнему дает мне услугу "fourthapp" без изменений.

Adam 05.09.2018 13:54

И вы изменили спецификацию развертывания на image: leexha/nodejsapp:0d4992bcf...916?

David Maze 05.09.2018 13:56

да. apiVersion: extensions / v1beta1 вид: Метаданные развертывания: имя: спецификация fourthapp: реплики: 2 шаблон: метаданные: метки: приложение: спецификация webapp: контейнеры: - имя: webapp изображение: index.docker.io/leexha/nodejsapp:0d4992bcf07932cecedfb462fcad9 ce2ef96 порты: - containerPort: 3000 ресурсы: запросы: память: 500Mi cpu: 0,5 ограничения: память: 500Mi cpu: 0,5 imagePullPolicy: Always

Adam 05.09.2018 13:59

Как говорит @GiorgioCerruti в своем ответе, вам нужно повторно применить развертывание. служба всегда будет неизменным.

David Maze 05.09.2018 15:59

Kubernetes не будет обновлять запущенные модули, если спецификация модуля не будет изменена. Если вы хотите принудительно выполнить развертывание, вы можете запустить его после команды apply:

kubectl patch deployment fourthapp -p "{\"spec\":{\"template\":{\"metadata\":{\"annotations\":{\"date\":\"`date +'%s'`\"}}}}}"

Он добавит / обновит специальную аннотацию date в шаблоне модуля, а Kubernetes обновит запущенные модули.

Если я понял вопрос, вам следует вместо этого обновить Развертывание. служба - это просто своего рода LB, который распределяет трафик между вашими модулями.

Во-первых, вы должны добавить imagePullPolicy: Always в развертывание, чтобы заставить k8s загрузить самый новый образ.

Если вы хотите обновить развертывание, вы можете запустить

kubectl apply -f deploy.yml

или выполняя Постоянное обновление

Я добавил imagePullPolicy: always

Adam 05.09.2018 13:55

Другие вопросы по теме