前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >数据库的GITOPS第二部分 – Atlas Operator和ArgoCD

数据库的GITOPS第二部分 – Atlas Operator和ArgoCD

作者头像
云云众生s
发布2024-03-28 15:06:02
860
发布2024-03-28 15:06:02
举报
文章被收录于专栏:云云众生s云云众生s

本文是两部分教程的第 2 部分,演示了如何结合使用 Atlas OperatorAtlas CloudArgoCD,为在 Kubernetes 中管理数据库迁移创建一个时尚的 GitOps 工作流程。译自 GitOps for Databases, Part 2: Atlas Operator and ArgoCD。作者 Rotem Tamir 。

在第 1 部分中,我们演示了如何初始化一个 Atlas 项目,并创建一个 CI/CD 流水线,通过 GitHub Actions 自动计划、验证和存储数据库迁移到 Atlas Cloud。

在这一部分,我们将展示如何使用 Atlas Operator 和 ArgoCD 来部署这些迁移,以演示数据库迁移的完整 GitOps 工作流程。

如何在 Kubernetes 上 GitOps 你的数据库迁移

"我们可以把现有的 schema 管理解决方案装入容器,并以 Kubernetes Jobs 的形式在 Kubernetes 中运行它们。但这很傻。这不是我们在 Kubernetes 中工作的方式。" -Viktor Farcic,DevOps 工具包

随着应用程序的演进,其数据库模式也在演进。自动化部署数据库模式变更的实践随着现代 DevOps 原则的发展而进化成为所谓的数据库迁移。作为这一演进过程的一部分,已经创建了数百种“迁移工具”来帮助开发人员管理他们的数据库迁移。这些工具范围从面向 Python 的 Alembic 等 ORM 和特定语言的工具,到语言无关的工具如 FlywayLiquibase

当 Kubernetes 出现时,团队开始将他们的应用程序容器化,本能反应是将这些传统工具封装在一个容器中,并在应用程序部署过程中运行它们。我们在最近的 KubeCon 演讲和更早的网络研讨会中讨论了这种方法的一些缺点。

Atlas 从零开始创建,是一种现代数据库迁移工具,它体现了现代 DevOps 原则,并且设计为在 Kubernetes 中原生运行。Atlas Operator 使团队能够使用代表数据库 schema 和迁移的新资源类型扩展本地 Kubernetes API。通过使用这些功能,可以将数据库迁移原生集成到 GitOps 工作流程中。

前提条件:

  • 运行的 Kubernetes 集群 - 出于学习目的,您可以使用 Minikube,这是一个在笔记本电脑上运行单节点 Kubernetes 集群的工具。
  • kubectl - 与 Kubernetes 集群交互的命令行工具。
  • Helm - Kubernetes 的包管理器。

设置 Atlas Operator 和 ArgoCD:

1. 安装 ArgoCD

要安装 ArgoCD,请运行以下命令:

代码语言:javascript
复制
kubectl create namespace argocd
kubectl apply -n argocd -f https://raw.githubusercontent.com/argoproj/argo-cd/stable/manifests/install.yaml

等待 argocd 命名空间中的所有 pod 都处于运行状态:

代码语言:javascript
复制
kubectl wait --for=condition=ready pod --all -n argocd

kubectl 会打印出类似下面的信息:

代码语言:javascript
复制
pod/argocd-application-controller-0 condition met
pod/argocd-applicationset-controller-69dbc8585c-6qbwr condition met 
pod/argocd-dex-server-59f89468dc-xl7rg condition met
pod/argocd-notifications-controller-55565589db-gnjdh condition met
pod/argocd-redis-74cb89f466-gzk4f condition met
pod/argocd-repo-server-68444f6479-mn5gl condition met
pod/argocd-server-579f659dd5-5djb5 condition met

如果遇到一些错误,请参考 Argo CD 文档以获取更多信息。

2. 安装 Atlas Operator

代码语言:javascript
复制
helm install atlas-operator oci://ghcr.io/ariga/charts/atlas-operator

Helm 会打印出类似下面的信息:

代码语言:javascript
复制
Pulled: ghcr.io/ariga/charts/atlas-operator:0.3.6
Digest: sha256:7e29c15e846fa9c25164f4ad5a7cb7f25e9ead2882082f0352985e58c1976f99
NAME: atlas-operator
LAST DEPLOYED: Mon Dec 11 10:25:11 2023
NAMESPACE: default
STATUS: deployed
REVISION: 1
TEST SUITE: None

等待 atlas-operator pod 处于运行状态:

代码语言:javascript
复制
kubectl wait --for=condition=ready pod -l app.kubernetes.io/name=atlas-operator -n default

kubectl 会打印出类似下面的信息:

代码语言:javascript
复制
pod/atlas-operator-866dfbc56d-qkkkn condition met

有关安装过程的更多信息,请参阅 Atlas Operator 文档。

3. 设置目标数据库

首先,使用以下命令部署一个简单的 PostgreSQL 数据库:

代码语言:javascript
复制
kubectl apply -f https://raw.githubusercontent.com/ariga/atlas-operator/master/config/integration/databases/postgres.yaml

这将创建一个 Deployment,运行一个单节点的(非持久化)PostgreSQL 实例,以及一个在 5432 端口上公开它的 Service。另外,它还将创建一个包含数据库凭据的 Secret

等待数据库 pod 运行:

代码语言:javascript
复制
kubectl wait --for=condition=ready pod -l app=postgres -n default

4. 创建 AtlasMigration 资源

为了让 Atlas Operator 知道需要应用哪些迁移,我们需要创建一个 AtlasMigration 资源,指向在第 1 部分中创建的 Atlas Cloud 项目。在 GitHub 存储库中创建一个名为 manifests 的新目录。在其中,使用以下内容创建一个名为 atlas-migration.yaml 的文件:

代码语言:javascript
复制
apiVersion: db.atlasgo.io/v1alpha1
kind: AtlasMigration
metadata:
  name: migration
spec:
  urlFrom:
    secretKeyRef:
      key: url
      name: postgres-credentials
  cloud:
    project: "atlasdemo" # Atlas Cloud project name
    tokenFrom:
      secretKeyRef:
        name: atlas-credentials
        key: token
  dir:
    remote:
      name: "atlasdemo" # Migration directory name in your atlas cloud project
      tag: "1d579be616db48803bb21713fd836a9165030f18" # See below on how to obtain this value for your project.

这个资源告诉 Atlas Operator 将 Atlas Cloud 中 atlasdemo 项目中的迁移应用到 postgres-credentials secret 中指定的数据库。请注意,tokenFrom 字段引用了一个名为 atlas-credentials 的 secret。这个 secret 将包含我们在第 1 部分中创建的 Atlas Cloud API token。

要创建它,请运行:

代码语言:javascript
复制
kubectl create secret generic atlas-credentials --from-literal=token=aci_<replace with your token>

获取 tag 字段 请注意 dir 部分中的 tag 字段。这个字段告诉 Atlas Operator 应用哪个版本的迁移。在这种情况下,我们告诉它应用标记为提交哈希 1d579be616db48803bb21713fd836a9165030f18 的迁移,这是我们在第 1 部分中创建的拉取请求的合并提交的提交哈希。 要查看迁移可用的标签,请转到你的 Atlas Cloud 项目,并单击“标签”选项卡。你应该会看到类似下面的页面:

提交变更并推送到你的 GitHub 存储库。

5. 创建 ArgoCD 应用程序

现在我们已经创建了 AtlasMigration 资源,我们可以创建一个 ArgoCD 应用程序来部署它。在 GitHub 存储库的根目录中创建一个名为 Application.yaml 的文件,内容如下:

代码语言:javascript
复制
apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
  name: atlas-argocd-demo
  namespace: argocd
  finalizers:
    - resources-finalizer.argocd.argoproj.io
spec:
  source:
    path: manifests
    repoURL: 'https://github.com/<your gh user>/<your repo name>'
    targetRevision: master
  destination:
    namespace: default
    server: 'https://kubernetes.default.svc'
  project: default
  syncPolicy:
    automated:
      prune: true
      selfHeal: true
    retry:
      limit: 5
      backoff:
        duration: 5s
        maxDuration: 3m0s
        factor: 2
  syncOptions:
    - CreateNamespace=true

请确保使用你的 GitHub 存储库的 URL 替换 repoURL 字段。

提示: 如果你的存储库是私有的,你需要创建一个 GitHub 个人访问令牌,并通过运行以下命令告诉 ArgoCD:

代码语言:javascript
复制
export CURRENT_NS=$(kubectl config view --minify --output 'jsonpath={..namespace}')
kubectl config set-context --current --namespace=argocd
argocd repo add https://github.com/<user>/<repo> --username <user> --password ghp_<your token> 
kubectl config set-context --current --namespace=$CURRENT_NS

6. 部署!

接下来,应用应用程序清单:

代码语言:javascript
复制
kubectl apply -f Application.yaml

等待应用程序部署完成:

代码语言:javascript
复制
kubectl wait --for=condition=ready atlasmigration/migration

观察迁移对象的状态:

代码语言:javascript
复制
kubectl get atlasmigration/migration -o jsonpath='{.status}' | jq

输出将类似于:

代码语言:javascript
复制
{
  "conditions": [
    {
      "lastTransitionTime": "2023-12-11T08:38:35Z",
      "message": "",
      "reason": "Applied",
      "status": "True",  
      "type": "Ready"
    }
  ],
  "lastApplied": 1702283914,
  "lastAppliedVersion": "20231206075118",
  "observed_hash": "6e4feac15a35d20c38e705428de507835c7c58d487eacc84ed012a17b002981d"
}

你也可以使用 Atlas Cloud UI 观察迁移的状态:

总结

让我们回顾一下从端到端创建的流程:

  1. 开发人员修改 schema 的期望状态,并在本地使用 atlas migrate diff 生成迁移计划。
  2. 开发人员将迁移计划提交到他们的 GitHub 存储库,并创建一个拉取请求。
  3. GitHub Actions 运行 Atlas 持续集成工作流程,验证迁移计划是否正确和安全。
  4. 一旦拉取请求被合并,GitHub Actions 工作流程会将新的迁移推送到 Atlas Cloud。它被标记为合并提交的提交哈希。
  5. 当我们准备将更改部署到生产环境时,我们将 AtlasMigration 资源中的 tag 字段值更改为最新标签。我们将此更改推送到我们的 GitHub 存储库。
  6. ArgoCD 检测到更改并更新我们的 AtlasMigration 资源。
  7. Atlas Operator 检测到更改并将迁移应用到数据库。

现在,数据库的状态与我们 schema 的期望状态同步了!

总而言之,在本教程中,我们演示了如何使用 Atlas Operator 和 ArgoCD 在 Kubernetes 中为数据库迁移创建一个时尚的 GitOps 工作流程。

一如既往,我们非常乐意在 Discord 服务器上收到您的反馈和建议。

标签:

kubernetes

gitops

migrations

argocd

github-actions

postgres

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2024-01-062,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 如何在 Kubernetes 上 GitOps 你的数据库迁移
  • 前提条件:
  • 设置 Atlas Operator 和 ArgoCD:
    • 1. 安装 ArgoCD
      • 2. 安装 Atlas Operator
        • 3. 设置目标数据库
          • 4. 创建 AtlasMigration 资源
            • 5. 创建 ArgoCD 应用程序
              • 6. 部署!
              • 总结
              相关产品与服务
              对象存储
              对象存储(Cloud Object Storage,COS)是由腾讯云推出的无目录层次结构、无数据格式限制,可容纳海量数据且支持 HTTP/HTTPS 协议访问的分布式存储服务。腾讯云 COS 的存储桶空间无容量上限,无需分区管理,适用于 CDN 数据分发、数据万象处理或大数据计算与分析的数据湖等多种场景。
              领券
              问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档