Docker Kubernates播客:最新图片发布
我在生产环境中使用Kubernates我是这类配置的新手,这是我的一个解聚文件的示例,其中有一些更改:Docker Kubernates播客:最新图片发布,docker,kubernetes,travis-ci,Docker,Kubernetes,Travis Ci,我在生产环境中使用Kubernates我是这类配置的新手,这是我的一个解聚文件的示例,其中有一些更改: apiVersion: apps/v1 kind: Deployment metadata: name: myProd labels: app: thisIsMyProd spec: replicas: 3 selector: matchLabels: app: thisIsMyProd template: metadata:
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
最后是deploy-production.sh脚本:
下面是我的问题:
travis完成工作后,deploy-production.sh脚本将运行,当它要合并到主分支时,现在我关心kubectl步骤,这是第一次部署,当我们应用部署时,它将从DockerUp中提取映像并尝试运行它们,之后,set image命令将运行,以更改这些解聚物的图像。这会使部署发生两次吗
当我第二次尝试部署时,我注意到部署使用了最新映像中的旧版本,因为它在本地找到了它。搜索后,我找到imagePullPolicy,并将其设置为“始终”。但是假设我没有使用imagePullPolicy属性,那么在这种情况下会发生什么呢?我知道第一个apply命令的旧版本代码容器。但是运行设置映像是否可以解决这个问题?为了澄清我的问题,kubernetes是否使用了一些随机的方法来选择即将坠落的吊舱?就像它没有用命令运行的顺序标记pod一样,它会检测到set image pod应该保留,而apply pod是需要终止的pod
每次拉不是都有害吗?我是否应该总是以某种方式使部署映像不使用最新的映像,以消除这种麻烦
谢谢
如果“应用”和“设置映像”中的映像标记相同,则只有“应用”操作才能重新部署部署,在这种情况下,您不需要“设置映像”命令。如果它们引用不同的图像标记,则是,部署将运行两次
如果使用最新标记,则应用使用最新标记且未经修改的清单不会重新部署部署。您需要对清单文件进行修改,以强制Kubernetes重新部署。和我的例子一样,我使用date命令生成一个TIMESTAMP变量,该变量在pod容器的env spec中传递,我的容器不以任何方式使用它,只是为了强制重新部署部署。如果您使用的是Kubernetes 1.15或更高版本,也可以使用kubectl卷展栏重新启动部署/名称
除了浪费带宽,或者如果你被收取多少次你拉一个docker图像穷人你,没有任何伤害与额外的图像拉只是为了确保你使用的是最新的图像版本。即使您使用具有版本号(如1.10.112-rc5)的特定图像标记,也会出现这样的情况:您或您的开发伙伴在推送修改后的图像版本时忘记更新版本号。IMHO,imagePullPolicy=始终应为默认值,而不是显式要求
避免…:最新的可能是可取的。像Kustomize或Helm这样的模板层可以帮助您避免部署YAML文件,然后修改其图像设置。
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
#!/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