AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / server / 问题 / 1048018
Accepted
Vassily
Vassily
Asked: 2020-12-30 23:55:47 +0800 CST2020-12-30 23:55:47 +0800 CST 2020-12-30 23:55:47 +0800 CST

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

  • 772

我正在为我的 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,我想其中一些可以帮助我实现我的想法,但如果我的动物园里没有一只宠物,我会很高兴实现它。

deployment kubernetes
  • 2 2 个回答
  • 1052 Views

2 个回答

  • Voted
  1. Jonas
    2020-12-31T14:54:57+08:002020-12-31T14:54:57+08:00

    图像参考和清单

    kind: DeploymentKubernetes 管理部署,例如,每当您的清单更改时使用滚动部署策略。

    现在,在使用 dev-* 标记推送提交后,dockerhub 会创建标记为 dev-latest 的新图像

    这样做的主要问题是您为每个图像使用相同的标签名称。这意味着更新镜像时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,您可以像这样构建项目:

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

    书籍推荐

    • Kubernetes Up & Running第 2 版(自 2019 年起)- 它包含一个新章节:18. 组织您的应用程序,描述如何使用清单和版本控制管理部署。

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

    备择方案

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

    Kubernetes 上的部署可以在不使用声明性清单的情况下完成,而是使用命令式命令完成,而无需任何版本控制更改,但这对于专业环境来说确实不鼓励。尽管自动化管道需要一些时间来设置和配置,但以声明性和可重现的方式执行此操作很重要。

    • 1
  2. Best Answer
    Vassily
    2021-03-04T22:21:54+08:002021-03-04T22:21:54+08:00

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

    • 0

相关问题

  • 网络监控产品公司的部署工程师需要具备哪些技能?[关闭]

  • Mac OS X 的无人值守安装

  • Firefox 打包以包含用于网络安装的插件

  • 我应该将 Rails 应用程序部署到哪个目录?

  • 将 iChat 设置部署到多个用户

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    新安装后 postgres 的默认超级用户用户名/密码是什么?

    • 5 个回答
  • Marko Smith

    SFTP 使用什么端口?

    • 6 个回答
  • Marko Smith

    命令行列出 Windows Active Directory 组中的用户?

    • 9 个回答
  • Marko Smith

    什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同?

    • 3 个回答
  • Marko Smith

    如何确定bash变量是否为空?

    • 15 个回答
  • Martin Hope
    Tom Feiner 如何按大小对 du -h 输出进行排序 2009-02-26 05:42:42 +0800 CST
  • Martin Hope
    Noah Goodrich 什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同? 2009-05-19 18:24:42 +0800 CST
  • Martin Hope
    Brent 如何确定bash变量是否为空? 2009-05-13 09:54:48 +0800 CST
  • Martin Hope
    cletus 您如何找到在 Windows 中打开文件的进程? 2009-05-01 16:47:16 +0800 CST

热门标签

linux nginx windows networking ubuntu domain-name-system amazon-web-services active-directory apache-2.4 ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve