我目前有一个 GitHub 存储库,其中包含我的应用程序代码和 Kubernetes 部署配置文件(名为 deployment.yml
)。即,我的存储库具有以下结构:
repository
+- ...application code...
+- Dockerfile
\- deployment.yml
将更改推送到此 GitHub 存储库时,将执行一系列 GitHub 操作,将我的应用程序容器化为 Docker 映像并将该映像发布到 Docker Hub。
在开发机器上,我有一个 Kubernetes 集群正在运行。我从存储库中提取 deployment.yml
文件,然后使用 kubectl apply -f deployment.yml
应用该配置或使用 kubectl rollout restart deployment/<name>
执行滚动更新。
我的 deployment.yml
配置如下:
apiVersion: apps/v1
kind: Deployment
metadata:
...
spec:
replicas: 1
...
template:
...
spec:
containers:
- name: <name>
image: foo/bar:v1.0.0
imagePullPolicy: IfNotPresent
ports:
- containerPort: <port>
imagePullSecrets:
- name: <creds-id>
图像的版本(即 v1.0.0
中的 foo/bar:v1.0.0
)源自我在 Git 中使用的标签。即,如果我将提交标记为 v1.0.0
,则会为该标记运行一个新构建,并将一个新的 Docker 映像发布到带有标记 v1.0.0
的 Docker Hub。
我的问题是我将 Kubernetes 配置 (deployment.yml
) 存储在被标记的同一个存储库中。这意味着我正在标记一个包含 v2.0.0
中的 foo/bar:v1.0.0
图像的提交(即 deployment.yml
)。即,我对代码进行更改,然后在这些更改足够时决定,将标记特定的提交。由于我希望我的开发机器上的集群使用最新的、批准的(即标记的)代码,然后我去更新 deployment.yml
并提交,但新提交是在标记提交之后。
要解决此问题,我必须为我知道将被标记的提交更改 deployment.yml
文件。即,知道我所做的下一次提交将被标记为 v2.0.0
,我将不得不更改 deployment.yml
以使用图像 foo/bar:v2.0.0
并将该更改添加到提交(即一个被标记)。在这种情况下,标记为 v2.0.0
的提交将在其 foo/bar:v2.0.0
中包含 deployment.yml
的图像。
是否有可以解决此问题的技术或最佳实践(例如模板或其他实践)?
谢谢。