如何将 Kubernetes 配置存储在与代码相同的存储库中?
How do I store Kubernetes configuration in same repository as code?
我目前有一个 GitHub 存储库,其中包含我的应用程序代码和一个 Kubernetes 部署配置文件(称为 deployment.yml
)。即,我的存储库具有以下结构:
repository
+- ...application code...
+- Dockerfile
\- deployment.yml
将更改推送到此 GitHub 存储库时,将执行一系列 GitHub 操作,将我的应用程序容器化到 Docker 映像中,并将该映像发布到 Docker 枢纽.
在一台开发机器上,我有一个 Kubernetes 集群 运行ning。我从存储库中提取 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>
图像的版本(即 foo/bar:v1.0.0
中的 v1.0.0
)源自我在 Git 中使用的标签。即,如果我将提交标记为 v1.0.0
,则该标记的新构建是 运行,并且新的 Docker 图像发布到 Docker Hub,标记为 [=17] =].
我的问题是我将我的 Kubernetes 配置 (deployment.yml
) 存储在被标记的同一个存储库中。这意味着我正在标记包含 deployment.yml
中 foo/bar:v1.0.0
图像的提交(即 v2.0.0
)。也就是说,我对我的代码进行了更改,然后决定一旦这些更改足够了,就会标记一个特定的提交。由于我希望我的开发机器上的集群使用最新的、批准的(即标记的)代码,然后我去更新 deployment.yml
并提交,但是新的提交是在标记的提交之后。
要解决这个问题,我必须更改 deployment.yml
文件,以便我知道将被标记的提交。也就是说,知道我所做的下一次提交将被标记为 v2.0.0
,我将不得不更改 deployment.yml
以使用图像 foo/bar:v2.0.0
并将该更改添加到提交中(即,一个要标记)。在这种情况下,标记为 v2.0.0
的提交将在其 deployment.yml
.
中具有 foo/bar:v2.0.0
的图像
是否有可以解决此问题的技术或最佳实践(例如模板或其他实践)?
谢谢。
Helm 模板也是一个不错的选择,但是如果您的项目是基本的并且没有太多要求,请使用此基本方法保持 deployment.yaml 以回购简单的方式。
理想情况下,您可以尽可能保持 部署 文件动态,而不是将值固定到外接程序。
apiVersion: apps/v1beta2
kind: Deployment
metadata:
name: test-image
labels:
app: test-image
spec:
selector:
matchLabels:
app: test-image
tier: frontend
strategy:
type: RollingUpdate
template:
metadata:
labels:
app: test-image
tier: frontend
spec:
containers:
- image: TEST_IMAGE_NAME
name: test-image
ports:
- containerPort: 8080
name: http
- containerPort: 443
name: https
并且在 YAML CI 配置中,我们更改 IMAGE URL 根据需要在 deployment.yaml 文件中。
Google could build
CI 文件示例,但是您可以在 YAML CI
中编写或更新逻辑
steps:
- id: 'set test core image in yamls'
name: 'ubuntu'
args: ['bash','-c','sed -i "s,TEST_IMAGE_NAME,gcr.io/$PROJECT_ID/$REPO_NAME/$BRANCH_NAME:$SHORT_SHA," deployment.yaml']
在你的过程中,YAML文件和运行时间将字符串替换成你想要的URL补充。
Git 将为您提供必要的变量,例如 COMMIT HASH 或 TAGGED VERSION.
示例 CI 文件 YAML 文件,
steps:
- id: 'build test core image'
name: 'gcr.io/cloud-builders/docker'
args: ['build', '-t', 'gcr.io/$PROJECT_ID/$REPO_NAME/$BRANCH_NAME:$SHORT_SHA', '.']
- id: 'push test image'
name: 'gcr.io/cloud-builders/docker'
args: ['push', 'gcr.io/$PROJECT_ID/$REPO_NAME/$BRANCH_NAME:$SHORT_SHA']
- id: 'set test core image in yamls'
name: 'ubuntu'
args: ['bash','-c','sed -i "s,TEST_IMAGE_NAME,gcr.io/$PROJECT_ID/$REPO_NAME/$BRANCH_NAME:$SHORT_SHA," deployment.yaml']
- name: 'gcr.io/cloud-builders/kubectl'
args: ['apply', '-f', 'deployment.yaml']
在您的 deployment.yaml
中将有一个字符串 TEST_IMAGE_NAME
将在 CI
操作期间被替换
使用简单的 ubuntu 命令 sed : sed -i "s,TEST_IMAGE_NAME,gcr.io/$PROJECT_ID/$REPO_NAME/$BRANCH_NAME:$SHORT_SHA," deployment.yaml
$SHORT_SHA
等变量将由 Github 自动注入或添加,所以现在在您的 CI 服务器上 你有一个 deployment.yaml
和 Image-URL
你已经推送到 docker 集线器。
我们在 CI 期间动态替换了 deployment.yaml
中的 TEST_IMAGE_NAME
字符串。
现在您可以从 CI 服务器应用此 deployment.yaml
,它会更新或将部署推送到 K8s 集群 运行宁.
注 :
如果你也想在 repo 中存储配置,你可以从 CI 服务器 repo 提交回文件,你必须存储 3
部署文件,dev-deploymentl.yaml
, stag-deployment.yaml
如果任何分支有任何更改,您可以将该文件从 CI 服务器再次提交到 repo,您的 YAML 配置也将保存在 repo 中。
我目前有一个 GitHub 存储库,其中包含我的应用程序代码和一个 Kubernetes 部署配置文件(称为 deployment.yml
)。即,我的存储库具有以下结构:
repository
+- ...application code...
+- Dockerfile
\- deployment.yml
将更改推送到此 GitHub 存储库时,将执行一系列 GitHub 操作,将我的应用程序容器化到 Docker 映像中,并将该映像发布到 Docker 枢纽.
在一台开发机器上,我有一个 Kubernetes 集群 运行ning。我从存储库中提取 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>
图像的版本(即 foo/bar:v1.0.0
中的 v1.0.0
)源自我在 Git 中使用的标签。即,如果我将提交标记为 v1.0.0
,则该标记的新构建是 运行,并且新的 Docker 图像发布到 Docker Hub,标记为 [=17] =].
我的问题是我将我的 Kubernetes 配置 (deployment.yml
) 存储在被标记的同一个存储库中。这意味着我正在标记包含 deployment.yml
中 foo/bar:v1.0.0
图像的提交(即 v2.0.0
)。也就是说,我对我的代码进行了更改,然后决定一旦这些更改足够了,就会标记一个特定的提交。由于我希望我的开发机器上的集群使用最新的、批准的(即标记的)代码,然后我去更新 deployment.yml
并提交,但是新的提交是在标记的提交之后。
要解决这个问题,我必须更改 deployment.yml
文件,以便我知道将被标记的提交。也就是说,知道我所做的下一次提交将被标记为 v2.0.0
,我将不得不更改 deployment.yml
以使用图像 foo/bar:v2.0.0
并将该更改添加到提交中(即,一个要标记)。在这种情况下,标记为 v2.0.0
的提交将在其 deployment.yml
.
foo/bar:v2.0.0
的图像
是否有可以解决此问题的技术或最佳实践(例如模板或其他实践)?
谢谢。
Helm 模板也是一个不错的选择,但是如果您的项目是基本的并且没有太多要求,请使用此基本方法保持 deployment.yaml 以回购简单的方式。
理想情况下,您可以尽可能保持 部署 文件动态,而不是将值固定到外接程序。
apiVersion: apps/v1beta2
kind: Deployment
metadata:
name: test-image
labels:
app: test-image
spec:
selector:
matchLabels:
app: test-image
tier: frontend
strategy:
type: RollingUpdate
template:
metadata:
labels:
app: test-image
tier: frontend
spec:
containers:
- image: TEST_IMAGE_NAME
name: test-image
ports:
- containerPort: 8080
name: http
- containerPort: 443
name: https
并且在 YAML CI 配置中,我们更改 IMAGE URL 根据需要在 deployment.yaml 文件中。
Google could build
CI 文件示例,但是您可以在 YAML CI
steps:
- id: 'set test core image in yamls'
name: 'ubuntu'
args: ['bash','-c','sed -i "s,TEST_IMAGE_NAME,gcr.io/$PROJECT_ID/$REPO_NAME/$BRANCH_NAME:$SHORT_SHA," deployment.yaml']
在你的过程中,YAML文件和运行时间将字符串替换成你想要的URL补充。
Git 将为您提供必要的变量,例如 COMMIT HASH 或 TAGGED VERSION.
示例 CI 文件 YAML 文件,
steps:
- id: 'build test core image'
name: 'gcr.io/cloud-builders/docker'
args: ['build', '-t', 'gcr.io/$PROJECT_ID/$REPO_NAME/$BRANCH_NAME:$SHORT_SHA', '.']
- id: 'push test image'
name: 'gcr.io/cloud-builders/docker'
args: ['push', 'gcr.io/$PROJECT_ID/$REPO_NAME/$BRANCH_NAME:$SHORT_SHA']
- id: 'set test core image in yamls'
name: 'ubuntu'
args: ['bash','-c','sed -i "s,TEST_IMAGE_NAME,gcr.io/$PROJECT_ID/$REPO_NAME/$BRANCH_NAME:$SHORT_SHA," deployment.yaml']
- name: 'gcr.io/cloud-builders/kubectl'
args: ['apply', '-f', 'deployment.yaml']
在您的 deployment.yaml
中将有一个字符串 TEST_IMAGE_NAME
将在 CI
操作期间被替换
使用简单的 ubuntu 命令 sed : sed -i "s,TEST_IMAGE_NAME,gcr.io/$PROJECT_ID/$REPO_NAME/$BRANCH_NAME:$SHORT_SHA," deployment.yaml
$SHORT_SHA
等变量将由 Github 自动注入或添加,所以现在在您的 CI 服务器上 你有一个 deployment.yaml
和 Image-URL
你已经推送到 docker 集线器。
我们在 CI 期间动态替换了 deployment.yaml
中的 TEST_IMAGE_NAME
字符串。
现在您可以从 CI 服务器应用此 deployment.yaml
,它会更新或将部署推送到 K8s 集群 运行宁.
注 :
如果你也想在 repo 中存储配置,你可以从 CI 服务器 repo 提交回文件,你必须存储 3
部署文件,dev-deploymentl.yaml
, stag-deployment.yaml
如果任何分支有任何更改,您可以将该文件从 CI 服务器再次提交到 repo,您的 YAML 配置也将保存在 repo 中。