使用Argo CD自動化Kubernetes多集群配置

2021-02-26 CNCF

客座文章最初由DoiT International高級雲架構師Mike Sparr在DoiT博客上發布

https://blog.doit-intl.com/automating-kubernetes-multi-cluster-config-with-argo-cd-5ac5e371ef01

在我看來,谷歌Anthos企業解決方案中,最酷的方面是Anthos配置管理(Anthos Config Management,ACM)。你可以設置一個Git repo,並將各種集群連接到它,它們將以GitOps的方式標準化配置,並防止漂移。這對於在不同託管位置管理成百上千個集群的大型企業尤其重要。

使用Argo CD自動化Kubernetes多集群配置

受到ACM的啟發,我想知道是否可以使用另一種GitOps解決方案,Argo CD,重新創建這種類型的功能。我很高興與大家分享它的工作原理,當我在Git repo中修改配置文件時,它們無縫地應用到兩個集群中。

架構概述

設置

為了簡單起見,我在谷歌雲的託管Kubernetes服務GKE上,分別在兩個區域創建了兩個集群,以模擬東和西的場景。當然,你可以在集群的任何地方安裝Argo CD,並確保它們能夠訪問你的Git repo。

我創建了下面的shell腳本來引導一切;然而,對於生產用途,我建議在可能的情況下使用Terraform來管理基礎設施。

create-k8s-clusters.sh:

#!/usr/bin/env bash
export PROJECT_ID=<YOUR-PROJECT-ID>export AUTH_NETWORK="<YOUR-IP-ADDRESS>/32"

gcloud services enable container.googleapis.com

set_location () { case $1 in "west") export ZONE="us-west2-b" export REGION="us-west2" ;; "central") export ZONE="us-central1-a" export REGION="us-central1" ;; "east") export ZONE="us-east1-c" export REGION="us-east1" ;; *) echo $"Usage: $0 {west|central|east}" exit 1 esac}

install_argo_cd () { echo "Installing Argo CD ..."

kubectl create clusterrolebinding cluster-admin-binding \ --clusterrole=cluster-admin --user="$(gcloud config get-value account)" kubectl create namespace argocd kubectl apply -n argocd \ -f https://raw.githubusercontent.com/argoproj/argo-cd/stable/manifests/install.yaml

echo "Configuring app-of-apps repo ..." kubectl apply -f app-of-apps.yaml}

create_cluster () { CLUSTER_NAME=$1

set_location $CLUSTER_NAME

echo "Creating cluster $CLUSTER_NAME in zone $ZONE ..."

gcloud beta container --project $PROJECT_ID clusters create "$CLUSTER_NAME" \ --zone "$ZONE" \ --no-enable-basic-auth \ --cluster-version "1.16.9-gke.6" \ --machine-type "e2-standard-2" \ --image-type "COS" \ --disk-type "pd-standard" --disk-size "100" \ --node-labels location=west \ --metadata disable-legacy-endpoints=true \ --scopes "https://www.googleapis.com/auth/compute","https://www.googleapis.com/auth/devstorage.read_write","https://www.googleapis.com/auth/sqlservice.admin","https://www.googleapis.com/auth/logging.write","https://www.googleapis.com/auth/monitoring","https://www.googleapis.com/auth/pubsub","https://www.googleapis.com/auth/servicecontrol","https://www.googleapis.com/auth/service.management.readonly","https://www.googleapis.com/auth/trace.append" \ --preemptible \ --num-nodes "1" \ --enable-stackdriver-kubernetes \ --enable-ip-alias \ --network "projects/${PROJECT_ID}/global/networks/default" \ --subnetwork "projects/${PROJECT_ID}/regions/${REGION}/subnetworks/default" \ --default-max-pods-per-node "110" \ --enable-autoscaling --min-nodes "0" --max-nodes "3" \ --enable-network-policy \ --enable-master-authorized-networks --master-authorized-networks $AUTH_NETWORK \ --addons HorizontalPodAutoscaling,HttpLoadBalancing \ --enable-autoupgrade \ --enable-autorepair --max-surge-upgrade 1 --max-unavailable-upgrade 1 \ --labels env=sandbox \ --enable-vertical-pod-autoscaling \ --identity-namespace "${PROJECT_ID}.svc.id.goog" \ --enable-shielded-nodes \ --shielded-secure-boot \ --tags "k8s","$1" echo "Authenticating kubectl ..." gcloud container clusters get-credentials $CLUSTER_NAME --zone $ZONE

echo "Installing Argo CD ..." install_argo_cd

echo "Cluster $CLUSTER_NAME created in zone $ZONE"}

echo "Creating and configuring clusters ..."locations=("west" "east")for loc in ${locations[@]}; do create_cluster $locdone

啟動集群

在8-10分鐘內,兩個集群都處於活動狀態,並部署了Argo CD工作負載。

東和西地區的Kubernetes集群

部署到每個集群的Argo CD

應用程式的應用程式(App of Apps)

這個設置的獨特之處在於,我還在每個集群上安裝了Argo CD,初始化的應用程式使用App of Apps模式,指向我的Github倉庫。這提供了在將來向repo添加任意數量的配置,以及自定義部署到其中的集群或應用程式的靈活性。

app-of-apps.yaml:

apiVersion: argoproj.io/v1alpha1kind: Applicationmetadata:  name: applications  namespace: argocd  finalizers:  - resources-finalizer.argocd.argoproj.iospec:  destination:    namespace: argocd    server: https://kubernetes.default.svc  project: default  source:    path: applications    repoURL: https://github.com/mikesparr/multi-cluster-argo-demo    targetRevision: HEAD  syncPolicy:    automated:      selfHeal: true      prune: true

注意,自動同步完全是可選的。如果集群的數量很大,我建議你這樣做,這樣你的集群就可以自愈和管理漂移。然而,自動同步的一個缺點是回滾功能無法工作。

applications/文件夾(路徑)中有一個應用程式(目前來說),叫做k8s-config。這是另一個Argo應用程式,它指向另一個帶有Kubernetes configs的文件夾。

k8s-config.yaml:

apiVersion: argoproj.io/v1alpha1kind: Applicationmetadata:  name: k8s-config  namespace: argocd  finalizers:  - resources-finalizer.argocd.argoproj.iospec:  destination:    namespace: argocd    server: https://kubernetes.default.svc  project: default  source:    path: k8s-config    repoURL: https://github.com/mikesparr/multi-cluster-argo-demo    targetRevision: HEAD  syncPolicy:    automated:      selfHeal: true      prune: true

k8s-config/文件夾(路徑)包含我們想要應用到kubernetes集群的所有YAML文件。如果有很多文件需要組織,也可以選擇聲明一個應用程式來遞歸地應用configs。

原始碼倉庫

對於我的實驗,我在Github上的mikesparr/multi-cluster-argo-demo上發布了一個原始碼庫,目錄結構如下。

https://github.com/mikesparr/multi-cluster-argo-demo

原始碼倉庫結構

本例中的所有內容都在單個倉庫中,但是你可以通過使用不同的存儲庫,並授予不同團隊編輯它們的權限,來分離關注點。

Argo UI

從命令行,你可以埠轉發到argo-server服務。

kubectl -n argocd port-forward svc/argo-server 8080:443

在瀏覽器中訪問http://localhost:8080,並在提示時接受安全異常(無https)。提示:默認情況下,你用admin和argocd server pod的全名登錄:

複製argocd-server-XXXXXXX作為默認密碼

剛開始時應用程式(應用程式的應用程式)出現,直到同步

在你的應用程式的應用程式同步之後,它會識別出你的第一個應用程式k8s-config。

在兩個應用程式同步之後

如果單擊k8s-config應用程式面板,你可以看到它在伺服器上安裝的所有內容的詳細視圖。

倉庫上/k8s-config目錄中的所有YAML文件都應用到伺服器

確認集群配置

將kubectl上下文切換到每個集群,並檢查namespaces,test-namespace的serviceaccounts、roles和rolebindings。你可以看到它們都安裝在兩個集群上。恭喜你!

集群自動從Git repo安裝工作負載

無限的潛力

假設你想要向堆棧添加一個API網關,並決定使用Ambassador,或者是Kong,兩者都配置了CRD和YAML。你可以簡單地添加另一個文件夾或repo,然後在applications/文件夾中添加另一個app YAML,ArgoCD會自動為你安裝和配置它。

對於工程團隊發布的每個應用程式,他們可以在部署清單中編輯Docker鏡像版本,為更改創建一個pull request,並且你有內置的手動判斷和職責分離。PR合併後,Argo CD將分別將其部署到該集群和環境中。

另一個用例是支持多雲部署,並使用DNS平衡流量,實現真正的active-active配置。另一個用例可能是從一個雲遷移到另一個雲。

我期待著嘗試更多的可能性,並希望你喜歡另一種在不同環境中保持集群同步的方法。

清理

如果你使用了腳本和/或倉庫,請不要忘記清理和刪除你的資源,以避免不必要的帳單。最簡單的方法是使用下面的命令(或你的項目)刪除集群。

gcloud container clusters delete west gcloud container clusters delete east 

在DoiT International和Mike一起工作!請到我們的招聘網站申請工程職位:

https://careers.doit-intl.com/

點擊【閱讀原文】閱讀網站原文。

參加2020北美KubeCon + CloudNativeCon虛擬大會,免費註冊!

掃描二維碼聯繫我們!

CNCF (Cloud Native Computing Foundation)成立於2015年12月,隸屬於Linux  Foundation,是非營利性組織。 

CNCF雲原生計算基金會)致力於培育和維護一個廠商中立的開源生態系統,來推廣雲原生技術。我們通過將最前沿的模式民主化,讓這些創新為大眾所用。請長按以下二維碼進行關注。

相關焦點

  • ArgoCD 簡明教程
    2.使用 Jenkins 或 Gitlab 等 CI 工具進行自動化構建打包,並將 Docker image push 到 Harbor 鏡像倉庫。3.使用 Argo CD 部署應用。Argo CD 可以獨立於集群之外,並且支持管理多個 Kubernetes 集群。
  • 一文詳解 DevOps 工具鏈之 Argo CD
    Argo CD 從 Git Repo 拉取應用的配置,部署在 Kubernetes 集群中。當有人新增功能時,提交一個 Pull Requests 到 Git Repo 修改應用的部署配置,等待合併。應用得到更新,發送通知理解起來很容易,將運維過程自動化,持續的部署。1.3 強大而易擴展的 Argo CD對於一般的 Kubernetes 運維場景,上面描述的功能是夠用的。但是如果是複雜場景,涉及多雲、多平臺、多中間件,也是需要考慮的。
  • 使用 GitLab CI 與 Argo CD 進行 GitOps 實踐
    首先創建一個 argocd 的命名空間:$ kubectl create ns argocd然後添加 argocd 的 chart 倉庫地址:$ helm repo add argo https:接下來我們就可以使用 Helm 安裝 Argo CD
  • 在K8S中使用Argo CD做持續部署
    image.png當開發人員將開發完成的代碼推送到git倉庫會觸發CI製作鏡像並推送到鏡像倉庫CI處理完成後,可以手動或者自動修改應用配置,再將其推送到git倉庫GitOps會同時對比目標狀態和當前狀態,如果兩者不一致會觸發CD將新的配置部署到集群中其中,目標狀態是Git中的狀態,現有狀態是集群的裡的應用狀態。
  • GitOps應用實踐系列-Argo CD 實踐篇
    創建集群我們通過 KIND(Kubernetes in Docker)工具創建一個用於本地測試的 Kubernetes 集群。使用如下的配置文件,創建一個包含一個 control plane 和三個 work 的集群。
  • Kubernetes擴展神器Argo實踐
    以一個實際場景為例,我們需要實現iPaaS中間件在公有雲上自動部署,大致為兩個過程,首先通過Terraform創建虛擬機,然後通過Ansible實現中間件的自動化部署和配置。如果使用Kubernetes Job,需要解決兩個問題:Terraform創建虛擬機完成後如何通知Ansible?
  • 使用 AWS、k3s、Rancher、Vault 和 ArgoCD 在 Kubernetes 上集成 GitOps
    AWS 資源配置完成大概需要 5-10 分鐘,時間大多用在了 RDS 集群上。:$ 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
  • Argo CD使用指南:如何構建一套完整的GitOps?
    這時候由於RDS集群的原因,需要5—10分鐘的時間來配置AWS資源。-67c7856685-qm9hm 1/1 Running 0 40m現在我們可以繼續為我們的ingress和證書自動化配置通配符DNS。
  • Kubernetes 擴展神器 Argo 實踐
    以一個實際場景為例,我們需要實現iPaaS中間件在公有雲上自動部署,大致為兩個過程,首先通過Terraform創建虛擬機,然後通過Ansible實現中間件的自動化部署和配置。如果使用Kubernetes Job,需要解決兩個問題:顯然如果單純使用Kubernetes Job很難完美實現,除非在容器中封裝一個很複雜的邏輯,實現一個複雜的編排engine,這就不是Job的問題了。
  • 如何優雅的使用 GitOps 實現運維自動化
    GitOps體系學習和理解GitOps 用於對基礎設施置備的過程進行自動化,採用以 配置文件 存儲為代碼(基礎設施即代碼),配置文件在每次部署時都會生成相同的基礎設施環境,來保證環境的一致性,完成整個運維流程的自動化。
  • Kubernetes 原生 CI/CD 構建框架 Argo 詳解!
    使用流水線工具可以極大的提升這一過程的效率,只需要進行簡單的配置便可以輕鬆的完成重複性的工作。這樣的過程也被稱之為 CI。上圖流程中使用的是 Jenkins。Jenkins 作為老牌流水線框架被大家所熟知。在雲原生時代,Jenkins 推出了 Jenkins X 作為基於 Kubernetes 的新一代流水線,另外雲原生時代還誕生了兩大流水線框架—— Argo 和 Tekton。
  • 使用ArgoCD實現GitOps
    Argo CD與其他CD工具(例如Spinnaker、Tekton、Jenkins X)等的具體對比請參下圖:查看argocd中定義的K8S集群:#argocd cluster list在將應用程式配置到Argo CD之前,我們需要配置Git存儲庫,該存儲庫包含用於部署應用程式的清單將存儲庫添加到Argo CD:argocd repo add http://gogs.2886795312-80
  • Kubernetes 必備工具:2021
    GitOps 的想法是將其擴展到應用程式,因此你可以將你的服務定義為代碼,例如,通過定義 Helm Charts,並使用利用 K8s 功能的工具來監控你的應用程式的狀態並相應地調整集群。也就是說,如果更新你的代碼存儲庫或Helm Chart,生產集群也會更新。這是真正的持續部署[22]。核心原則是應用程式部署和生命周期管理應該自動化、可審計且易於理解。
  • 如何使用Kubernetes GPU集群自動化深度學習訓練?
    我寫了這篇很有用的指南,描述了每個人如何設置他們自己的 Kubernetes GPU 集群來加速他們的工作。用 Kubernetes GPU 集群進行自動化的深度學習訓練,它能極大地改進在雲上訓練模型的過程。(點擊放大圖像)下面的章節可能有些武斷。
  • 使用Kubelet API攻擊Kubernetes集群
    本文稍後將在PoC中使用其中兩個:不要驚慌關於身份驗證/授權默認配置,有一些警告。使用自動化工具安裝Kubernetes集群時,可能已對這些默認配置進行了調整以提高安全性。諸如kubeadm之類的工具已經通過一些最佳安全實踐配置了您的集群。
  • 如何使用 Gitlab CI/CD 快速集成 Kubernetes
    這些方法的主要好處是能夠通過自動化管道更頻繁地發布更高質量的代碼。GitLab 提供了一個功能齊全的工具生態系統,使我們能夠在幾分鐘內創建自動化管道!從原始碼管理到問題跟蹤和CI,我們發現一切都在一個屋簷下,完全集成並隨時可用,如下圖所示:在本文我們將在 Kubernetes 集群上創建一個使用 GitLab
  • Kubernetes container-native workflow engine: Argo
    /install.yaml安裝好後可以看到 K8s 集群中安裝了幾個 CRD 和一個 Controller 及其 RBAC 資源。除了使用 kubectl 來使用 argo workflow 之外,還可以使用 argo cli。
  • Argo項目
    Argo CD - 支持基於聲明式GitOps的Kubernetes資源部署,包括Argo Events、服務和跨多個K8s集群的部署。Argo Rollouts - 支持聲明式漸進交付策略,如灰度、藍綠、和更一般的實驗形式。Argo項目由CNCF(Cloud Native Computing Foundation,雲原生計算基金會)託管。
  • 使用 kube-vip 搭建高可用的 Kubernetes 集群(完整版)
    在以前我們在私有環境下創建 Kubernetes 集群時,我們需要準備一個硬體/軟體的負載均衡器來創建多控制面集群,更多的情況下我們會選擇使用 HAProxy + Keepalived 來實現這個功能。
  • 使用Minikube安裝Kubernetes集群
    Kubernetes,想要運行一個簡單的容器集群環境,對於沒有使用過Kubernetes的人來說,需要花費一定的時間去理解各組件的概念和功能,再做大量的安裝配置工作才能運行一個kubernetes集群。