我正在为我的 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 中,但找不到相关的解决方案。
更新型多巴胺
我希望在将带有(其中 * 是数字)标签的新映像推送到注册表后自动部署映像dev-0.1.*
。在将代码推送并构建到映像中后,我不想执行任何操作。我发现了一些 CD Foundation 的项目:Jenkins X、Spinnaker 和 Tekton,我想其中一些可以帮助我实现我的想法,但如果我的动物园里没有一只宠物,我会很高兴实现它。
答案1
图片参考和清单
kind: Deployment
Kubernetes 管理部署,例如每当清单发生更改时使用滚动部署策略。
现在,在推送带有 dev-* 标签的提交后,dockerhub 将创建标记为 dev-latest 的新镜像
这样做的主要问题是你使用相同的每个图像的标签名称。这意味着您的kind: Deployment
清单是不是当您的图像更新时也会更新,因此 Kubernetes 不会启动新的滚动部署,因为清单中没有更改。
一个好的做法是每次推送图像时使用唯一的图像标签,然后kind: Deployment
使用这个新的图像标签名称更新清单,这样 Kubernetes 就会自动触发新的滚动部署。
一些镜像注册表可以配置为使用“不可变的标签名称”,这意味着你强制执行始终为每个构建的图像使用唯一的标签名称。或者,您可以使用完整图像摘要在kind: Deployment
清单中,这样即使标签名称相同,您也可以拥有唯一的图像引用(图像摘要是内容的哈希值)。
总之:
- 每次构建都使用唯一的图像标签名称
kind: Deployment
使用新的标签名称更新清单kind: Deployment
将清单(和其他 yaml 清单)保存在版本控制中,例如 Git- 引用图像时请考虑使用清单中的完整图像摘要
流程与自动化
更新清单并将其应用于集群有多种不同的方法,但建议在每次更改后,在将其应用于集群之前,始终将更新后的清单存储在 Git 存储库中。这样,您就可以很好地跟踪更改的内容,如果出现故障,也可以更轻松地恢复到正常工作的版本。
除了上述步骤之外,另一个重要做法是使用自动化为此。每次更改 Git 存储库后,触发一个自动化流程来完成工作,最好没有任何手动步骤。从历史上看,Jenkins 一直是一个流行的工具,但它已经过时了,并且不适合在容器环境中运行。我现在建议使用类似GitHub 操作,谷歌云构建或者 Kubernetes 集群中的现代系统,例如Tekton 管道
使用 Tekton 构建和部署管道
如果您选择在 Kubernetes 集群中使用 Tekton,则可以像这样构建项目:
- 将代码变更 Git 推送到代码存储库
- ATekton 触发器从 Git 系统接收事件并启动新的
PipelineRun
。 - 这Tekton 管道包含 git-clone、构建代码、运行测试以及构建和推送图像的步骤。结果是图像摘要或标签。然后,管道中还有最后一个任务,如果所有先前的任务都成功,则
kind: Deployment
使用新的图像摘要更新清单,并使用清单进行 git-push 到存储库。 - 触发部署管道,将清单应用于集群(可能使用选择的部署策略、滚动部署、逐步部署或金丝雀部署)
书籍推荐
Kubernetes 启动并运行第二版(自 2019 年起)- 包含一个新章节:18. 组织你的应用程序描述如何使用清单和版本控制来管理部署。
持续交付- 一本关于如何使用的经典书籍构建和部署管道和自动化。
备择方案
我发现了 CD 基金会的一些项目:Jenkins X、Spinnaker 和 Tekton,我想其中一些可以帮助我实现我的想法,但如果我的动物园里没有再多一只宠物,我会很高兴实现它。
Kubernetes 上的部署能无需使用声明式清单即可完成,而是使用命令式命令没有任何版本控制的更改,但是这是真的很沮丧适用于专业环境。虽然自动化管道需要一些时间来设置和配置,但以声明性和可重复的方式执行此操作非常重要。
答案2
最后我发现了一个很棒的工具“keel.sh”,它完全符合我对 kubernetes CD 的期望