У меня есть приложение 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
Что-то я делаю не так?
я хочу развернуть новый образ докера для службы
Мне удалось решить это сейчас. Я сделал небольшую корректировку в своем файле yml, и он сработал, добавив тег изображения


Если вы не дадите каждой сборке своего образа отдельное имя, трудно заставить Kubernetes перезапустить развертывание при изменении базового образа: у него нет возможности узнать, что «последний» тег в Docker Hub теперь означает что-то еще. (imagePullPolicy: Always, по крайней мере, заставит его получить новый образ, если он все равно перезапускается.) Когда вы запускаете kubectl apply, он просматривает загружаемое вами развертывание, видит, что оно соответствует тому, что уже запущено, и ничего не делает.
Лучшая практика - не использовать «последний» тег и давать какой-то уникальный идентификатор (временная метка, идентификатор фиксации системы контроля версий, ...). Затем вы можете обновить идентификатор изображения в спецификации модуля, kubectl apply увидит, что что-то не так, а Kubernetes выполнит за вас последовательное обновление запущенных модулей. Это также имеет то преимущество, что, если сборка плохая, вы можете легко вернуться назад, изменив тег изображения обратно на предыдущую сборку.
поэтому я попытался добавить к изображению уникальный тег, например 0d4992bcf07932cecedfb462fcace2ef9620d916. Тем не менее, он по-прежнему дает мне услугу "fourthapp" без изменений.
И вы изменили спецификацию развертывания на image: leexha/nodejsapp:0d4992bcf...916?
да. 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
Как говорит @GiorgioCerruti в своем ответе, вам нужно повторно применить развертывание. служба всегда будет неизменным.
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
Вы хотите либо изменить службу, либо развернуть новый образ докера?