提问人:guirms 提问时间:10/1/2023 更新时间:10/2/2023 访问量:42
GCP Kubernetes Engine 未使用 GitLab CI/CD 更新我的映像更新
GCP Kubernetes Engine not updating my image updates with GitLab CI/CD
问:
对不起,文字太长了,但我需要详细报告。
我正在使用索引.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
答:
这里的问题是您再次使用相同的标签构建映像。
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“......每次构建。
评论
问题基于缓存,尝试阅读有关以下内容的信息
评论