kubectl用最新的图像去除豆荚,并保留旧的



所以我有一个部署作业,它运行一些kubectl命令。一个配置文件被修改为使用最新的docker镜像SHA,我运行以下命令来部署它:

kubectl apply -f myconfig-file.yaml
#we have to scale up temporarily due to reasons beyond the purview of this question
kubectl scale -f myconfig-file.yaml --replicas=4
#* wait a minute or so *
sleep 60
kubectl scale -f myconfig-file.yaml --replicas=2

Apply正确更新了Google Cloud上的复制控制器定义,使其指向最新的图像,但原始容器仍然保留。放大确实会创建具有正确图像的容器,但一旦缩小,它就会删除最新的容器,留下具有旧图像的旧容器。

我已经确认:

  1. 带有新映像的新容器正在按预期工作
  2. 我最终手动进行了部署,并手动删除了旧容器(k8s正确地使用最新的映像创建了两个新容器(,当我缩小规模时,带有新映像的新容器会被卡住。我的应用程序按预期运行

我的yaml文件有问题:

apiVersion: v1
kind: ReplicationController
metadata:
name: my-app-cluster
spec:
replicas: 2
template:
metadata:
labels:
run: my-app-cluster
spec:
containers:
- image: mySuperCoolImage@sha256:TheLatestShaHere
imagePullPolicy: Always
name: my-app-cluster
ports:
- containerPort: 8008
protocol: TCP
terminationGracePeriodSeconds: 30

我正在使用谷歌云K8s FWIW。我需要在YAML文件中做一些事情来指示k8s销毁旧实例吗?

因此,我的大部分问题似乎源于我使用的是ReplicationController,而不是更受支持的DeploymentReplicaSet。不幸的是,此时,我需要与我的团队协商迁移到该格式的最佳方式,因为我们有一些考虑因素。

与此同时,我用这个小黑客解决了这个问题。

oldPods=($(kubectl get pods | grep myPodType | perl -wnE'say /.*-myPodType-w*/g'))
#do the apply and scale thing like listed above
#then delete
for item in ${oldPods[@]}; do kubectl delete pod $item; done

当您使用新的image标记更新部署定义时,您不需要放大/缩小。部署应该启动新的pod,并删除自己有旧映像的pod,使用缩放只会使过程复杂化,而且正如您所注意到的,它在决定删除哪些pod时没有考虑pod规范的变化。

最新更新