共計 7421 個字符,預計需要花費 19 分鐘才能閱讀完成。
這篇文章給大家介紹 Argo CD 中如何構建一套完整的 GitOps,內容非常詳細,感興趣的小伙伴們可以參考借鑒,希望對大家能有所幫助。
隨著 Kubernetes 繼續將自己確立為容器編排的行業標準,為你的應用和工具找到使用聲明式模型的有效方法是成功的關鍵。在這篇文章中,我們將在 AWS 中建立一個 K3s Kubernetes 集群,然后使用 Argo CD 和 Vault 實現安全的 GitOps。
以下是我們將會使用到的組件:
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.tfvars
terraform 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 nodes
NAME STATUS ROLES AGE VERSION
ip-10-0-1-208.ec2.internal Ready none 39m v1.18.9+k3s1
ip-10-0-1-12.ec2.internal Ready master 39m v1.18.9+k3s1
ip-10-0-1-191.ec2.internal Ready master 39m v1.18.9+k3s1
ip-10-0-2-12.ec2.internal Ready master 39m v1.18.9+k3s1
ip-10-0-2-204.ec2.internal Ready none 39m v1.18.9+k3s1
ip-10-0-1-169.ec2.internal Ready none 39m v1.18.9+k3s1
我們也來看看 Argo CD 的狀態,它是通過 manifest 自動部署的:
$ kubectl get pods -n kube-system | grep argocd
helm-install-argocd-5jc9s 0/1 Completed 1 40m
argocd-redis-774b4b475c-8v9s8 1/1 Running 0 40m
argocd-dex-server-6ff57ff5fd-62v9b 1/1 Running 0 40m
argocd-server-5bf58444b4-mpvht 1/1 Running 0 40m
argocd-repo-server-6d456ddf8f-h9gvd 1/1 Running 0 40m
argocd-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.dev
Server: 71.252.0.12
Address: 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.com
Address: 52.20.5.150
Name: a4c6dfd75b47a4b1cb85fbccb390fe1f-529310843.us-east-1.elb.amazonaws.com
Address: 23.20.0.2
現在到 Umbrella 應用程序。
Argo CD 和 Umbrella 應用程序
我們已經知道 Argo CD 已經部署好了,但現在我們要使用 Argo CD 的 App-of-Apps 部署模型來部署我們的其余工具套件。由于我們使用的是 GitOps,你需要將 k8s-tools-app 倉庫 fork 到你自己的 Github 賬戶上,然后我們需要做一些修改來匹配你各自的環境。
你需要為 https://github.com/atoy3731/k8s-tools-app.git 進行全局查找 / 替換,并將其更改到之前 fork 的新存儲庫 git URL。這使你可以管理自己的環境,讓 Argo CD 可以從那里拉取。另外,需要確保你的 Git 倉庫是公開的,以便 Argo CD 可以訪問它。
在 resources/tools/resources/other-resources.yaml 中,更改 argoHostand issuerEmail,使其與你的域名和郵箱相匹配。
在 resources/tools/resources/rancher.yaml 中,更改主機名稱和郵件以匹配各自的域名和 email。
在 resources/apps/resources/hello-world.yaml 中,將兩個引用 app.demo.aptoy.dev 改為與你的域名一致。
一旦你做了這些更新,繼續提交 / 推送你的更改到你的 forked Github 倉庫。現在你已經準備好應用 umbrella 應用程序了。在本地克隆的倉庫中執行以下操作:
$ kubectl apply -f umbrella-tools.yaml
appproject.argoproj.io/tools created
application.argoproj.io/umbrella-tools created
現在,Argo CD 將開始配置所有其他工具,這些工具是倉庫為你的集群定義的。你可以通過執行以下操作來獲得已部署的應用程序的列表:
$ kubectl get applications -n kube-system
NAME AGE
other-resources 56m
umbrella-tools 58m
rancher 57m
vault-impl 57m
vault-operator 58m
vault-webhook 57m
cert-manager 57m
cert-manager-crds 58m
你將不得不等待 5 分鐘左右的時間,讓一切都準備好,讓 LetsEncrypt 生成暫存證書。一旦事情按預期運行,你應該看到兩個生成的 Ingress 條目,你可以通過瀏覽器訪問:
$ kubectl get ingress -A
NAMESPACE NAME CLASS HOSTS ADDRESS PORTS AGE
cattle-system rancher none rancher.demo.atoy.dev a4c6dfd75b47a4b1cb85fbccb390fe1f-529310843.us-east-1.elb.amazonaws.com 80, 443 59m
kube-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-server
argocd-server-5bf58444b4-mpvht 1/1 Running 0 64m
現在你應該能夠訪問 Argo CD UI,登錄并查看,如下所示:
既然我們的工具已經部署完成,讓我們在 Vault 中存儲密鑰,以便 hello world 應用程序提取。
在 Vault 中創建密鑰
為了讓事情變得簡單,在你的工具庫中有一個幫助腳本。運行以下命令來獲取 Vault 管理員令牌和端口轉發命令:
$ sh tools/vault-config.sh
Your Vault root token is: s.qEl4Ftr4DR61dmbH3umRaXP0
Run the following:
export VAULT_TOKEN=s.qEl4Ftr4DR61dmbH3umRaXP0
export VAULT_CACERT=/Users/adam.toy/.vault-ca.crt
kubectl 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 密鑰,所以添加以下內容并點擊保存:
現在我們已經為 hello world 應用程序準備好密鑰了。
部署 Hello World 應用程序
現在,回到我們的父版本,讓我們運行下面的代碼來部署 hello world 應用程序:
$ kubectl apply -f umbrella-apps.yaml
appproject.argoproj.io/apps created
application.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 就會部署新版本。
關于 Argo CD 中如何構建一套完整的 GitOps 就分享到這里了,希望以上內容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。