GCP Kubernetes Engine结合GitLab CI/CD镜像更新失效求助
我正在构建一个仅包含index.html文件的简单项目,目的是提升Kubernetes技能。在Google Cloud Platform(GCP)中用Kubernetes Engine搭建了集群和虚拟机,通过.gitlab-ci.yml实现集群自动更新。
首次推送变更后部署成功,我通过命令gcloud compute firewall-rules create cd-cd-kube --allow tcp:30005在GCP中创建防火墙规则,访问外部IP加30005端口可正常打开页面。
但修改index.html再次推送后,尽管流水线运行正常,集群中的文件也已变更,但访问外部IP加端口时页面未更新。执行kubectl apply deployment.yml提示无变更需要应用。本地用Minikube部署一切正常,流程看似没问题,但页面就是不更新,该如何解决?
相关文件内容
index.html
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>App version 2.1</title> </head> <body> <h1>App 2.1</h1> </body> </html>
.gitlab-ci.yml
stages: - build - deploy_gcp build_images: stage: build image: docker:20.10.16 services: - docker:20.10.16-dind variables: DOCKER_TLS_CERTDIR: "/certs" before_script: - docker login -u $REGISTRY_USER -p $REGISTRY_PASS script: - docker build -t guirms/app-cicd-dio:1.0 app/. - docker push guirms/app-cicd-dio:1.0 deploy_gcp: stage: deploy_gcp before_script: - chmod 400 $SSH_KEY script: - ssh -o StrictHostKeyChecking=no -i $SSH_KEY gcp@$SSH_SERVER "sudo rm -Rf ./ci-cd-kubernetes/ && sudo git clone https://gitlab.com/guirms/ci-cd-kubernetes.git && cd ci-cd-kubernetes && sudo chmod +x ./script.sh && ./script.sh"
deployment.yml
apiVersion: apps/v1 kind: Deployment metadata: name: app labels: app: app spec: replicas: 3 selector: matchLabels: app: app template: metadata: labels: app: app spec: containers: - name: app image: guirms/app-cicd-dio:1.0 imagePullPolicy: Always ports: - containerPort: 80 --- apiVersion: v1 kind: Service metadata: name: app-service spec: type: NodePort ports: - targetPort: 80 port: 80 nodePort: 30005 selector: app: app
script.sh
#!/bin/bash kubectl apply -f deployment.yml
Dockerfile
FROM httpd:latest WORKDIR /usr/local/apache2/htdocs/ COPY index.html /usr/local/apache2/htdocs/ EXPOSE 80
核心问题是镜像标签固定为1.0,Kubernetes检测到Deployment的镜像配置没有变化,不会触发滚动更新,即便镜像内容已经更新。以下是几种可行的解决办法:
方法1:使用动态版本标签(推荐)
每次构建时生成唯一的镜像标签(比如Git提交哈希、时间戳),确保每次构建的镜像标识不同,触发Kubernetes更新。
修改.gitlab-ci.yml的构建脚本:
script: - TAG=$(git rev-parse --short HEAD) # 用短提交哈希作为标签 - docker build -t guirms/app-cicd-dio:$TAG app/. - docker push guirms/app-cicd-dio:$TAG
同时在script.sh中动态替换deployment.yml里的镜像标签:
#!/bin/bash TAG=$(git rev-parse --short HEAD) sed -i "s/girms\/app-cicd-dio:1.0/girms\/app-cicd-dio:$TAG/g" deployment.yml kubectl apply -f deployment.yml
方法2:手动触发滚动更新
如果暂时不想修改标签机制,可以在部署时强制触发Deployment滚动更新,让Kubernetes重新拉取镜像并创建新Pod:
kubectl rollout restart deployment/app
把这个命令加到script.sh中,确保每次部署都执行:
#!/bin/bash kubectl apply -f deployment.yml kubectl rollout restart deployment/app
方法3:使用latest标签(不推荐)
将镜像标签改为latest,Kubernetes会尝试拉取最新镜像,但这种方式容易引发缓存问题,且不利于版本追溯,生产环境不建议使用。只需修改构建脚本和deployment.yml中的镜像标签为latest即可。
内容的提问来源于stack exchange,提问作者guirms

