如何在 Kubernetes 中使用 ArgoCD 部署 MinIO

How to deploy MinIO with ArgoCD in Kubernetes

在设计 MinIO 时,我们希望确保它作为对象存储的应用无处不在。  考虑到这一点,我们确保每个 MinIO 版本都可以在 各种基础设施 上运行,并通过多种不同的方法部署,以便它可以直接应用于每个用例。 当然,MinIO 可以在任何公共云、本地裸机和边缘设备以及任何 Kubernetes 发行版上运行。 最近,我们撰写了关于如何使用 Rafay Systems 在各种环境中部署 MinIO 的文章。

在这一势头的推动下,我们为您带来了另一种部署 MinIO 的方法,这次是使用 ArgoCD。 什么是 ArgoCD? 简而言之,它是一个 GitOps 持续部署工具,将基础设施的状态存储在 Git 存储库中,并通过跟踪现有部署配置和新部署配置之间的更改来自动化部署。 MinIO 是为了无缝地融入任何 CI/CD 环境而构建的,而 GitOps 最近在该领域中脱颖而出,因为它为您的工作流程增加了简单性和自动化。 如果你不想使用像 ArgoCD 这样的工具(或者只是不想在工具库中添加另一个新工具),MinIO 具有内置功能,可以让你 即时升级版本 并将其扩展到数千个节点,而无需任何特殊工具或流程。 你也可以在此基础上构建自己的自定义 CI/CD GitOps 管道 来部署和管理 MinIO 集群。 由于 MinIO 的灵活性,你可以选择适合你的部署方法,这里没有一刀切的方法。

MinIO 是一款 Kubernetes 原生 高性能对象存储,具有与 S3 兼容的 API。 MinIO Operator 支持将 MinIO 租户部署到私有、公共和多云基础设施。 MinIO Operator 安装了自定义资源文档 (CRD) 来支持将 MinIO 租户描述为 Kubernetes 对象,而 MinIO Kubernetes 插件为使用 kubectl minio 命令在 Kubernetes 集群上部署和管理 MinIO 租户提供了原生支持。

Kubernetes 集群

在开始之前,让我们设置一个 Kubernetes 集群来进行操作。 你可以使用任何现成的普通 Kubernetes 部署;在本教程博客文章中,我们将使用 Kind 集群。

创建并打开以下文件

~/bash-config/config-files/kind-config.yaml

将以下内容添加到其中,以定义我们想要的 Kind 集群配置,包括 ArgoCD、MinIO 和许多其他组件所需的开放端口。

kind: Cluster
apiVersion: kind.x-k8s.io/v1alpha4
networking:
  apiServerAddress: "127.0.0.1"
  apiServerPort: 6443
nodes:
  - role: control-plane
    extraPortMappings:
    - containerPort: 30080
      hostPort: 30080
      listenAddress: "127.0.0.1"
      protocol: TCP
  - role: worker
    extraPortMappings:
    - containerPort: 30081
      hostPort: 30081
      listenAddress: "127.0.0.1"
      protocol: TCP
  - role: worker
    extraPortMappings:
    - containerPort: 30082
      hostPort: 30082
      listenAddress: "127.0.0.1"
      protocol: TCP
  - role: worker
    extraPortMappings:
    - containerPort: 30083
      hostPort: 30083
      listenAddress: "127.0.0.1"
      protocol: TCP
  - role: worker
    extraPortMappings:
    - containerPort: 30084
      hostPort: 30084
      listenAddress: "127.0.0.1"
      protocol: TCP
  - role: worker
    extraPortMappings:
    - containerPort: 30085
      hostPort: 30085
      listenAddress: "127.0.0.1"
      protocol: TCP
  - role: worker
    extraPortMappings:
    - containerPort: 30086
      hostPort: 30086
      listenAddress: "127.0.0.1"
      protocol: TCP
  - role: worker
    extraPortMappings:
    - containerPort: 30087
      hostPort: 30087
      listenAddress: "127.0.0.1"
      protocol: TCP
  - role: worker
    extraPortMappings:
    - containerPort: 30088
      hostPort: 30088
      listenAddress: "127.0.0.1"
      protocol: TCP

使用上面的配置创建 Kind 集群。 确保先删除任何现有的集群。

kind delete cluster
kind create cluster --config ~/bash-config/config-files/kind-config.yaml

安装 ArgoCD

Kubernetes 集群启动并运行后,让我们安装 ArgoCD。 为 Argo 创建一个命名空间,然后从 ArgoCD GitHub 存储库应用 ArgoCD Kubernetes yaml。

kubectl create namespace argocd
kubectl apply -n argocd -f https://raw.githubusercontent.com/argoproj/argo-cd/stable/manifests/install.yaml

在外部公开 ArgoCD argo-server 服务,以便你可以使用 Argo 管理应用程序。 我们建议使用 NodePort,因为它比端口转发更可配置且更稳定,但你可以随意使用任何方法,只要它有效即可。 只要确保你公开的端口与 Kind 集群打开的端口匹配。

端口公开后,打开浏览器并访问以下 URL http://localhost:30080/

要登录 ArgoCD UI,让我们通过运行以下命令获取初始密码

argocd admin initial-password -n argocd

获取密码后,使用以下命令登录

$ argocd login localhost:30080
WARNING: server certificate had error: tls: failed to verify certificate: x509: certificate signed by unknown authority. Proceed insecurely (y/n)? y
Username: admin
Password:
'admin:login' logged in successfully
Context 'localhost:30080' updated

出于安全目的,让我们更改此默认密码

$ argocd account update-password
*** 输入当前登录用户的密码 (admin):
*** 输入 新的 密码 用于 用户 admin:
*** 确认 新的 密码 用于 用户 admin:
密码已更新
上下文 'localhost:30080' 已更新

最后,但并非最不重要的,我们需要告诉 ArgoCD 使用我们之前设置的 Kind 集群。

$ argocd cluster add kind-kind --in-cluster
警告:这将创建一个名为 `argocd-manager` 的服务帐户在由上下文 `kind-kind` 引用的集群上,并拥有完全的集群级别权限。您要 继续 吗 [y/N]? y
INFO[0002] 服务帐户 "argocd-manager" 已创建于命名空间 "kube-system"
INFO[0002] 集群角色 "argocd-manager-role" 已创建   
INFO[0002] 集群角色绑定 "argocd-manager-role-binding" 已创建
INFO[0007] 为服务帐户 "argocd-manager" 创建了令牌密钥 用于 服务帐户 "argocd-manager"
集群 'https://kubernetes.default.svc' 已添加

部署 MinIO 运算符

此时,我们应该已经具备了使用 ArgoCD 部署 MinIO 运算符所需的所有基础。让我们创建一个名为 minio 的命名空间,并在 ArgoCD 中创建一个名为 MinIO 的应用程序。

$ kubectl create namespace minio-operator
namespace/minio-operator 已创建

$ argocd app create minio-operator --repo https://github.com/cniackz/minio-argocd.git --path minio-operator --dest-namespace minio-operator --dest-server https://kubernetes.default.svc --insecure --upsert
应用程序 'minio-operator' 已创建

使用新设置的 ArgoCD 密码登录 UI。

确保 ArgoCD MinIO 应用程序已同步,以便可以部署它。

将 MinIO 运算符控制台公开为节点端口,以便可以访问它,并确保我们在之前使用的 Kind 集群配置中打开了此端口。要登录 MinIO 运算符控制台,请使用 URL http://localhost:<port>/login

部署 MinIO 租户

不仅可以部署 MinIO 运算符,还可以通过 ArgoCD 部署 MinIO 租户。让我们创建一个命名空间并部署 ArgoCD MinIO 租户应用程序。

$ kubectl create namespace minio-tenant
namespace/minio-tenant created
Cesars-MacBook-Pro:minio-argocd cniackz$ argocd app create minio-tenant \
>   --repo https://github.com/cniackz/minio-argocd.git \
>   --path minio-tenant \
>   --dest-namespace minio-tenant \
>   --dest-server https://kubernetes.default.svc \
>   --insecure \
>   --upsert
application 'minio-tenant' created

现在同步 `minio-tenant app` 并等待部署完成,然后暴露控制台服务并使用UI访问它。

单一视图

秉持着简化的理念,我们喜欢 ArgoCD,因为它允许您在 Kubernetes 环境中对 MinIO Server 升级和部署进行版本控制和自动化。ArgoCD 的简单界面只需几个步骤即可创建生产级的 MinIO 部署。

本教程为您提供了创建单集群 MinIO 部署的构建块。接下来,您可以将此设置扩展到不同物理位置的多个 Kubernetes 集群,并使用 站点到站点复制 在它们之间共享数据。最终,这将为您提供所有 MinIO Kubernetes 部署的单一视图,并使您能够轻松地可视化基础设施的整体结构。这在为新工程师进行入职时特别有用,这样他们就可以阅读配置以了解整体架构。一旦他们掌握了信息,他们就可以使用它来修改和应用配置,并确信他们可以在需要时恢复更改。

一如既往,我们随时为您提供帮助!请通过 SUBNETSlack 或发送电子邮件至 hello@min.io 联系我们。