所以我有一个部署作业,它运行一些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上的复制控制器定义,使其指向最新的图像,但原始容器仍然保留。放大确实会创建具有正确图像的容器,但一旦缩小,它就会删除最新的容器,留下具有旧图像的旧容器。
我已经确认:
- 带有新映像的新容器正在按预期工作
- 我最终手动进行了部署,并手动删除了旧容器(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
,而不是更受支持的Deployment
或ReplicaSet
。不幸的是,此时,我需要与我的团队协商迁移到该格式的最佳方式,因为我们有一些考虑因素。
与此同时,我用这个小黑客解决了这个问题。
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规范的变化。