如何自动将新的docker镜像从dockerhub部署到kubernetes?

如何自动将新的docker镜像从dockerhub部署到kubernetes?

我正在为我的 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: DeploymentKubernetes 管理部署,例如每当清单发生更改时使用滚动部署策略。

现在,在推送带有 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,则可以像这样构建项目:

  1. 将代码变更 Git 推送到代码存储库
  2. ATekton 触发器从 Git 系统接收事件并启动新的PipelineRun
  3. Tekton 管道包含 git-clone、构建代码、运行测试以及构建和推送图像的步骤。结果是图像摘要或标签。然后,管道中还有最后一个任务,如果所有先前的任务都成功,则kind: Deployment使用新的图像摘要更新清单,并使用清单进行 git-push 到存储库。
  4. 触发部署管道,将清单应用于集群(可能使用选择的部署策略、滚动部署、逐步部署或金丝雀部署)

书籍推荐

  • Kubernetes 启动并运行第二版(自 2019 年起)- 包含一个新章节:18. 组织你的应用程序描述如何使用清单和版本控制来管理部署。

  • 持续交付- 一本关于如何使用的经典书籍构建和部署管道和自动化。

备择方案

我发现了 CD 基金会的一些项目:Jenkins X、Spinnaker 和 Tekton,我想其中一些可以帮助我实现我的想法,但如果我的动物园里没有再多一只宠物,我会很高兴实现它。

Kubernetes 上的部署无需使用声明式清单即可完成,而是使用命令式命令没有任何版本控制的更改,但是这是真的很沮丧适用于专业环境。虽然自动化管道需要一些时间来设置和配置,但以声明性和可重复的方式执行此操作非常重要。

答案2

最后我发现了一个很棒的工具“keel.sh”,它完全符合我对 kubernetes CD 的期望

相关内容