具有语义容器名称的 Kubernetes 部署滚动更新

Kubernetes deployment rolling update with semantic container names

我想使用 Kubernetes deployment 并引用带有语义标签名称的容器镜像。例如。 application:latest, application:testing, application:production.

设置这个很简单,并且在我的容器规范中使用 imagePullPolicy: Always 我也可以使用类似这样的东西快速推出新版本:

 $ REPLICAS=$(kubectl get deployment application --template="{{.spec.replicas}}")
 $ kubectl scale --replicas=0 deployment application
 deployment "application" scaled
 $ kubectl scale --replicas=$REPLICAS deployment application
 deployment "application" scaled

缺点是所有 pods 在新的准备好之前就被杀死了。因此,我希望获得滚动更新。

一个解决方案是删除语义标签名称并使用某物。喜欢 application:v123。但我希望保持脚本简单并保留语义名称。有什么办法吗?

...

Edit/update ...这就是我的 deployment.yaml 配置的样子:

apiVersion: extensions/v1beta1
 kind: Deployment
 metadata:
   name: nginx-deployment
 spec:
   replicas: 3
   template:
     metadata:
       labels:
         app: application
     spec:
       containers:
       - name: application
         image: application:latest
         imagePullPolicy: Always

基本上一直保持不变,但是相关的容器镜像在后台更新。

...

干杯

抱歉,我可能误解了问题,但你为什么不使用

kubectl apply -f

(参考 here

然后您可以决定部署设置的速度

  • 最大浪涌
  • 最大不可用

在您的部署文件中。 (参考 here

似乎使用一个语义标签是不可能的。这是我开始使用两个或更多标签的内容。

1) 计算我们当前部署的内容:

 DEPLOYED_IMAGE=$(kubectl get deployment/nginx-deployment -o jsonpath="{.spec.template.spec.containers[0].image}")

2) 找到未使用的标签:

if [[ "$DEPLOYED_IMAGE" =~ :green$ ]]; then 
   IMAGE="application:latest-blue"
else 
   IMAGE="application:latest-green"
fi

3) 使用新标签构建镜像:

docker build -t $IMAGE .
docker push $IMAGE

4) 部署

kubectl set image deployment/nginx-deployment application=$IMAGE

5) 等待部署完成

kubectl rollout status deployment nginx-deployment -w