ArgoCD 入門¶
原文: https://redhat-scholars.github.io/argocd-tutorial/argocd-tutorial/02-getting_started.html
確認 Argo CD 已啟動並運行後,讓我們探索如何訪問和管理 Argo CD。
曝露 ArgoCD 服務¶
為了簡化學習,我們使用 kubectl port-forward
來將 argocd
的 Web UI 服務曝露出來。打開一個新的 terminal
並輸入下列的命令:
Tip
Kubernetes 為我們提供了一個功能,可以通過 Kubernetes 客戶端主機端口轉發在 Kubernetes 內部網絡中運行的應用程序。默認情況下它綁定到 127.0.0.1 並且它不會接受來自外部主機的請求。
端口轉發命令的語法如下。
我在下面給出一個端口轉發命令的例子。下面的命令會將在端口 443 中運行的服務端口轉發到 kubectl 客戶端主機中的端口 8443。
當我嘗試使用客戶端計算機的 IP 地址和端口從另一台計算機打開此 URL 時,它不起作用。原因是因為8080端口綁定了 127.0.0.1
。
為了讓它工作,我們必須讓這個端口監聽 0.0.0.0。
這可以通過在命令中添加附加參數來輕鬆實現。語法如下。
有關 Kubernetes Port Forwarding 的詳細說明參閱: Use Port Forwarding to Access Applications in a Cluster
連接到 ArgoCD¶
您可以使用 CLI 或 Web 控制台連接到 ArgoCD。
默認情況下,ArgoCD 會生成一個管理員用戶,以及在部署 ArgoCD 時生成的隨機密碼。
使用 CLI 連接¶
安裝 argocd
CLI 的工具:
$ curl -sSL -o /usr/local/bin/argocd https://github.com/argoproj/argo-cd/releases/latest/download/argocd-linux-amd64
$ wget https://github.com/argoproj/argo-cd/releases/download/v2.4.3/argocd-linux-amd64
$ chmod +x /usr/local/bin/argocd
使用 argocd CLI 登錄 ArgoCD 實例¶
取得部署 ArgoCD 時生成的隨機密碼:
$ argoPass=$(kubectl -n argocd get secret argocd-initial-admin-secret -o jsonpath="{.data.password}" | base64 -d)
$ echo $argoPass
將 ArgoCD 網絡位址設成環境變數:
使用 ArgoCD cli 登錄到 ArgoCD:
$ argocd login --insecure --grpc-web $argoURL --username admin --password $argoPass
'admin:login' logged in successfully
Context '0.0.0.0:8443' updated
與 Web 控制台連接¶
使用瀏覽器來連接 ArgoCD 控制台。
使用用戶 admin
和上一步中提取的密碼訪問 ArgoCD 控制台:
登錄後,您應該會看到以下頁面。
這是 Argo CD Web UI。
部署範例應用程序¶
對於本教程,我們將使用 Redhat 在 Github 公開的 GitOps 範例存儲庫。我們將使用這個 repo 來部署我們的第一個應用程序並包含清單來部署我們的示例應用程序。
- Redhat Developer Demo: https://github.com/redhat-developer-demos/openshift-gitops-examples
應用程序 Manifest 更新與保存在 Git Repo¶
應用程序要設定在 Kubernetes 裡的 manifet 清單包括:
Namespace:
Deployment:
---
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
app: bgd
name: bgd
namespace: bgd
spec:
replicas: 1
selector:
matchLabels:
app: bgd
strategy: {}
template:
metadata:
labels:
app: bgd
spec:
containers:
- image: quay.io/redhatworkshops/bgd:latest
name: bgd
env:
- name: COLOR
value: "blue"
resources: {}
---
Service:
NodePort 類型的服務:
---
apiVersion: v1
kind: Service
metadata:
labels:
app: bgd
name: bgd
namespace: bgd
spec:
type: NodePort
ports:
- port: 8080
protocol: TCP
targetPort: 8080
selector:
app: bgd
---
Ingress:
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: bgd
spec:
rules:
- host: bgd.devnation
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: bgd
port:
number: 8080
設定 應用程序 Argo 的 Application 物件¶
ArgoCD 定義了一個 Kubernetes 客製的API (CRD) 物件 Application
。你必須這樣定義 Application
後 ArgoCD 才知道如何在 Kubernetes 集群中應用這些清單。
為此,您可以在 ArgoCD 中定義和應用應用程序清單。讓我們檢查用於部署我們的應用程序的 bgd-app.yaml並將其分解一下:
apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
name: bgd-app
namespace: argocd
spec:
destination:
namespace: bgd
server: https://kubernetes.default.svc # 1
project: default # 2
source: # 3
path: apps/bgd/overlays/bgd
repoURL: https://github.com/redhat-developer-demos/openshift-gitops-examples
targetRevision: minikube
syncPolicy: # 4
automated:
prune: true
selfHeal: false
syncOptions:
- CreateNamespace=true
- 目標服務器是我們安裝 ArgoCD 的服務器。
- 在 ArgoCD 的默認項目 (.spec.project) 中安裝應用程序。
- YAML 所在的清單存儲庫和要查找的路徑。
- syncPolicy 設置為 false。請注意,您可以讓 Argo CD 自動同步 repo。
Application
CR (CustomResource) 可以通過運行以下命令來應用:
$ kubectl apply -f documentation/modules/ROOT/examples/minikube/bgd-app/bgd-app.yaml
application.argoproj.io/bgd-app created
我們可在 ArgoCD UI 中觀察到 bgd-app
的創建。
點擊此“卡片”將帶您進入概覽頁面。您可能會看到它仍在進行中或完全同步。
Tip
您可能需要點擊此頁面上的顯示隱藏資源才能查看全部內容
此時應用程序應該已啟動並正在運行。
您可以看到使用以下命令創建的所有資源:
輸出應如下所示:
NAME READY STATUS RESTARTS AGE
pod/bgd-788cb756f7-kz448 1/1 Running 0 10m
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/bgd ClusterIP 172.30.111.118 <none> 8080/TCP 10m
NAME READY UP-TO-DATE AVAILABLE AGE
deployment.apps/bgd 1/1 1 1 10m
首先等待部署完成:
然後訪問您的應用程序:
由於我們使用了 Kubernetes Ingress
的 Domain Name (Hostname) 設定來進行對不同 Web 服務的映射。我們必須利用某種Name resolving的服務來解析 bgd.devnation
的網域名到本機的 IP Address。最簡易的方法就是在主機的hosts 檔裡頭手動設定網址與 IP 映射。
將跑 K3D 的主機 IP 和 Ingress 裡定義的主機名 bgd.devnation
添加到你的主機文件中,例如 /etc/hosts
。
Windows 系統的 hosts 設定檔路徑是:
這個 hosts 設定檔的內容預設應該都只有註解(# 開頭的就是註解),沒有什麼特別的內容,我們可以在檔案的最後加上自己的設定,第一個欄位是 IP 位址,然後使用空白或 Tab 分隔,第二個欄位就放主機的 FQDN(也就是網址)。
# Copyright (c) 1993-2009 Microsoft Corp.
#
# This is a sample HOSTS file used by Microsoft TCP/IP for Windows.
#
# This file contains the mappings of IP addresses to host names. Each
# entry should be kept on an individual line. The IP address should
# be placed in the first column followed by the corresponding host name.
# The IP address and the host name should be separated by at least one
# space.
#
# Additionally, comments (such as these) may be inserted on individual
# lines or following the machine name denoted by a '#' symbol.
#
# For example:
#
# 102.54.94.97 rhino.acme.com # source server
# 38.25.63.10 x.acme.com # x client host
# localhost name resolution is handled within DNS itself.
# 127.0.0.1 localhost
# ::1 localhost
xxx.xxx.xxx.xxx bgd.devnation bgdk.devnation
Tip
請將 xxx.xxx.xxx.xxx
替換成跑 K3D 服務的主機 IP!
在 Linux 系統上 hosts 設定檔放在
如果要修改它,要使用 root 管理者權限修改:
127.0.0.1 localhost
127.0.1.1 dxlab-ThinkPad-T580
xxx.xxx.xxx.xxx bgd.devnation bgdk.devnation
# The following lines are desirable for IPv6 capable hosts
::1 ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
Tip
請將 xxx.xxx.xxx.xxx
替換成跑 K3D 服務的主機 IP!
Info
由於我們要使用 Ingress
來接入佈署在 Kubernetes 集群裡的 application。在 Kubernetes 中主要有兩種模式:
模式1. 使用路徑來進行對不同服務的映射
模式2. 使用 Domain Name (Hostname) 來進行對不同服務的映射
本範例使用的是 模式2。
我們的 Kubernetes 是使用下列的命令所創建的:
代表著我們把 K3D 裡的 Ingress Control
映射到本機的 8081
端口。
因此你可使用瀏覽器 http://bgd.devnation:8081
來連接到剛剛佈署的應用程序。
您的應用程序應如下所示。
讓我們介紹一個變化!修補實時清單以將框的顏色從藍色更改為綠色:
$ kubectl -n bgd patch deploy/bgd --type='json' -p='[{"op": "replace", "path": "/spec/template/spec/containers/0/env/0/value", "value":"green"}]'
等待 rollout 完成:
如果您刷新您的應用程序正在運行的選項卡,您現在應該會看到一個綠色方塊。
查看您的 Argo CD Web UI,您可以看到 Argo 將您的應用程序檢測為 “Out of Sync”。
上述的結果說明了在一般CI/CD的流水線的設計中如果允許開發者/運維者可直接操縱 Kubernetes 會導致的結果。
您可以通過 Argo CD 再次同步您的應用程序:
- 首先點擊
SYNC
- 然後點擊
SYNCHRONIZE
相反,您可以運行:
同步過程完成後,Argo CD UI 應該將應用程序標記為同步。
如果您在運行應用程序的選項卡上重新加載頁面。它應該回到藍色方塊。
您可以通過設置 Application
的 manifest 來設置 Argo CD 以自動糾正漂移。
例子:
或者,在我們的例子中,事後通過運行以下命令:
$ kubectl patch application/bgd-app -n argocd --type=merge -p='{"spec":{"syncPolicy":{"automated":{"prune":true,"selfHeal":true}}}}'
上述的結果說明了在一般CI/CD的流水線的設計中如果允許開發者/運維者可直接操縱 Kubernetes 會導致的結果。
GitOps 概念回顧¶
- CI/CD Pipeline 內不進行任何部署動作
- 資源的描述狀態 (Yaml/Helm Chart) 放在 Git 裡面,Git 作為 Single Source of Truth的角色
- Kubernetes 內部有一個 Controller 會定期去偵測 Git 的變化,並且把 Git 內的變動都更新到 Kubernetes 裡面
這意味者任何人如果想要對 Kubernetes Cluster 進行修改,只有一個辦法就是 更新 Git Repo,一旦 Git Repo 內描述的 Yaml/Helm Chart 有任何修改,Kubernetes Cluster 內的 Controller 會負責將這些變動的差異性更新到 Kubernetes Cluster 內。
因此 Git repo 就是唯一的來源,同時透過 Git 版本控制的特性,如果想要針對資源進行版本更動, rollback 等操作,直接針對 Git 管理(譬如 git revert)。
此外,GitOps 的過程中,任何人都不應該直接對 Kubernetes Cluster 直接操作,因此也不需要將 KUBECONFIG 這個檔案給分享出去,因此安全性的隱憂也就迎刃而解。