@
ArgoCD 官網地址 https://argoproj.github.io/cd
ArgoCD 最新官網檔案 https://argo-cd.readthedocs.io/en/stable/
ArgoCD GitHub原始碼地址 https://github.com/argoproj/argo-cd
Argo官網 https://argoproj.github.io/ (用Kubernetes做更多的事情,用於Kubernetes執行工作流、管理叢集和正確執行giitops的開源工具)
Argo CD是Kubernetes的宣告式、GitOps連續交付工具。Argo CD是由Intuit主導的開源專案,是Argo專案集合中的一個,Argo專案集合還包括Argo Workflow、Argo Rollout、Argo Event等專案。
Argo CD 遵循 GitOps 模式,使用 Git 倉庫作為定義所需應用程式狀態的真實來源,Argo CD 支援多種 Kubernetes 清單:
Argo CD主要優勢有:
Argo CD 是通過一個 Kubernetes 控制器來實現的,它持續 watch 正在執行的應用程式並將當前的實時狀態與所需的目標狀態( Git 儲存庫中指定的)進行比較。已經部署的應用程式的實際狀態與目標狀態有差異,則被認為是 狀態,Argo CD 會報告顯示這些差異,同時提供工具來自動或手動將狀態同步到期望的目標狀態。在 Git 倉庫中對期望目標狀態所做的任何修改都可以自動應用反饋到指定的目標環境中去。
Application:應用,一組由資源清單定義的 Kubernetes 資源,這是一個 CRD 資源物件
Application source type:用來構建應用的工具
Target state:目標狀態,指應用程式所需的期望狀態,由 Git 儲存庫中的檔案表示
Live state:實時狀態,指應用程式實時的狀態,比如部署了哪些 Pods 等真實狀態
Sync status:同步狀態表示實時狀態是否與目標狀態一致,部署的應用是否與 Git 所描述的一樣?
Sync:同步指將應用程式遷移到其目標狀態的過程,比如通過對 Kubernetes 叢集應用變更
Sync operation status:同步操作狀態指的是同步是否成功
Refresh:重新整理是指將 Git 中的最新程式碼與實時狀態進行比較,弄清楚有什麼不同
Health:應用程式的健康狀況,它是否正常執行?能否為請求提供服務?
Tool:工具指從檔案目錄建立清單的工具,例如 Kustomize 或 Ksonnet 等
Configuration management tool:設定管理工具
Configuration management plugin:設定管理外掛
需要安裝K8S叢集,前面文章我們分別使用KubeAdmin和Rancher部署過完整K8S叢集,如果是建議測試的可以使用Kubekey快速部署一個AllInOne單節點K8S,Kubekey為kubesphere下子專案,後面在安裝K9S以命令列介面方式檢視和管理K8S叢集。
mkdir kubekey
cd kubekey
# 下載最新版本v2.2.2
wget https://github.com/kubesphere/kubekey/releases/download/v2.2.2/kubekey-v2.2.2-linux-amd64.tar.gz
tar -xvf kubekey-v2.2.2-linux-amd64.tar.gz
# 解壓完為有檔名為kk可執行檔案,檢視版本資訊
./kk version
export KKZONE=cn
# 生成設定
./kk create config --name kk-k8s
修改config-kk-k8s.yaml內容如下,vi config-kk-k8s.yaml
apiVersion: kubekey.kubesphere.io/v1alpha2
kind: Cluster
metadata:
name: kk-k8s
spec:
hosts:
- {name: k8snode, address: 192.168.50.95, internalAddress: 192.168.50.95, user: root, password: "zijimima"}
roleGroups:
etcd:
- k8snode
control-plane:
- k8snode
worker:
- k8snode
controlPlaneEndpoint:
## Internal loadbalancer for apiservers
# internalLoadbalancer: haproxy
domain: kk-k8s.api.com
address: ""
port: 6443
kubernetes:
version: v1.23.8
clusterName: cluster.local
autoRenewCerts: true
containerManager: docker
etcd:
type: kubekey
network:
plugin: calico
kubePodsCIDR: 10.233.64.0/18
kubeServiceCIDR: 10.233.0.0/18
## multus support. https://github.com/k8snetworkplumbingwg/multus-cni
multusCNI:
enabled: false
registry:
privateRegistry: ""
namespaceOverride: ""
registryMirrors: []
insecureRegistries: []
addons: []
開始建立叢集
setenforce 0
yum install socat conntrack ebtables ipset
./kk create cluster -f config-kk-k8s.yaml
等待一段時間安裝,安裝完成後列印安裝完成的紀錄檔
yum install bash-completion -y
# 安裝Kubectl 這個之前文章有,這裡就不再說明
echo "source <(kubectl completion bash)" >> ~/.bashrc
source ~/.bashrc
這裡我們使用前面文章基於Rancher建立好的K8S叢集
mkdir k9s
cd k9s
# 下載最新版本v0.26.3
wget https://github.com/derailed/k9s/releases/download/v0.26.3/k9s_Linux_x86_64.tar.gz
# 解壓檔案
tar -xvf k9s_Linux_x86_64.tar.gz
./k9s version
直接執行./k9s,冒號後輸入也支援簡寫比如ns
OpenELB
作為 k8s 的 LoadBalancer
,主要涉及 OpenELB 的 Layer2 模式和 BGP 模式兩種部署方案。例如:Layer2 模式需要我們的 k8s 叢集基礎環境支援傳送 anonymous ARP/NDP packets。因為 OpenELB 是針對裸金屬伺服器設計的,因此如果是在雲環境中部署,需要注意是否滿足條件。
主要的工作流程就如同上面描述的一般,但是還有幾個需要額外注意的點:
# 以yaml方式部署openelb
wget https://raw.githubusercontent.com/openelb/openelb/master/deploy/openelb.yaml
kubectl apply -f openelb.yaml
設定 loadbalancerIP 所在的網段資源,建立一個 Eip 物件來進行定義,後面對 IP 段的管理也是在這裡進行
apiVersion: network.kubesphere.io/v1alpha2
kind: Eip
metadata:
# Eip 物件的名稱。
name: eip-layer2-pool
spec:
# Eip 物件的地址池
address: 10.31.88.101-10.31.88.200
# openELB的執行模式,預設為bgp
protocol: layer2
# OpenELB 在其上偵聽 ARP/NDP 請求的網路卡。該欄位僅在protocol設定為時有效layer2。
interface: eth0
# 指定是否禁用 Eip 物件
# false表示可以繼續分配
# true表示不再繼續分配
disable: false
status:
# 指定 Eip 物件中的IP地址是否已用完。
occupied: false
# 指定 Eip 物件中有多少個 IP 地址已分配給服務。
# 直接留空,系統會自動生成
usage:
# Eip 物件中的 IP 地址總數。
poolSize: 100
# 指定使用的 IP 地址和使用 IP 地址的服務。服務以Namespace/Service name格式顯示(例如,default/test-svc)。
# 直接留空,系統會自動生成
used:
# Eip 物件中的第一個 IP 地址。
firstIP: 10.31.88.101
# Eip 物件中的最後一個 IP 地址。
lastIP: 10.31.88.20
ready: true
# 指定IP協定棧是否為 IPv4。目前,OpenELB 僅支援 IPv4,其值只能是true.
v4: true
# 設定完成直接部署即可
kubectl apply -f openelb/openelb-eip.yaml
ArgoCD 的部署,也可以通過官方提供的 Helm Chart 直接部署,但為了瞭解更多的底層邏輯,這裡直接使用官方提供的設定清單安裝。
# 建名稱空間
kubectl create namespace argocd
# Non-HA:
kubectl apply -n argocd -f https://raw.githubusercontent.com/argoproj/argo-cd/v2.4.12/manifests/install.yaml
# HA:
kubectl apply -n argocd -f https://raw.githubusercontent.com/argoproj/argo-cd/v2.4.12/manifests/ha/install.yaml
# 安裝應用 ArgoCD 設定清單,生產使用建議使用stable,https://raw.githubusercontent.com/argoproj/argo-cd/stable/manifests/install.yaml
kubectl apply -n argocd -f https://raw.githubusercontent.com/argoproj/argo-cd/master/manifests/install.yaml
# 或者先下載再安裝
wget https://raw.githubusercontent.com/argoproj/argo-cd/v2.4.12/manifests/install.yaml
kubectl apply -n argocd -f install.yaml
通過k9s檢視argocd名稱空間的pods
預設情況下,Argo CD API伺服器不公開外部IP。要存取API伺服器,可以選擇以下技術之一來公開Argo CD API伺服器:
kubectl patch svc argocd-server -n argocd -p '{"spec": {"type": "LoadBalancer"}}'
kubectl port-forward svc/argocd-server -n argocd 8080:443
建立vim argocd-ingress.yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: argocd-server-ingress
namespace: argocd
annotations:
kubernetes.io/tls-acme: "true"
kubernetes.io/ingress.class: nginx
nginx.ingress.kubernetes.io/force-ssl-redirect: "true"
nginx.ingress.kubernetes.io/ssl-passthrough: "true"
nginx.ingress.kubernetes.io/backend-protocol: "HTTPS"
spec:
rules:
- host: argocd.test.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: argocd-server
port:
name: https
tls:
- hosts:
- argocd.test.com
secretName: argocd-secret
# 建立ingress
kubectl apply -f argocd-ingress.yaml
# 檢視伺服器匯出地址
kubectl get ingress -n argocd
如果本地使用可以直接設定hosts檔案 ,設定好後,存取 argocd.test.com 即可進入登入頁。
192.168.5.53 argocd.test.com
注:細心的同學可能已經注意到,雖然 ingress 中設定了 https 協定,但瀏覽器仍然顯示連結非安全。那是因為 argocd-secret
中儲存的證書,是 ArgoCD 生成的自簽證書,瀏覽器不信任。想要獲得安全連線,可以使用瀏覽器信任的域名證書替換即可。
# admin 使用者密碼
kubectl -n argocd get secret argocd-initial-admin-secret -o jsonpath="{.data.password}" | base64 -d
輸入預設存取使用者admin和上述的密碼後進入主頁面
# 下載
wget https://github.com/argoproj/argo-cd/releases/download/v2.4.12/argocd-linux-amd64
cp argocd-linux-amd64 /usr/local/bin/argocd
chmod +x /usr/local/bin/argocd
# 本機上也可以直接通過svc的內部地址直接登入
argocd login 10.43.171.238 --username admin --password c4iy3ZyPGUHdzuaz
# 更新密碼賬號密碼
argocd account update-password
這裡通過官網https://github.com/argoproj/argocd-example-apps.git上提供的guestbook應用程式的範例儲存庫來演示Argo CD,可以使用以下命令建立範例
argocd app create guestbook --repo https://github.com/argoproj/argocd-example-apps.git --path guestbook --dest-server https://kubernetes.default.svc --dest-namespace default
也使用WebUI方式建立,選擇新建APP,應用命名為guestbook,使用專案預設值,保持同步策略為Manual也即是手工
繼續填寫構建專案git來源,通過將庫url設定為github repo url,將https://github.com/argoproj/argocd-example-apps.git repo連線到Argo CD,將revision保留為HEAD,並將路徑設定為kustomize-guestbook;Destination:設定cluster URL為https://kubernetes.default.svc(或設定叢集名稱為in-cluster), namespace為自定義或default,填寫完以上資訊後,點選UI頂部的Create建立留言簿應用程式。
點選建立按鈕後
本篇簡單入門就到此,後續有時間再繼續進一步完成如下內容
**本人部落格網站 **IT小神 www.itxiaoshen.com