前言
ArgoCD是一個基于Kubernetes的GitOps持續交付工具,應用的部署和更新都可以在Git倉庫上同步實現,并自帶一個可視化界面。本文介紹如何使用Git+Helm+Argocd方式來實現在k8s中部署和更新應用服務;
安裝Argocd
- 準備一個k8s集群,然后從官網獲取yaml部署清單執行部署即可;
# 創建命名空間
kubectl create namespace argocd # 部署argocd
wget https://raw.githubusercontent.com/argoproj/argo-cd/stable/manifests/install.yaml
kubectl apply -n argocd -f install.yaml# 查看狀態
kubectl get pod -n argocd -w# 調整下svc為nodeport默認,訪問ui頁面用的
kubectl -n argocd edit svc argocd-server
- 訪問頁面,輸入地址后會自動跳轉https;
# 獲取ui頁面的登陸密碼,管理員為 admin
kubectl -n argocd get secret argocd-initial-admin-secret -o jsonpath="{.data.password}" | base64 -d
默認管理密碼是隨機的,可以使用如下方式修改;
# 在線獲取bcrpyt加密后的密碼值: https://www.bejson.com/encrypt/bcrpyt_encode/
準備一個密碼,自行到上面的地址加密即可# 將加密后的密文替換為下面的 admin.password 的值
kubectl -n argocd patch secret argocd-secret \-p '{"stringData": {"admin.password": "$2a$10$dVCUtDIFah893qSLMMIReeyNa8vHx1112/kLYTbglAQMpbzBR5dbK","admin.passwordMtime": "'$(date +%FT%T%Z)'"
}}'
驗證1:(官方給出的樣例)
Argo CD 提供了一個官網樣例,我們就創建一下這個項目吧
樣例github地址: https://github.com/argoproj/argocd-example-apps
web頁面創建APP
- Application Name: app的名稱,填寫的是樣例項目的名稱
- Project: 是一種資源,用于組織和管理不同的 Kubernetes 應用(Application,目前先寫default
- SYNC POLICY: 同步策略,有手動和自動,樣例項目,我們先選擇手動
- AUTO-CREATE NAMESPACE: 自動創建應用部署的k8s的命名空間
- SOURCE: Git 倉庫,就是樣例項目的github倉庫地址
- Revision: 分支名
- Path: 資源文件所在的相對路徑,Argo CD目前支持多種 Kubernetes 清單,這里需要選擇使用那種資源配置模式就選擇哪一個路徑下的資源清單
- Cluster URL: Kubernetes API Server 的訪問地址,由于 Argo CD 和下發應用的 Kubernetes 集群是同 一個,因此可以直接使用 http://kubernetes.default.svc 來訪問
- Namespace: 應用部署在k8s中的命名空間
- 點擊頁面上面的create按鈕
- 手動同步
- web頁面展示
驗證2:(自己手戳)
argocd支持多種配置管理/模板工具,如 Kustomize,Helm,Ksonnet,Jsonnet,plain-YAML,這里我使用的是helm來做,先簡單制作一個helm chart 來定義應用的部署清單;
# 準備一個主目錄存放資源文件
mkdir gitops && cd gitops/ && git init
mkdir -p {helm,argocd} && cd helm/# 添加一個helm chart
# tree -L 2
└── app1├── Chart.yaml├── templates│ ├── deployment.yaml│ └── service.yaml└── values.yaml
Chart.yaml
apiVersion: v2
appVersion: "1.0"
name: app1
description: app1 for kubernetes
type: application
version: 0.1.0
values.yaml
global:replicas: 2
image:repository: harbor.example.cn/public/nginx#repository: nginxtag: stable-alpine
deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:name: appnamespace: {{ .Release.Namespace }}
spec:replicas: {{ .Values.global.replicas }}selector:matchLabels:demo: app1template:metadata:labels:demo: app1spec:containers:- name: nginx# 這里引入變量,層級調用,.Values表聲明作用image: {{ .Values.image.repository }}:{{ .Values.image.tag }}ports:- containerPort: 80name: http
service.yaml
apiVersion: v1
kind: Service
metadata:name: app1-svcnamespace: {{ .Release.Namespace }}labels:demo: app1
spec:type: ClusterIPselector:demo: app1ports:- port: 80name: httptargetPort: httpprotocol: TCP
定義argocd清單
- argocd有自己的聲明式寫法,這里定義一個用來調用和管理應用部署的資源清單;
# 進入argocd的存放目錄,在下面創建4個目錄來區分不同的集群環境
cd gitops/argocd && mkdir {dev,test,pre,prod}# 定義清單文件
cd argocd /
tree -L 2
.
├── dev
│ └── Application.yaml
├── pre
│ └── Application.yaml
├── prod
│ └── Application.yaml
└── test└── Application.yaml
Application.yaml
apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:name: demo-argocdnamespace: argocd
spec:project: default # 所屬項目,默認即可source:repoURL: https://git.example.com/gitops/gitops1.git # helm所在的git倉庫地址(后面需要推送的git倉庫)# git倉庫的分支版本targetRevision: HEAD# helm文件在git倉庫的相對路徑path: helm/app1# 這里定義傳遞給helm執行的參數# 類型values.yamlhelm:parameters:- name: image.repositoryvalue: harbor.example.cn/public/nginx- name: image.tagvalue: stable-alpine- name: global.replicasvalue: "2"destination:# 部署到當前k8s集群的地址server: https://kubernetes.default.svc# 部署目標命名空間namespace: demosyncPolicy:automated: prune: trueselfHeal: trueallowEmpty: falsesyncOptions:- Validate=false- CreateNamespace=true- PrunePropagationPolicy=foreground- PruneLast=trueretry:limit: 5backoff:factor: 2maxDuration: 1m
- 推送Git倉庫
準備好資源文件后,需要創建一個git倉庫來存放,將寫好的資源文件推送到git倉庫上;
# 整體目錄文件如下
gitops # tree -L 3
.
├── argocd
│ ├── dev
│ │ └── Application.yaml
│ ├── pre
│ │ └── Application.yaml
│ ├── prod
│ │ └── Application.yaml
│ └── test
│ └── Application.yaml
└── helm└── app1├── Chart.yaml├── templates└── values.yaml# 推送git倉庫
git init
git add ..
git ...
集成argocd
- 登陸argocd頁面,添加一個git倉庫地址,這里的大概流程是通過同步git上的argocd資源清單來引用helm的部署文件來實現部署和更新;
- 填寫倉庫地址信息;
- 接著創建一個應用,定義git倉庫配置;
?
?
?
- 此時資源是沒有開啟自動同步的,需要先手動同步一下;
?
- 查看應用的部署狀態和Git同步狀態;
- 成功部署后,將 demo-production 調整為自動同步;
版本更新
應用已經通過argocd部署到集群中,此時在argocd中存在有兩個應用;
- demo-production :與dev/Application.yaml 文件同步,用來更新應用的版本和配置的;
- demo-argocd :定義服務的部署,讀取的是git倉庫下的helm資源清單;
當我們需要更新demo這個服務的版本時,修改 dev/Application.yaml 這個文件的參數,重新提交到git倉庫即可;
# vim argocd/dev/Application.yaml
---
apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:name: demo-argocdnamespace: argocd
spec:project: defaultsource:repoURL: https://git.example.com/gitops/gitops1.gittargetRevision: HEADpath: helm/app1helm:parameters:- name: image.repositoryvalue: harbor.example.cn/public/nginx- name: image.tagvalue: v1.0.0 # 修改鏡像的版本- name: global.replicasvalue: "1" # 修改下副本數destination:server: https://kubernetes.default.svcnamespace: demosyncPolicy:automated: prune: trueselfHeal: trueallowEmpty: falsesyncOptions:- Validate=false- CreateNamespace=true- PrunePropagationPolicy=foreground- PruneLast=trueretry:limit: 5backoff:factor: 2maxDuration: 1m
等待一會后,argocd會自動檢測git上的文件版本,然后將最新修改的配置參數同步到k8s集群中;