<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          GitOps 持續(xù)部署工具 Argo CD 初體驗

          共 19174字,需瀏覽 39分鐘

           ·

          2021-07-05 14:27

          Argo CD 是一個為 Kubernetes 而生的,遵循聲明式 GitOps 理念的持續(xù)部署工具。Argo CD 可在 Git 存儲庫更改時自動同步和部署應用程序。

          Argo CD 遵循 GitOps 模式,使用 Git 倉庫作為定義所需應用程序狀態(tài)的真實來源,Argo CD 支持多種 Kubernetes 清單:

          • kustomize
          • helm charts
          • ksonnet applications
          • jsonnet files
          • Plain directory of YAML/json manifests
          • Any custom config management tool configured as a config management plugin

          Argo CD 可在指定的目標環(huán)境中自動部署所需的應用程序狀態(tài),應用程序部署可以在 Git 提交時跟蹤對分支、標簽的更新,或固定到清單的指定版本。

          架構

          ArgoCD架構

          Argo CD 是通過一個 Kubernetes 控制器來實現的,它持續(xù) watch 正在運行的應用程序并將當前的實時狀態(tài)與所需的目標狀態(tài)( Git 存儲庫中指定的)進行比較。已經部署的應用程序的實際狀態(tài)與目標狀態(tài)有差異,則被認為是 OutOfSync 狀態(tài),Argo CD 會報告顯示這些差異,同時提供工具來自動或手動將狀態(tài)同步到期望的目標狀態(tài)。在 Git 倉庫中對期望目標狀態(tài)所做的任何修改都可以自動應用反饋到指定的目標環(huán)境中去。

          下面簡單介紹下 Argo CD 中的幾個主要組件:

          API 服務:API 服務是一個 gRPC/REST 服務,它暴露了 Web UI、CLI 和 CI/CD 系統(tǒng)使用的接口,主要有以下幾個功能:

          • 應用程序管理和狀態(tài)報告
          • 執(zhí)行應用程序操作(例如同步、回滾、用戶定義的操作)
          • 存儲倉庫和集群憑據管理(存儲為 K8S Secrets 對象)
          • 認證和授權給外部身份提供者
          • RBAC
          • Git webhook 事件的偵聽器/轉發(fā)器

          倉庫服務:存儲倉庫服務是一個內部服務,負責維護保存應用程序清單 Git 倉庫的本地緩存。當提供以下輸入時,它負責生成并返回 Kubernetes 清單:

          • 存儲 URL
          • revision 版本(commit、tag、branch)
          • 應用路徑
          • 模板配置:參數、ksonnet 環(huán)境、helm values.yaml 等

          應用控制器:應用控制器是一個 Kubernetes 控制器,它持續(xù) watch 正在運行的應用程序并將當前的實時狀態(tài)與所期望的目標狀態(tài)( repo 中指定的)進行比較。它檢測應用程序的 OutOfSync 狀態(tài),并采取一些措施來同步狀態(tài),它負責調用任何用戶定義的生命周期事件的鉤子(PreSync、Sync、PostSync)。

          功能

          • 自動部署應用程序到指定的目標環(huán)境
          • 支持多種配置管理/模板工具(Kustomize、Helm、Ksonnet、Jsonnet、plain-YAML)
          • 能夠管理和部署到多個集群
          • SSO 集成(OIDC、OAuth2、LDAP、SAML 2.0、GitHub、GitLab、Microsoft、LinkedIn)
          • 用于授權的多租戶和 RBAC 策略
          • 回滾/隨時回滾到 Git 存儲庫中提交的任何應用配置
          • 應用資源的健康狀況分析
          • 自動配置檢測和可視化
          • 自動或手動將應用程序同步到所需狀態(tài)
          • 提供應用程序活動實時視圖的 Web UI
          • 用于自動化和 CI 集成的 CLI
          • Webhook 集成(GitHub、BitBucket、GitLab)
          • 用于自動化的 AccessTokens
          • PreSync、Sync、PostSync Hooks,以支持復雜的應用程序部署(例如藍/綠和金絲雀發(fā)布)
          • 應用程序事件和 API 調用的審計
          • Prometheus 監(jiān)控指標
          • 用于覆蓋 Git 中的 ksonnet/helm 參數

          核心概念

          • Application:應用,一組由資源清單定義的 Kubernetes 資源,這是一個 CRD 資源對象
          • Application source type:用來構建應用的工具
          • Target state:目標狀態(tài),指應用程序所需的期望狀態(tài),由 Git 存儲庫中的文件表示
          • Live state:實時狀態(tài),指應用程序實時的狀態(tài),比如部署了哪些 Pods 等真實狀態(tài)
          • Sync status:同步狀態(tài)表示實時狀態(tài)是否與目標狀態(tài)一致,部署的應用是否與 Git 所描述的一樣?
          • Sync:同步指將應用程序遷移到其目標狀態(tài)的過程,比如通過對 Kubernetes 集群應用變更
          • Sync operation status:同步操作狀態(tài)指的是同步是否成功
          • Refresh:刷新是指將 Git 中的最新代碼與實時狀態(tài)進行比較,弄清楚有什么不同
          • Health:應用程序的健康狀況,它是否正常運行?能否為請求提供服務?
          • Tool:工具指從文件目錄創(chuàng)建清單的工具,例如 Kustomize 或 Ksonnet 等
          • Configuration management tool:配置管理工具
          • Configuration management plugin:配置管理插件

          安裝

          當然前提是需要有一個 kubectl 可訪問的 Kubernetes 的集群,直接使用下面的命令即可,這里我們安裝最新的穩(wěn)定版 v2.0.4:

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

          如果你要用在生產環(huán)境,則可以使用下面的命令部署一個 HA 高可用的版本:

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

          這將創(chuàng)建一個新的命名空間 argocd,Argo CD 的服務和應用資源都將部署到該命名空間。

          $ kubectl get pods -n argocd
          NAME                                  READY   STATUS    RESTARTS   AGE
          argocd-application-controller-0       1/1     Running   0          15m
          argocd-dex-server-76ff776f97-ds7mm    1/1     Running   0          15m
          argocd-redis-747b678f89-w99wf         1/1     Running   0          15m
          argocd-repo-server-6fc4456c89-586zl   1/1     Running   0          15m
          argocd-server-7d57bc994b-kkwsd        1/1     Running   0          15m

          如果你對 UI、SSO、多集群管理這些特性不感興趣,只想把應用變更同步到集群中,那么你可以使用 --disable-auth 標志來禁用認證,可以通過命令 kubectl patch deploy argocd-server -n argocd -p '[{"op": "add", "path": "/spec/template/spec/containers/0/command/-", "value": "--disable-auth"}]' --type json 來實現。

          然后我們可以在本地安裝 CLI 工具方便操作 Argo CD,我們可以在 Argo CD Git 倉庫發(fā)布頁面(https://github.com/argoproj/argo-cd/releases/latest)查看最新版本的 Argo CD 或運行以下命令來獲取版本:

          VERSION=$(curl --silent "https://api.github.com/repos/argoproj/argo-cd/releases/latest" | grep '"tag_name"' | sed -E 's/.*"([^"]+)".*/\1/')

          VERSION 在下面的命令中替換為你要下載的 Argo CD 版本:

          curl -sSL -o /usr/local/bin/argocd https://github.com/argoproj/argo-cd/releases/download/$VERSION/argocd-linux-amd64

          為 argocd CLI 賦予可執(zhí)行權限:

          $ chmod +x /usr/local/bin/argocd
          $ argocd version
          argocd: v2.0.4+0842d44
            BuildDate: 2021-06-23T01:29:55Z
            GitCommit: 0842d448107eb1397b251e63ec4d4bc1b4efdd6e
            GitTreeState: clean
            GoVersion: go1.16
            Compiler: gc
            Platform: darwin/amd64
          argocd-server: v2.0.4+0842d44
            BuildDate: 2021-06-23T01:27:53Z
            GitCommit: 0842d448107eb1397b251e63ec4d4bc1b4efdd6e
            GitTreeState: clean
            GoVersion: go1.16
            Compiler: gc
            Platform: linux/amd64
            Ksonnet Version: v0.13.1
            Kustomize Version: v3.9.4 2021-02-09T19:22:10Z
            Helm Version: v3.5.1+g32c2223
            Kubectl Version: v0.20.4
            Jsonnet Version: v0.17.0

          現在我們就可以使用 argocd 命令了。

          如果你是 Mac,則可以直接使用 brew install argocd 進行安裝。

          Argo CD 會運行一個 gRPC 服務(由 CLI 使用)和 HTTP/HTTPS 服務(由 UI 使用),這兩種協(xié)議都由 argocd-server 服務在以下端口進行暴露:

          • 443 - gRPC/HTTPS
          • 80 - HTTP(重定向到 HTTPS)

          我們可以通過配置 Ingress 的方式來對外暴露服務,這里我們仍然使用 Traefik 的 IngressRoute 進行配置,其他 Ingress 控制器的配置可以參考官方文檔 https://argo-cd.readthedocs.io/en/stable/operator-manual/ingress/ 進行配置。

          由于 Traefik 它可以在同一端口處理 TCP 和 HTTP 連接,所以我們不需要定義多個 IngressRoute 來暴露 HTTP 和 gRPC 服務,然后應在禁用 TLS 的情況下運行 API 服務,編輯 argocd-server Deployment 以將 --insecure 標志添加到 argocd-server 命令中:

          spec:
            template:
              spec:
                containers:
                - name: argocd-server
                  command:
                  - argocd-server
                  - --staticassets
                  - /shared/app
                  - --repo-server
                  - argocd-repo-server:8081
                  - --insecure  # 需要禁用 tls,否則會 `redirected you too many times`

          然后創(chuàng)建如下所的 IngressRoute 資源對象即可,我們創(chuàng)建了一個 redirect-https 的中間件,可以讓 http 服務強制跳轉到 https 服務去:

          apiVersion: traefik.containo.us/v1alpha1
          kind: Middleware
          metadata:
            name: redirect-https
            namespace: argocd
          spec:
            redirectScheme:
              scheme: https
          ---
          apiVersion: traefik.containo.us/v1alpha1
          kind: IngressRoute
          metadata:
            name: argocd-server-http
            namespace: argocd
          spec:
            entryPoints:
              - web
            routes:
              - kind: Rule
                match: Host(`argocd.k8s.local`)
                priority: 10
                middlewares:
                  - name: redirect-https
                services:
                  - name: argocd-server
                    port: 80
              - kind: Rule
                match: Host(`argocd.k8s.local`) && Headers(`Content-Type`, `application/grpc`)
                priority: 11
                middlewares:
                  - name: redirect-https
                services:
                  - name: argocd-server
                    port: 80
                    scheme: h2c
          ---
          apiVersion: traefik.containo.us/v1alpha1
          kind: IngressRoute
          metadata:
            name: argocd-server
            namespace: argocd
          spec:
            entryPoints:
              - websecure
            routes:
              - kind: Rule
                match: Host(`argocd.k8s.local`)
                priority: 10
                services:
                  - name: argocd-server
                    port: 80
              - kind: Rule
                match: Host(`argocd.k8s.local`) && Headers(`Content-Type`, `application/grpc`)
                priority: 11
                services:
                  - name: argocd-server
                    port: 80
                    scheme: h2c
            tls:
              certResolver: default
              options: {}

          創(chuàng)建完成后,我們就可以通過 argocd.k8s.local 來訪問 Argo CD 服務了,不過需要注意我們這里配置的證書是自簽名的,所以在第一次訪問的時候會提示不安全,強制跳轉即可:

          argocd ui

          默認情況下 admin 帳號的初始密碼是自動生成的,會以明文的形式存儲在 Argo CD 安裝的命名空間中名為 password 的 Secret 對象下的 argocd-initial-admin-secret 字段下,我們可以用下面的命令來獲取:

          kubectl -n argocd get secret argocd-initial-admin-secret -o jsonpath="{.data.password}" | base64 -d && echo

          使用用戶名 admin 和上面輸出的密碼即可登錄 Dashboard,同樣我們也可以通過 ArgoCD CLI 命令行工具進行登錄:

          $ argocd login argocd.k8s.local

          WARNING: server certificate had error: x509: certificate is valid for e2d1e856c987c94f3c918276921a61ba.6a98e1283291d1b7a23d19e240b6ee89.traefik.default, not argocd.k8s.local. Proceed insecurely (y/n)? y
          Username: admin
          Password:
          'admin:login' logged in successfully
          Context 'argocd.k8s.local' updated

          CLI 登錄成功后,可以使用如下所示命令更改密碼:

          $ argocd account update-password
          *** Enter current password:
          *** Enter new password:
          *** Confirm new password:
          Password updated
          Context 'argocd.k8s.local' updated

          配置集群

          由于 Argo CD 支持部署應用到多集群,所以如果你要將應用部署到外部集群的時候,需要先將外部集群的認證信息注冊到 Argo CD 中,如果是在內部部署(運行 Argo CD 的同一個集群,默認不需要配置),應該使用 https://kubernetes.default.svc 作為應用的 K8S APIServer 地址。

          首先列出當前 kubeconfig 中的所有集群上下文:

          kubectl config get-contexts -o name

          從列表中選擇一個上下文名稱并將其提供給 argocd cluster add CONTEXTNAME,比如對于 docker-desktop上下文,運行:

          argocd cluster add docker-desktop

          上述命令會將 ServiceAccount (argocd-manager) 安裝到該 kubectl 上下文的 kube-system 命名空間中,并將 ServiceAccount 綁定到管理員級別的 ClusterRole,Argo CD 使用此 ServiceAccount 令牌來執(zhí)行任務管理(部署/監(jiān)控)。

          argocd-manager-role 可以修改 Role 的規(guī)則,使其僅對有限的一組命名空間、組、種類具有 create、update、patch、delete 等權限,但是對于 Argo CD 需要 get,list,watch 的權限在 ClusterRole 范圍內。

          創(chuàng)建應用

          Git 倉庫 https://github.com/argoproj/argocd-example-apps.git 是一個包含留言簿應用程序的示例庫,我們可以用該應用來演示 Argo CD 的工作原理。

          通過 CLI 創(chuàng)建應用

          我們可以通過 argocd app create xxx 命令來創(chuàng)建一個應用:

          $ argocd app create --help
          Create an application

          Usage:
            argocd app create APPNAME [flags]

          Examples:

                  # Create a directory app
                  argocd app create guestbook --repo https://github.com/argoproj/argocd-example-apps.git --path guestbook --dest-namespace default --dest-server https://kubernetes.default.svc --directory-recurse

                  # Create a Jsonnet app
                  argocd app create jsonnet-guestbook --repo https://github.com/argoproj/argocd-example-apps.git --path jsonnet-guestbook --dest-namespace default --dest-server https://kubernetes.default.svc --jsonnet-ext-str replicas=2

                  # Create a Helm app
                  argocd app create helm-guestbook --repo https://github.com/argoproj/argocd-example-apps.git --path helm-guestbook --dest-namespace default --dest-server https://kubernetes.default.svc --helm-set replicaCount=2

                  # Create a Helm app from a Helm repo
                  argocd app create nginx-ingress --repo https://kubernetes-charts.storage.googleapis.com --helm-chart nginx-ingress --revision 1.24.3 --dest-namespace default --dest-server https://kubernetes.default.svc

                  # Create a Kustomize app
                  argocd app create kustomize-guestbook --repo https://github.com/argoproj/argocd-example-apps.git --path kustomize-guestbook --dest-namespace default --dest-server https://kubernetes.default.svc --kustomize-image gcr.io/heptio-images/ks-guestbook-demo:0.1

                  # Create a app using a custom tool:
                  argocd app create ksane --repo https://github.com/argoproj/argocd-example-apps.git --path plugins/kasane --dest-namespace default --dest-server https://kubernetes.default.svc --config-management-plugin kasane


          Flags:
          ......

          直接執(zhí)行如下所示命令即可:

          $ argocd app create guestbook --repo https://github.com/argoproj/argocd-example-apps.git --path guestbook --dest-server https://kubernetes.default.svc --dest-namespace default
          application 'guestbook' created

          通過 UI 創(chuàng)建應用

          除了可以通過 CLI 工具來創(chuàng)建應用,我們也可以通過 UI 界面來創(chuàng)建,定位到 argocd.k8s.local 頁面,登錄后,點擊 +New App 新建應用按鈕,如下圖:

          New App

          將應用命名為 guestbook,使用 default project,并將同步策略設置為 Manual

          配置應用

          然后在下面配置 Repository URL 為 https://github.com/argoproj/argocd-example-apps.git,由于某些原因我們這里使用遷移到 Gitee 上面的倉庫地址 https://gitee.com/cnych/argocd-example-apps,將 Revision 設置為 HEAD,并將路徑設置為 guestbook:

          配置Repo

          然后下面的 Destination 部分,將 cluster 設置為 in-cluster 和 namespace 為 default:

          配置集群

          填寫完以上信息后,點擊頁面上方的 Create 安裝,即可創(chuàng)建 guestbook 應用,創(chuàng)建完成后可以看到當前應用的處于 OutOfSync 狀態(tài):

          guestbook application

          部署應用

          由于上面我們在創(chuàng)建應用的時候使用的同步策略為 Manual,所以應用創(chuàng)建完成后沒有自動部署,需要我們手動去部署應用。同樣可以通過 CLI 和 UI 界面兩種同步方式。

          使用 CLI 同步

          應用創(chuàng)建完成后,我們可以通過如下所示命令查看其狀態(tài):

          $ argocd app get guestbook
          Name:               guestbook
          Project:            default
          Server:             https://kubernetes.default.svc
          Namespace:          default
          URL:                https://argocd.k8s.local/applications/guestbook
          Repo:               https://gitee.com/cnych/argocd-example-apps
          Target:             HEAD
          Path:               guestbook
          SyncWindow:         Sync Allowed
          Sync Policy:        <none>
          Sync Status:        OutOfSync from HEAD (53e28ff)
          Health Status:      Missing

          GROUP  KIND        NAMESPACE  NAME          STATUS     HEALTH   HOOK  MESSAGE
                 Service     default    guestbook-ui  OutOfSync  Missing
          apps   Deployment  default    guestbook-ui  OutOfSync  Missing

          應用程序狀態(tài)為初始 OutOfSync 狀態(tài),因為應用程序尚未部署,并且尚未創(chuàng)建任何 Kubernetes 資源。要同步(部署)應用程序,可以執(zhí)行如下所示命令:

          argocd app sync guestbook

          此命令從 Git 倉庫中檢索資源清單并執(zhí)行 kubectl apply 部署應用,執(zhí)行上面命令后 guestbook 應用便會運行在集群中了,現在我們就可以查看其資源組件、日志、事件和評估其健康狀態(tài)了。

          通過 UI 同步

          直接添加 UI 界面上應用的 Sync 按鈕即可開始同步:

          sync 操作

          同步完成后可以看到我們的資源狀態(tài):

          Sync 完成

          還可以有不同的視角進行查看:

          Sync 完成

          也可以通過 kubectl 查看到我們部署的資源:

          ?  ~ kubectl get pods
          NAME                                      READY   STATUS      RESTARTS   AGE
          guestbook-ui-6c96fb4bdc-nmk9b             1/1     Running     0          2m22s
          ?  ~ kubectl get svc
          NAME                 TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)    AGE
          guestbook-ui         ClusterIP   10.96.32.11     <none>        80/TCP     11m
          kubernetes           ClusterIP   10.96.0.1       <none>        443/TCP    41d

          和我們從 Git 倉庫中同步 guestbook 目錄下面的資源狀態(tài)也是同步的,證明同步成功了。

          期望狀態(tài)

          接下來我們再來講解 Argo CD 的實踐,敬請期待!


          明日公開課預告


           點擊屏末  | 即刻學習


          掃描二維碼獲取

          更多云原生知識





          k8s 技術圈





          瀏覽 64
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  先锋资源日韩 | 亚洲高潮视频 | 色五月婷婷丁香五月婷婷 | 蜜桃视频APP在线观看久久 | 欧美久久性爱视频 |