­

Kubernetes集群(RKE)安裝ArgoCD排坑

Photo by Pixabay from Pexels

Argo CD是一個聲明式的,基於Kubernetes的GitOps持續交付工具。更多的細節參考 ArgoCD官網 的說明,這裡記錄了一些實踐過程中的踩坑問題。

1. 安裝ArgoCD

首先準備一個K8S集群,然後從ArgoCD官網上下載資源聲明:

//raw.githubusercontent.com/argoproj/argo-cd/stable/manifests/install.yaml

這裡無關網路是否通暢,而是可能需要更改一點內容,確保ArgoCD部署的時區和你的K8S集群是相同的時區設置,否則可能會導致Argo CD不可用。如果K8S集群是UTC時區可以略過這一步。

例如我這裡的K8S是CST時區,需要在上面下載的yaml文件里改寫Deployment的環境變數,找到 argocd-server 的Deployment,然後在容器模板部分制定時區的環境變數:

env:
    - name: TZ
    value: "Asia/Shanghai"

另外如果等了很長時間也無法成功拉取鏡像可以嘗試從雲上伺服器拉取鏡像然後打包下載到本地,同時將ArgoCD yaml文件中的鏡像拉取策略從Always改成IfNotPresent:imagePullPolicy: Always -> imagePullPolicy: IfNotPresent

啟動完成之後通過Ingress或者NodePort Service暴露ArgoCD Server的埠即可。使用如下命令可以獲得admin 用戶的初始密碼:

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

2.Rancher集群的坑

如果你使用的是Rancher集群的話大概率會遇到這樣的一個坑,按照官方的提示使用argocd客戶端添加集群會提示無法添加:

[landscape@centos-7 ~]$ ls
argocd  argocd.yaml
[landscape@centos-7 ~]$ ./argocd login 192.168.31.136:30080
WARNING: server certificate had error: x509: cannot validate certificate for 192.168.31.136 because it doesn't contain any IP SANs. Proceed insecurely (y/n)? y
Username: admin
Password: 
'admin:login' logged in successfully
Context '192.168.31.136:30080' updated
[landscape@centos-7 ~]$ kubectl config get-contexts -o name
landscape
landscape-centos-7
[landscape@centos-7 ~]$ argocd cluster add landscape
-bash: argocd: 未找到命令
[landscape@centos-7 ~]$ ./argocd cluster add landscape
WARNING: This will create a service account `argocd-manager` on the cluster referenced by context `landscape` with full cluster level admin privileges. Do you want to continue [y/N]? y
INFO[0002] ServiceAccount "argocd-manager" created in namespace "kube-system" 
INFO[0002] ClusterRole "argocd-manager-role" created    
INFO[0002] ClusterRoleBinding "argocd-manager-role-binding" created 
FATA[0003] rpc error: code = Unauthenticated desc = the server has asked for the client to provide credentials 

出現這種情況是因為默認情況下,Rancher提供的kubeconfig文件將Rancher Server 端點指定為集群API Server端點。以此讓Rancher充當身份驗證代理,驗證用戶身份,然後將請求代理到下游集群。

這種方式相對於讓客戶端直接與下游K8S集群API端點通訊,確實在某些方面存在優勢。例如為Rancher管理下的所有集群提供了高可用的Kubernetes API端點,運維團隊無需為每個集群的API伺服器維護故障轉移/負載平衡機制。

這種保護機制也導致Rancher下的K8S集群不能很好的與argocd-cli這樣的客戶端工具交互,因為通過Rancher Server端點需要使用Rancher API令牌而不是K8S服務帳戶令牌,但argocd命令行客戶端不允許用戶指定預先存在的API憑據或自定義的kubeconfig。

不過ArgoCD實際上是與 K8S CRD交互,我們可以利用這一特性繞過argocd命令行來添加Rancher集群,需要做的只是在與argocd相同的命名空間下添加一個Secret而已,以我在虛擬機內的Rancher集群來舉例:

apiVersion: v1
kind: Secret
metadata:
  namespace: argocd
  name: mycluster-argocd-secret
  labels:
    argocd.argoproj.io/secret-type: cluster
type: Opaque
stringData:
  name: mycluster.com
  server: "你的Rancher Server資訊"
  config: |
    {
      "bearerToken": "你的API Key bearerToken",
      "tlsClientConfig": {
        "insecure": false,
        "caData": "你的Rancher集群  certificate-authority-data 資訊"
      }
    }

這裡需要更改的只有三處:

  • server :rancher集群的Kubeconfig中複製
  • caData:rancher集群的Kubeconfig中複製
  • bearerToken:創建API Key時獲得

以下是在 //RancherAddress/apikeys 頁面創建API Key的截圖,創建完成之後就可以複製bearerToken了

把寫好的Secret添加到ArgoCD所處的命名空間後再查看ArgoCD頁面,會發現此時K8S集群已經成功添加:

現在可以開始使用ArgoCD了,嘗試一下部署應用吧

後面還有一些小坑,例如更改密碼和admin用戶的API Token許可權問題,不過看看文檔也就過去了。


參考內容:

//loadbalancing.se/2021/03/22/argocd-behind-istio-on-rancher/

//gist.github.com/janeczku/b16154194f7f03f772645303af8e9f80