我正在为我的 k8s 集群寻找 CD 解决方案。现在,在推送带有dev-*
标签的提交后,dockerhub 会创建标记为dev-latest
. 这是我的部署配置:
apiVersion: apps/v1
kind: Deployment
metadata:
name: my-image-backend-local-deployment
labels:
app: my-image
type: web
spec:
replicas: 2
minReadySeconds: 15
strategy:
type: RollingUpdate
rollingUpdate:
maxUnavailable: 25%
maxSurge: 1
selector:
matchLabels:
app: my-image
template:
metadata:
labels:
app: my-image
spec:
imagePullSecrets:
- name: regcred
containers:
- name: backend
image: cosmicfruit/my-image:dev-latest
imagePullPolicy: IfNotPresent
envFrom:
- secretRef:
name: my-image-backend-local-secret
ports:
- containerPort: 8000
readinessProbe:
httpGet:
path: /flvby
port: 8000
initialDelaySeconds: 10
periodSeconds: 5
- name: celery
image: cosmicfruit/my-image:dev-latest
imagePullPolicy: IfNotPresent
workingDir: /code
command: ["/code/run/celery.sh"]
envFrom:
- secretRef:
name: my-image-backend-local-secret
- name: redis
image: redis:latest
imagePullPolicy: IfNotPresent
我希望将新图像自动部署到 pod 中,但找不到相关的解决方案。
UPD
我希望在带有dev-0.1.*
(其中 * 是数字)标签的新图像被推送到注册表后自动部署我的图像。在将代码推送并内置到图像中之后,我什么也不想做。我发现了 CD 基金会的一些项目:Jenkins X、Spinnaker 和 Tekton,我想其中一些可以帮助我实现我的想法,但如果我的动物园里没有一只宠物,我会很高兴实现它。
图像参考和清单
kind: Deployment
Kubernetes 管理部署,例如,每当您的清单更改时使用滚动部署策略。这样做的主要问题是您为每个图像使用相同的标签名称。这意味着更新镜像时
kind: Deployment
清单不会更新,因此 Kubernetes 不会启动新的滚动部署,因为清单中没有任何更改。一个好的做法是每次推送镜像时使用唯一的镜像标签,然后
kind: Deployment
使用这个新的镜像标签名称更新清单,这样 Kubernetes 会自动触发新的滚动部署。某些镜像注册表可以配置为使用“不可变标签名称”,这意味着您必须始终为每个构建的镜像使用唯一的标签名称。或者,您可以在清单中使用完整的图像摘要
kind: Deployment
,这样即使标签名称相同,您也可以拥有唯一的图像引用(图像摘要是内容的哈希)。总之:
kind: Deployment
使用新标签名称更新清单kind: Deployment
清单(和其他 yaml 清单)保存在版本控制中,例如 Git流程和自动化
更新清单并将其应用到集群可以通过几种不同的方式完成,但建议在每次更改之后,在将更新的清单应用到集群之前,始终将更新的清单存储在 Git 存储库中。通过这种方式,您可以获得有关已更改内容的良好可追溯性,并且在出现故障时更容易恢复到工作版本。
通过上述所需的步骤,另一个重要的做法是为此使用自动化。在对 Git 存储库进行每次更改后,触发一个自动化流程来完成这项工作,最好不需要任何手动步骤。从历史上看,Jenkins 一直是一个流行的工具,但它已经过时了,并且不能在容器环境中很好地运行。我现在建议使用GitHub Actions、Google Cloud Build之类的工具或 Kubernetes 集群中的现代系统,例如Tekton Pipelines
使用 Tekton 构建和部署管道
如果您选择在 Kubernetes 集群中使用 Tekton,您可以像这样构建项目:
PipelineRun
.kind: Deployment
使用新的 image-digest 和 git-push 更新清单到带有清单的 repo。书籍推荐
Kubernetes Up & Running第 2 版(自 2019 年起)- 它包含一个新章节:18. 组织您的应用程序,描述如何使用清单和版本控制管理部署。
持续交付- 关于如何使用构建和部署管道和自动化的经典书籍。
备择方案
Kubernetes 上的部署可以在不使用声明性清单的情况下完成,而是使用命令式命令完成,而无需任何版本控制更改,但这对于专业环境来说确实不鼓励。尽管自动化管道需要一些时间来设置和配置,但以声明性和可重现的方式执行此操作很重要。
最后,我发现了很棒的工具“keel.sh”,它完全符合我对 kubernetes 光盘的期望