OpenShiftにArgoCDオペレーターを導入してみる

まず、[Red HatはOpenShift上でのArgoCDをサポートしていないので](https://access.redhat.com/documentation/ja-jp/openshift_container_platform/4.6/html/architecture/argocd-support)、使いたいと思ったら使いたいと言い出したあなたがArgoCDに関する全責任を負う必要があるが、自宅のOpenShiftクラスターにArgoCDを導入してみた。場合によっては便利。

# ArgoCDオペレーターを導入する
（参考）https://argocd-operator.readthedocs.io/en/latest/

１．OpenShiftクラスターに「argocd」プロジェクト（ネームスペース）を作る。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/146381/a495a440-8bf1-c67c-98af-289309713130.png)

２．OperatorHubからArgoCDオペレーターをインストールする。
インストール先のネームスペースは「argocd」で。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/146381/ca33f55c-9f09-97e2-4239-a8f18867633b.png)

３．ArgoCDのインスタンスを作る。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/146381/d07d1961-e015-c968-af60-572b22b98d16.png)
名前がexample～なのも何なのでそこだけ「argocd」に、それ以外は全部デフォで。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/146381/5c46ce70-b43e-496e-23a3-10c29d556cc3.png)

４．ArgoCDにアクセスするrouteを作る。
>
Name:    argocd
Hostname:    argocd.apps.ocp.example.com
Path:    /
Service:    argocd-server
Target Port:    443 -> 8080 (TCP)
Security:    ☑Secure route
TLS Termination:    Passthrough
Insecure Traffic:    None

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/146381/1962cf63-f2fb-e942-bddc-d9e29127e458.png)

５．argocdがアプリをデプロイするSAにクラスター管理者権限を付けておく。

```
# oc adm policy add-cluster-role-to-user cluster-admin -z argocd-application-controller -n argocd
```

６．初期パスワードを入手する。
batsionサーバー等、ocコマンド実行可能なLinuxサーバーで以下を実行する。

```
# kubectl -n argocd get secret argocd-cluster -o jsonpath='{.data.admin\.password}' | base64 -d
```

７．ArgoCDにログインする。
Webブラウザで、作成したrouteのURLにアクセスする。
ユーザー名は「admin」。
https://argocd.apps.ocp.example.com
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/146381/0e02287a-8ae3-0c4b-935f-d12a0b7d6ff8.png)

# Gitレポジトリを用意する
ArgoCDは、Gitレポジトリに置いてあるKubernetesマニフェストと、自身がインストールされたクラスターのとあるネームスペースの状態を一致させるためのツールである故、Gitレポジトリが必要である。
まあ、適当なLinuxサーバーにSSHでアクセスさせるでも良い。ここではbastionサーバーで。

```
# yum install -y git
# git config --global user.name "root@example.com"
# git config --global user.email "root@example.com"
# mkdir -p /hello-argocd/kubernetes
# cd /hello-argocd
# git init
# cat > kubernetes/pod.yaml << EOF
apiVersion: v1
kind: Pod
metadata:
  name: httpd
spec:
  containers:
    - name: httpd
      image: httpd
      ports:
      - containerPort: 80
EOF
# git add kubernetes/pod.yaml && git commit -m "initial"
# cd ~
# useradd git-ro
# sudo -u git-ro ssh-keygen
# cp ~git-ro/.ssh/id_rsa.pub ~git-ro/.ssh/authorized_keys
# chown git-ro ~git-ro/.ssh/authorized_keys
# chmod 600 ~git-ro/.ssh/authorized_keys
```

git-roユーザーのSSH秘密鍵は後でGitレポジトリの登録に使うので取っておく。

```
# cat ~git-ro/.ssh/id_rsa
```

# ArgoCDにレポジトリを登録する
１．ArgoCDの画面で、左の歯車＞「Repositories」をクリック。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/146381/6ff89954-eb74-1532-0549-b9e07b501fe1.png)

２．「CONNECT REPO USING SSH」をクリック。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/146381/f4ceef8f-ef22-d479-b712-879364499c34.png)

３．先に作ったGitレポジトリを登録する。以下を入力して「CONNECT」をクリック。
>
Name:    hello-argocd
Repository URL:    git-ro@192.168.1.1:/hello-argocd
SSH private key data:    （先に入手したSSH秘密鍵）
☑Skip server verification

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/146381/bf3de017-2388-9fdb-01ed-42643f0c66c7.png)

# アプリケーションを動かす
１．ArgoCDの画面で、左の菱餅＞「NEW APP」をクリック。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/146381/b7c23370-a38c-bf94-2fba-4f8ba0afec3d.png)

２．アプリケーションを登録する。以下を入力し「CREATE」。
>
GENERAL
> >
Application Name:    hello-argocd
Project:    default
>
SOURCE
>>
Repository URL:    git-ro@192.168.1.1:/hello-argocd
Revision:    master
Path:    kubernetes
>
DESTINATION
>>
Cluster URL:    https://kubernetes.default.svc
Namespace:    default

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/146381/40af9ba7-bc1f-8c62-48ca-934bddb7f449.png)

３．「SYNC」をクリックし、デプロイするリソース、ここでは「/POD/DEFAULT/HTTPD」にチェックを付けて「SYNCHRONIZE」をクリックする。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/146381/ed4c96c9-020a-4a1f-b2bc-c43828ff95d6.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/146381/1f59fbf3-35d2-b7d0-edf0-c409964cc458.png)

４．「♡Healthy ☑Synced」になったことを確認する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/146381/41cd4e9a-cee1-6d0f-26e8-c907c7f07df2.png)

パネルをクリックすると、「hello-argocd」アプリが「httpd」ポッドで構成されている様子が見て取れる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/146381/e2f2a700-f32f-06cd-ab33-2da361bf2c5a.png)

５．OpenShiftのUIでdefaultプロジェクトを開いても、httpdポッドが稼働しているのが確認できる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/146381/fda3c139-2e3e-8c10-1376-fe1eec706725.png)

# Gitレポを更新する

１．bastionサーバーでpod.yamlを更新する。

```
# cd /hello-argocd/kubernetes
# sed -i 's/image: httpd/image: nginx/' pod.yaml
# git add pod.yaml && git commit -m "nginx"
# cd ~
```

２．ArgoCDの画面で「REFRESH」をクリックするとPodがOutOfSyncになる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/146381/45547507-98ae-feae-7001-8a44d651b7d3.png)

３．もう一回「SYNC」＞「SYNCHRONIZE」と実行すると同期状態が回復する。
名前はhttpdと言いつつ、nginxが動作しているはずである。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/146381/93419895-8f03-863f-c319-a23934fa697e.png)

動かしているリソース（ここではポッド）のYamlマニフェストファイルがGitレポジトリ上で更新されるとArgoCDでOutOfSyncとなるので、もう一度同期して新しいマニフェストをデプロイできる。ArgoCDのここが良いところ。GitOpsである。

逆に、yamlファイルが、コンテナイメージのタグ名だけでも変更がないとOutOfSyncにならないので、イメージストリームで常に:latestとかいうOpenShiftならではな使い方には向いていない。かも。

アプリのビルド時にDeployment.yamlのイメージタグ名が更新されて、gitレポジトリにpushで戻される必要もあるのか？Jenkinsに書き込み可能なgitのアカウント渡したくないなというのはある、かも。。

# ArgoCD、どのくらいリソース食うのか
OpenShiftの「Monitoring」＞「Dashboards」から「Kubernetes / Compute Resources / Namespace (Pods)」、「argocd」の画面を見る限り、メモリを2～300MB消費するくらいか。案外少ない。プロジェクトごとにargocdインスタンスを一つデプロイする様な運用だと多いかな？
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/146381/2a520970-198a-35f9-00f7-3b9f42e9a133.png)


# ArgoCD CLIを導入したければ
最近は新しいCLIを導入するのがほんと億劫だ。。という気分を乗り越えられる方は、bastionサーバー等、ocコマンドを導入したLinuxサーバーにArgoCD CLIを導入することも出来るだろう。使わなくて済むならそれが吉。あなたが責任を持つメンテ対象も増える事だしね？
https://github.com/argoproj/argo-cd/releases/tag/v1.8.2

```
# curl -O -L https://github.com/argoproj/argo-cd/releases/download/v1.8.2/argocd-linux-amd64
# chmod 755 argocd-linux-amd64
# mv argocd-linux-amd64 /usr/local/bin/argocd
```