写点什么

Argo CD 使用指南:如何构建一套完整的 GitOps?

  • 2020-12-23
  • 本文字数:5569 字

    阅读完需:约 18 分钟

Argo CD使用指南:如何构建一套完整的GitOps?

随着 Kubernetes 将自己确立为容器编排的行业标准,为你的应用和工具找到使用声明式模型的有效方法是成功的关键。在这篇文章中,我们将在 AWS 架构中创建一个 K3s Kubernetes 集群,然后使用 Argo CD 和 Vault 实现安全的 GitOps。你可以在以下两个链接中分别查看基础架构以及 Kubernetes umbrella 应用程序:


  • https://github.com/atoy3731/aws-k8s-terraform

  • https://github.com/atoy3731/k8s-tools-app


以下是我们将会使用到的组件:


AWS——这是我们将在底层基础设施使用的云提供商。它将管理我们的虚拟机以及 Kubernetes 工作所需的网络,并允许 Ingress 从外界进入集群。


K3s——由 Rancher 开发的轻量级 Kubernetes 发行版。它对许多 alpha 功能和云插件进行了清理,同时也使用关系型数据库(本例中是 RDS)代替 etcd 进行后端存储。


Rancher——API 驱动的 UI,可以轻松管理你的 Kubernetes 集群


Vault——Hashicorp 的密钥管理实现。我将使用 Banzai Cloud Vault 的 bank-vaults 实现,它可以通过使用 Admission Webhook 将密钥直接注入 pod 中。这大大减轻了你在 Git 仓库中存储密钥的需求。


Argo CD——这是一个 GitOps 工具,可以让你在 Git 中维护 Kubernetes 资源的状态。Argo CD 会自动将你的 Kubernetes 资源与 Git 仓库中的资源进行同步,同时也确保集群内对 manifest 的手动更改会自动还原。这保证了你的声明式部署模式。


Cert Manager LetsEncrypt——提供了一种为 Kubernetes Ingress 自动生成和更新证书的方法。


让我们先从 AWS 基础架构开始。

前期准备


你需要在你的系统中安装以下 CLI:


  • Terraform

  • Kubectl

  • AWS


同时,你还需要 AWS 管理员访问权限以及一个访问密钥。如果你没有,你可以使用信用卡创建一个账户。


最后,你需要一个可以管理/更新的托管域名,以指向你的基于 Kubernetes 弹性负载均衡器(ELB)。如果你还没有,建议你在 NameCheap 上开一个账户,然后购买一个.dev 域名。它价格便宜,而且效果很好。

AWS 基础架构


对于我们的 AWS 基础架构,我们将使用 Terraform 与 S3 支持来持久化状态。这为我们提供了一种方法来声明性地定义我们的基础架构,并在我们需要的时候反复进行更改。在基础设施仓库中,你会看到一个 k3s/example.tfvars 文件。我们需要根据我们特定的环境/使用情况更新这个文件,设置以下值:


  • db_username — 将应用于 Kubernetes 后端存储的 RDS 实例的管理员用户名

  • db_password — RDS 用户的管理员密码。这通常应该在你的 terraform apply 命令内联过程中传递此参数,但为了简单起见,我们将在文件中设置它。

  • public_ssh_key — 你的公共 SSH 密钥,当你需要 SSH 到 Kubernetes EC2s 时,你将使用它。

  • keypair_name — 要应用于你的 public_ssh_key 的密钥对名称。

  • key_s3_bucket_name — 生成的 bucket 将在集群成功创建时存储你的 kubeconfig 文件。


如果你想修改集群大小或设置特定的 CIDRs(无类域间路由),可以设置下面的一些可选字段,但默认情况下,你会得到一个 6 节点(3 个服务器,3 个代理)的 K3s 集群。


同时,你将需要创建 S3 bucket 来存储你的 Terraform 状态并且在 k3s/backends/s3.tfvars k3s/main.tf 文件中更改 bucket 字段来与其匹配。


一旦我们更新了所有的字段,并创建了 S3 状态 bucket,我们就开始应用 Terraform 吧。首先,确保你在 AWS 账户中有一个管理 IAM 用户并且你已经在系统上正确设置了环境变量或 AWS 凭证文件,以便能够与 AWS API 对接,然后运行以下命令:


cd k3s/terraform init -backend-config=backends/s3.tfvarsterraform apply -var-file=example.tfvars
复制代码


一旦你执行以上命令,Terraform 会在 apply 成功后输出预期的 AWS 状态。如果一切看起来都符合预期,请输入 yes。这时候由于 RDS 集群的原因,需要 5—10 分钟的时间来配置 AWS 资源。

验证你的 Kubernetes 集群


Terraform 成功应用之后(再多等几分钟的时间确保 K3s 已经部署完毕),你需要使用以下命令从 S3 bucket 中抓取 kubeconfig 文件(替换你在 example.tfvars 中输入的 bucket 名称):


aws s3 cp s3://YOUR_BUCKET_NAME/k3s.yaml ~/.kube/config
复制代码


这应该成功完成,让你现在能够与你的集群通信。让我们检查一下我们的节点状态,在继续之前,确保它们都处于就绪状态。


$ kubectl get nodesNAME                         STATUS   ROLES    AGE   VERSIONip-10-0-1-208.ec2.internal   Ready    <none>   39m   v1.18.9+k3s1ip-10-0-1-12.ec2.internal    Ready    master   39m   v1.18.9+k3s1ip-10-0-1-191.ec2.internal   Ready    master   39m   v1.18.9+k3s1ip-10-0-2-12.ec2.internal    Ready    master   39m   v1.18.9+k3s1ip-10-0-2-204.ec2.internal   Ready    <none>   39m   v1.18.9+k3s1ip-10-0-1-169.ec2.internal   Ready    <none>   39m   v1.18.9+k3s1
复制代码


我们也来看看 Argo CD 的状态,它是通过 manifest 自动部署的:


$ kubectl get pods -n kube-system | grep argocdhelm-install-argocd-5jc9s                        0/1     Completed   1          40margocd-redis-774b4b475c-8v9s8                    1/1     Running     0          40margocd-dex-server-6ff57ff5fd-62v9b               1/1     Running     0          40margocd-server-5bf58444b4-mpvht                   1/1     Running     0          40margocd-repo-server-6d456ddf8f-h9gvd              1/1     Running     0          40margocd-application-controller-67c7856685-qm9hm   1/1     Running     0          40m

复制代码


现在我们可以继续为我们的 ingress 和证书自动化配置通配符 DNS。

DNS 配置


对于 DNS,我通过 Namecheap 获得 atoy.dev 域名,但你可以使用任何你喜欢的 DNS 供应商。我们需要做的是创建一个通配符 CNAME 条目,以将所有请求路由到 AWS ELB,它正在管理应用程序的 ingress。


首先,通过访问你的 AWS 控制台获取你的弹性负载均衡器主机名称——导航到 EC2 部分并在左边菜单栏上点击 Load Balancers。然后你应该看到一个使用随机字符创建的新 LoadBalancer。如果你检查 tag,它应该引用你的新 Kubernetes 集群。


你需要从该条目复制 DNS 名称。为我的域名访问 NamecCheap 高级 DNS 页面,并输入*.demo.atoy.dev**的 CNAME 条目。**指向你从 AWS 复制的域名。你可以根据你的提供商/域名调整这个名称:


要验证它是否有效,你可以安装/使用 nslookup 来确保它解析到正确的主机名:


$ nslookup test.demo.atoy.devServer:  71.252.0.12Address: 71.252.0.12#53
Non-authoritative answer:test.demo.atoy.dev canonical name = a4c6dfd75b47a4b1cb85fbccb390fe1f-529310843.us-east-1.elb.amazonaws.com.Name: a4c6dfd75b47a4b1cb85fbccb390fe1f-529310843.us-east-1.elb.amazonaws.comAddress: 52.20.5.150Name: a4c6dfd75b47a4b1cb85fbccb390fe1f-529310843.us-east-1.elb.amazonaws.comAddress: 23.20.0.2
复制代码


现在到 Umbrella 应用程序。

Argo CD 和 Umbrella 应用程序


我们已经知道 Argo CD 已经部署好了,但现在我们要使用 Argo CD 的 App-of-Apps 部署模型来部署我们的其余工具套件。由于我们使用的是 GitOps,你需要将 k8s-tools-app 仓库 fork 到你自己的 Github 账户上,然后我们需要做一些修改来匹配你各自的环境。


  1. 你需要为 https://github.com/atoy3731/k8s-tools-app.git 进行全局查找/替换,并将其更改到之前 fork 的新存储库 git URL。这使你可以管理自己的环境,让 Argo CD 可以从那里拉取。另外,需要确保你的 Git 仓库是公开的,以便 Argo CD 可以访问它。

  2. 在 resources/tools/resources/other-resources.yaml 中,更改 argoHostand issuerEmail,使其与你的域名和邮箱相匹配。

  3. 在 resources/tools/resources/rancher.yaml 中,更改主机名称和邮件以匹配各自的域名和 email。

  4. 在 resources/apps/resources/hello-world.yaml 中,将两个引用 app.demo.aptoy.dev 改为与你的域名一致。


一旦你做了这些更新,继续提交/推送你的更改到你的 forked Github 仓库。现在你已经准备好应用 umbrella 应用程序了。在本地克隆的仓库中执行以下操作:


$ kubectl apply -f umbrella-tools.yamlappproject.argoproj.io/tools createdapplication.argoproj.io/umbrella-tools created
复制代码


现在,Argo CD 将开始配置所有其他工具,这些工具是仓库为你的集群定义的。你可以通过执行以下操作来获得已部署的应用程序的列表:


$ kubectl get applications -n kube-systemNAME                AGEother-resources     56mumbrella-tools      58mrancher             57mvault-impl          57mvault-operator      58mvault-webhook       57mcert-manager        57mcert-manager-crds   58m
复制代码


你将不得不等待 5 分钟左右的时间,让一切都准备好,让 LetsEncrypt 生成暂存证书。一旦事情按预期运行,你应该看到两个生成的 Ingress 条目,你可以通过浏览器访问:


$ kubectl get ingress -ANAMESPACE       NAME             CLASS    HOSTS                     ADDRESS                                                                  PORTS     AGEcattle-system   rancher          <none>   rancher.demo.atoy.dev   a4c6dfd75b47a4b1cb85fbccb390fe1f-529310843.us-east-1.elb.amazonaws.com   80, 443   59mkube-system     argocd-ingress   <none>   argo.demo.atoy.dev      a4c6dfd75b47a4b1cb85fbccb390fe1f-529310843.us-east-1.elb.amazonaws.com   80, 443   58m
复制代码


现在你可以通过 https://rancher.YOUR-DOMAIN 浏览 Rancher,通过 https://argo.YOUR-DOMAIN 浏览 Argo CD。


NOTE 1:为了避免 LetsEncrypt 的任何速率限制,我们使用的是无效的暂存证书。这有一个好处是当你在你的浏览器访问 Argo、Rancher 或你的 hello world 应用程序,它会给你一个 SSL 异常。使用 Chrome 浏览器,在你的异常页面加载时输入 thisisunsafe,它会让你绕过它。你也可以了解更新 Cert-manager 的 ClusterIssuer,以使用生产级的可信证书。


NOTE 2:K3s 预装了一个 Traefik 作为 ingress controller,出于简单起见,我们直接使用它。


NOTE 3:首次登录 Rancher 后,你需要生成一个密码,并接受用于访问 Rancher 的 URI。URI 应该是预先加载在表单中的,所以您可以直接点击 “Okay”。


NOTE 4: 要登录 Argo CD,它使用 admin 作为用户名,使用 argocd-server pod 名作为密码。你可以通过下面的操作来获得这个服务器的 pod 名(本例中是 argocd-server-5bf58444b4-mpvht)。


$ kubectl get pods -n kube-system | grep argocd-serverargocd-server-5bf58444b4-mpvht                   1/1     Running     0          64m
复制代码


现在你应该能够访问 Argo CD UI,登录并查看,如下所示:



既然我们的工具已经部署完成,让我们在 Vault 中存储密钥,以便 hello world 应用程序提取。

在 Vault 中创建密钥


为了让事情变得简单,在你的工具库中有一个帮助脚本。运行以下命令来获取 Vault 管理员令牌和端口转发命令:


$ sh tools/vault-config.shYour Vault root token is: s.qEl4Ftr4DR61dmbH3umRaXP0
Run the following:export VAULT_TOKEN=s.qEl4Ftr4DR61dmbH3umRaXP0export VAULT_CACERT=/Users/adam.toy/.vault-ca.crtkubectl port-forward -n vault service/vault 8200 &
You will then be able to access Vault in your browser at: [https://localhost:8200](https://localhost:8200)
复制代码


运行输出的命令,然后导航到 https://localhost:8200。输入上面的 root token 进行登录。


当你登录时,你应该在一个密钥引擎页面。点击 Secret/条目,然后点击右上方的创建密钥。我们将创建一个 demo 密钥,所以添加以下内容并点击保存


![](C:\Users\Administrator\Desktop\发布\12 月 18 日\Argo CD 使用指南:如何构建一套完整的 GitOps?\图 4.png)


现在我们已经为 hello world 应用程序准备好密钥了。

部署 Hello World 应用程序


现在,回到我们的父版本,让我们运行下面的代码来部署 hello world 应用程序:


$ kubectl apply -f umbrella-apps.yamlappproject.argoproj.io/apps createdapplication.argoproj.io/umbrella-apps created
复制代码


创建完成后,回到 Argo CD UI,你先应该看到两个新应用程序,umbrella-apps demo-app。单击 demo-app,然后等待所有资源正常运行:



一旦状态都是 healthy 之后,你应该能够通过访问https://app.YOUR-DOMAIN 导航到你的应用程序。



让我们也来验证一下我们的 Vault 密钥是否被注入到我们的应用程序 pod 中。在 Argo CD UI 的 demo-app 中,点击应用程序的一个 Pod,然后点击顶部的日志标签。左边应该有两个容器,选择 test-deployment 容器。在日志的顶部,你应该看到你的密钥在两行等号之间:


测试 GitOps


现在我们来测试一下 Argo CD,确保当我们在仓库中做一些更改时它能够自动同步。


在你的工具库中,找到 resources/apps/resources/hello-world.yaml 文件,将 replicaCount 的值从 5 改到 10。提交并推送你的更改到主分支,然后在 Argo CD UI 中导航回 demo-app。当 Argo CD 达到它的刷新间隔时,它会自动开始部署其他 5 个应用程序副本(如果你不想等待,可以点击你的** umbrella-apps Argo 应用程序中的刷新按钮):


清除


如果你准备拆掉你的集群,你需要先进入 AWS 控制台、EC2 服务,然后点击 Load Balancers。你会看到 Kubernetes 云提供商创建了一个 ELB,但不是由 Terraform 管理的,你需要清理它。你还需要删除该 ELB 正在使用的安全组。


清理了 ELB 之后,运行以下命令并在出现提示时输入 yes


terraform destroy -var-file=example.tfvars
复制代码

下一步是什么?


我们已经有一个很好的工具集来使用 GitOps 部署应用程序。那么下一步是什么?如果你愿意接受挑战,可以尝试在 hello world 应用旁边部署自己的应用,甚至尝试通过在应用 manifest 仓库中更新镜像标签来实现 CI/CD。这样一来,当构建新的应用镜像时,新的标签就会在 manifest 仓库中自动更新,Argo CD 就会部署新版本。


文章转载自:RancherLabs(ID:RancherLabs)

原文链接:Argo CD使用指南:如何构建一套完整的GitOps?

2020-12-23 07:002397

评论

发布
暂无评论
发现更多内容

解读 RocketMQ 5.0 全新的高可用设计

阿里巴巴云原生

阿里云 RocketMQ 高可用 云原生

互联网大厂2700道Java高频面试题(2023年最新版)不管你工作几年,都可以看看!

采菊东篱下

java面试

BI商业智能工具成宠儿,企业降本增效优质工具

夜雨微澜

一名中级程序员应该具备的技能

树上有只程序猿

编程 程序员 低代码 职业生涯 JNPF

k8s实战案例之部署redis单机和redis cluster

不在线第一只蜗牛

k8s

车联网 CAN Bus 协议介绍与数据实时流处理

EMQ映云科技

物联网 mqtt canbus

AI药物研发大赛培训来啦!清华博导讲解,高分基线等你来Fork!

飞桨PaddlePaddle

人工智能 百度 paddle 飞桨 百度飞桨

SpringBoot 2 种方式快速实现分库分表,轻松拿捏!

程序员小富

分库分表 springboot ShardingSphere

香港云主机为你的业务注入强大的云端动力!

一只扑棱蛾子

香港云主机

svn提交规范,与Git相得益彰

互联网工科生

git svn

Android SDK安全加固问题与分析

百度Geek说

android 安全加固 企业号 6 月 PK 榜 6 月 优质更文活动

一年省七位数,得物自建HFDS在 Flink Checkpoint 场景下的应用实践

得物技术

大数据 阿里云 成本优化

一次搞懂线性稳压器/LDO的工作原理

元器件秋姐

物理 电路 元器件 PCB 稳压器

为什么需要数字化?如果实现数字化?

高端章鱼哥

低代码 数字化 企业管理软件 JNPF

vivo 自研鲁班分布式 ID 服务实践

vivo互联网技术

雪花算法 分布式ID UidGenerator Tinyid Leaf

玖章算术与百度智能云达成合作,「NineData SQL 开发」成为百度智能云主推的数据库工具

Baidu AICLOUD

从“云原生”到“比Flink快十倍”:RisingWave的寻找自我认知之旅

吴英骏

数据库 sql 流处理

华为云CodeArts TestPlan测试设计:守护产品开发质量之魂

华为云PaaS服务小智

云计算 软件开发 华为云 产品测试

通过腾讯云SES服务发送邮件

排骨虾

腾讯云 #go 邮件通知

数据分析与可视化在企业中的日常应用

夏日星河

如何使用 Terraform 和 Git 分支有效管理多环境?

SEAL安全

git Terraform

行云管家- 积极探索“AI+信息安全”的创新融合

行云管家

网络安全 信息安全 智能 AI智能

使用堡垒机的意义你知道吗?能解决哪些问题?

行云管家

网络安全 信息安全 堡垒机 数据泄露

一定要看的前端codeReview规范指南

快乐非自愿限量之名

前端 技术框架

AIGC+办公|大厂争先抢占高位的AI,开始“卷”打工人了吗?

TE智库

人工智能 办公 打工人 AIGC 生成式AI

鲸鸿动能荣获2023 TopDigital 3项大奖

最新动态

这些面试技巧,助你升职加薪、迎娶白富美

伤感汤姆布利柏

直播系统聊天技术(九):千万级实时直播弹幕的技术实践

JackJiang

网络编程 即时通讯 IM

全球NDR市场“客户之声”首次发布:那些最挑剔的用户都选了谁?

Geek_2d6073

玖章算术与百度智能云达成合作,「NineData SQL 开发」成为百度智能云主推的数据库工具

NineData

数据库 百度智能云 云市场 玖章算术 NineData

Argo CD使用指南:如何构建一套完整的GitOps?_语言 & 开发_Rancher_InfoQ精选文章