GCP Kubernetes Engine 未使用 GitLab CI/CD 更新我的映像更新

GCP Kubernetes Engine not updating my image updates with GitLab CI/CD

提问人:guirms 提问时间:10/1/2023 更新时间:10/2/2023 访问量:42

问:

对不起,文字太长了,但我需要详细报告

我正在使用索引.html文件构建一个非常简单的项目。我这个项目的目标是提高我的 kubernetes 技能,所以我正在做的是在 Google Cloud Plataform 中创建一个集群和一个虚拟机。我使用 Kubernetes Engine 创建集群并自动更新我的集群,我使用了 .gitlab-ci.yml。

所有管道都正常运行,没有问题。在我第一次推送更改并且管道开始运行时,所有更改都成功部署,我只需要使用以下命令在 GCP 中创建规则: gcloud compute firewall-rules create cd-cd-kube --allow tcp:30005 当我运行它时,我刚刚使用端口 30005 打开了我的外部 ip,一切正常。当我对 html 文件进行更改并再次推送它时,我的问题发生了。所有管道都运行良好,集群中的文件也已更改。一切都应该正常工作,但事实并非如此,因为当我尝试使用端口访问外部 IP 时,更改尚未应用。我还尝试运行: kubectl apply deployment.yml 但它说有文件没有要应用的更改。我还尝试使用mikinube在本地运行部署,一切正常。显然它的所有工作都很好,但页面就是不更新。我该如何解决这个问题?

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
docker kubernetes google-cloud-platform 部署 gitlab

评论


答:

0赞 Raghu 10/1/2023 #1

这里的问题是您再次使用相同的标签构建映像。

guirms/app-cicd-dio:1.0

由于部署 yaml 始终具有相同的映像版本。在部署 yaml 中没有任何更改的情况下,即使再次部署,kubectl 也不会看到部署 yaml 中的任何更改,也不会应用任何更改。

要获取最新的映像,您必须重新启动 pod。由于您具有镜像拉取策略,因此 kubernetes 将在重新启动后获取新镜像,并且不会获取节点上的缓存镜像。所以这很好。"imagePullPolicy: Always"

您需要执行以下操作来重新启动 Pod

kubectl rollout restart deployment app

这将重新启动 Pod 并获取新映像并创建一个新容器。

改变你的喜欢script.sh

#!/bin/bash

kubectl get deployment app

if [ $? -eq 0 ]; then
  kubectl rollout restart deployment app
else
  kubectl apply -f deployment.yml
fi

这将在首次部署时创建部署,随后的部署将重新启动 Pod 以帮助获取最新映像,因为映像拉取策略为“imagePullPolicy: Always”,任何重新启动都将再次获取映像。

一般建议:如果你想坚持一个固定的标签,最好把你的图片标记为“最新”,而不是总是“1.0”。

如果你想维护版本,那么你应该考虑增加你的版本,如“1.0.0”、1.0.1“......每次构建。

评论

0赞 Raghu 10/2/2023
@GuilhermeMachadoSantana 如果您觉得有用,请接受答案
0赞 guirms 10/2/2023 #2

问题基于缓存,尝试阅读有关以下内容的信息