昨天透過kustomize的方式做了base的yaml和規劃了怎麼應用,那麼今天就來利用這些yaml佈署服務吧。
kustomize在使用上其實可以直接用kubectl -k 的方式去create目錄下的resources,不過這樣就像昨天所說要靠人為去執行,那麼要如何自動化呢?傳統的方式會選擇在cd中加入pipeline自動執行,但是這樣間接遭遇了幾個問題,要如何取得佈署的權限、如果cluster有多座應該怎麼同時,為了一次性的解決這些問題,我使用了argocd 進行gitops的佈屬流程,讓具有deploy權限的帳號放在k8s內,同時讓每座cluster的argo監看同一座git,這樣就可以推送git的同時異動所有cluster了。
那麼什麼是argocd呢? 先用一張官網的架構圖來檢視,那隻可愛的外星章魚就是argo
官方給的圖,我個人認為其實看起來是滿複雜的,不過對於argo來說其實沒有那麼困難,他的元件主要分成四個 dex、repo-server、application-controller、redis,其中dex負責操作帳號的管理(本次不介紹),repo-server負責argo會監看哪些git repo進行佈署,application-controller會負責真實進行服務create,redis則是提供緩存的功能,並且元件都用pod的方式運行,相關的設定也都會透過crd的方式佈署,所以流程上會比較貼近簡單一點的圖如下
瞭解他的運作後,就開始配置argocd吧,argo的配置其實很簡單,因為他都是yaml,所以要應用他甚至可以全部靠yaml去更新,第一步的安裝就是熟悉的create
kubectl create namespace argocd
kubectl apply -n argocd -f https://raw.githubusercontent.com/argoproj/argo-cd/stable/manifests/install.yaml
如果想要統一版本,其實也可以把image和yaml拉下來改,並且為了維運的方便,也順便抓取argocd的cli下來使用(https://github.com/argoproj/argo-cd/releases/download/v2.1.0-rc2/argocd-linux-amd64)。
安裝好argo後可以用istio ingress的方法把argo-server的service expose出來使用,介面的使用方法其實還滿簡單的,所以我就介紹如何不透過介面的方式設定好argocd,最簡易的配置會需要設定的有兩個
第一個git repo的配置
透過secret拿到密碼
kubectl -n argocd get secret argocd-initial-admin-secret -o jsonpath="{.data.password}" | base64 -d
argocd --insecure --grpc-web login URL:443 --username admin --password
argocd repo add git_repo_url --username user --password password
第二個listen git的application crd其實是在告訴argocd,我希望他抓取這個git目錄下的檔案,定期去幫我確認有沒有crd要新增,然後再透過更新的crd去確認這個crd所監看的repo有沒有異動,看起來很饒口,其實說簡單了就是用application去管理argocd application有沒有新的或是異動,如圖。
管理application的crd yaml簡易的寫法如下
apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
name: application-monitor
namespace: argocd
spec:
destination:
namespace: argocd
server: 'https://kubernetes.default.svc'
project: default
source:
path: argo-application/
repoURL: >-
git-repo-url
targetRevision: HEAD
syncPolicy:
automated: {}
這樣之後只要git推送application到git-repo的argo-application/目錄下,就會自動把application crd佈署完成,並且再根據這個佈署好的application配置服務,行成完全自動化的佈署。
推給monitor的application大概長這樣
apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
name: test-hello-world
namespace: argocd
spec:
destination:
namespace: test
server: 'https://kubernetes.default.svc'
project: default
source:
path: k8s-cluster/test/hello-word
repoURL: >-
git-repo-url
targetRevision: HEAD
syncPolicy:
automated: {}
那麼服務就會自動被註冊為新的application : test-hello-world ,然後將k8s-cluster/test/hello-word內定義的yam佈署到test這個namespace 下。
我這次是佈署在test的ns下(昨天是default),並且重新給一個url。