Я использую Kubernates для производственной среды (я новичок в такого рода конфигурации). Это пример для одного из моих файлов деполяции (с изменениями):
apiVersion: apps/v1
kind: Deployment
metadata:
name: myProd
labels:
app: thisIsMyProd
spec:
replicas: 3
selector:
matchLabels:
app: thisIsMyProd
template:
metadata:
labels:
app: thisIsMyProd
spec:
containers:
- name: myProd
image: DockerUserName/MyProdProject # <==== Latest
ports:
- containerPort: 80
Теперь я хотел, чтобы он работал с travis ci
, поэтому я сделал что-то похожее на это:
sudo: required
services:
- docker
env:
global:
- LAST_COMMIT_SHA=$(git rev-parse HEAD)
- SERVICE_NAME=myProd
- DOCKER_FILE_PATH=.
- DOCKER_CONTEXT=.
addons:
apt:
packages:
- sshpass
before_script:
- docker build -t $SERVICE_NAME:latest -f $DOCKER_FILE_PATH $DOCKER_CONTEXT
script:
# Mocking run test cases
deploy:
- provider: script
script: bash ./deployment/deploy-production.sh
on:
branch: master
И, наконец, вот скрипт deploy-production.sh
:
#!/usr/bin/env bash
# Log in to the docker CLI
echo "$DOCKER_PASSWORD" | docker login -u "$DOCKER_USERNAME" --password-stdin
# Build images
docker build -t $DOCKER_USERNAME/$SERVICE_NAME:latest -t $DOCKER_USERNAME/$SERVICE_NAME:$LAST_COMMIT_SHA -f $DOCKER_FILE_PATH $DOCKER_CONTEXT
# Take those images and push them to docker hub
docker push $DOCKER_USERNAME/$SERVICE_NAME:latest
docker push $DOCKER_USERNAME/$SERVICE_NAME:$LAST_COMMIT_SHA
# Run deployment script in deployment machine
export SSHPASS=$DEPLOYMENT_HOST_PASSWORD
ssh-keyscan -H $DEPLOYMENT_HOST >> ~/.ssh/known_hosts
# Run Kubectl commands
kubctl apply -f someFolder
kubctl set image ... # instead of the `...` the rest command that sets the image with SHA to the deployments
Теперь вот мои вопросы:
Когда travis
fini sh его работа, скрипт deploy-production.sh
с run, когда речь идет о слиянии с веткой master
, Теперь у меня есть беспокойство по поводу шага kubectl
, при первом развертывании, когда мы apply
развернем, он будет pull
image
из dockerhup и попытается запустить их, после этого команда set image запустит изменение образа эти деполяции. Будет ли это делать развертывание дважды?
Когда я попытался развернуть во второй раз, я заметил, что развертывание использовало старую версию из latest
образа, потому что он нашел его локально , После поиска я нашел imagePullPolicy
и установил always
. Но представьте, что я не использовал этот атрибут imagePullPolicy
, что бы на самом деле произошло в этом случае? Я знаю, что контейнеры кода старой версии для первой команды apply
. Но разве установленный образ не исправит это? Чтобы прояснить мой вопрос, использует ли kubernetes какой-то случайный способ для выбора стручков, которые идут на go вниз? Как будто он не помечает стручки в порядке, в котором выполняются команды, поэтому он обнаружит, что установленные стручки изображений должны остаться, а стручки apply
должны быть прерваны?
Не тянет ли каждый раз вредно? Должен ли я всегда делать образ развертывания каким-то образом, чтобы не использовать latest
, лучше стереть эту неприятность?
Спасибо