You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.09 17:56:02