ArgoCDをOpenShift環境にデプロイする

# はじめに
調査のための検証のメモです。（あくまで、簡易検証の作業のメモです。本番環境などではご自身で適切な手順を調査/検証してください。）

## 環境
- Red Hat OpenShift on IBM Cloud
  - 4.7.16_1523
- ArgoCD
  - v2.0.4+0842d44 
- 端末はWindows10
  - ocコマンド導入済み  

## 参考にした情報
- https://access.redhat.com/documentation/ja-jp/openshift_container_platform/4.7/html/cli_tools/openshift-cli-oc
- [How To Install ArgoCD on OpenShift Cluster](https://computingforgeeks.com/how-to-install-argocd-on-openshift-cluster/)　★主にこちら...
- [Argo CD - Declarative GitOps CD for Kubernete](https://argo-cd.readthedocs.io/en/stable/) 
- [Argo CD Operator - OpenShift Install](https://argocd-operator.readthedocs.io/en/latest/install/openshift/)　
- [第7章 OpenShift Container Platform での ArgoCD の使用](https://access.redhat.com/documentation/ja-jp/openshift_container_platform/4.3/html/architecture/argocd) ※4.3
- [OpenShift 4 (CodeReady Containers)でのArgo CDの導入・利用](https://qiita.com/hisato_imanishi/items/28849ad0e47c53df3774)

# 作業メモ

## プロジェクト（namespace）の作成
※`oc login`済みである前提です。

1. `oc new-project argocd`を実施

```
PS C:\mywork> oc new-project argocd
Now using project "argocd" on server "https://XXXX.jp-tok.containers.cloud.ibm.com:31105".

You can add applications to this project with the 'new-app' command. For example, try:

    oc new-app rails-postgresql-example

to build a new example application in Ruby. Or use kubectl to deploy a simple Kubernetes application:

    kubectl create deployment hello-node --image=k8s.gcr.io/serve_hostname

PS C:\mywork>
```

## ArgoCDのマニフェストをApply

### 1. 作業用ディレクトリの作成

```
PS C:\mywork> mkdir argocd


    ディレクトリ: C:\mywork


Mode                 LastWriteTime         Length Name
----                 -------------         ------ ----
d-----        2021/07/09     10:42                argocd


PS C:\mywork> cd .\argocd\
PS C:\mywork\argocd>
```

### 2. install.yamlの入手

```
PS C:\mywork\argocd> Invoke-WebRequest -Uri https://raw.githubusercontent.com/argoproj/argo-cd/stable/manifests/install.yaml -OutFile install.yaml
PS C:\mywork\argocd> dir


    ディレクトリ: C:\mywork\argocd


Mode                 LastWriteTime         Length Name
----                 -------------         ------ ----
-a----        2021/07/09     10:44         136926 install.yaml


PS C:\mywork\argocd>
```

### 3. install.yamlのapply

```
PS C:\mywork\argocd> oc apply -n argocd -f ./install.yaml
customresourcedefinition.apiextensions.k8s.io/applications.argoproj.io created
customresourcedefinition.apiextensions.k8s.io/appprojects.argoproj.io created
serviceaccount/argocd-application-controller created
serviceaccount/argocd-dex-server created
serviceaccount/argocd-redis created
serviceaccount/argocd-server created
role.rbac.authorization.k8s.io/argocd-application-controller created
role.rbac.authorization.k8s.io/argocd-dex-server created
role.rbac.authorization.k8s.io/argocd-redis created
role.rbac.authorization.k8s.io/argocd-server created
clusterrole.rbac.authorization.k8s.io/argocd-application-controller created
clusterrole.rbac.authorization.k8s.io/argocd-server created
rolebinding.rbac.authorization.k8s.io/argocd-application-controller created
rolebinding.rbac.authorization.k8s.io/argocd-dex-server created
rolebinding.rbac.authorization.k8s.io/argocd-redis created
rolebinding.rbac.authorization.k8s.io/argocd-server created
clusterrolebinding.rbac.authorization.k8s.io/argocd-application-controller created
clusterrolebinding.rbac.authorization.k8s.io/argocd-server created
configmap/argocd-cm created
configmap/argocd-gpg-keys-cm created
configmap/argocd-rbac-cm created
configmap/argocd-ssh-known-hosts-cm created
configmap/argocd-tls-certs-cm created
secret/argocd-secret created
service/argocd-dex-server created
service/argocd-metrics created
service/argocd-redis created
service/argocd-repo-server created
service/argocd-server created
service/argocd-server-metrics created
deployment.apps/argocd-dex-server created
deployment.apps/argocd-redis created
deployment.apps/argocd-repo-server created
deployment.apps/argocd-server created
statefulset.apps/argocd-application-controller created
networkpolicy.networking.k8s.io/argocd-application-controller-network-policy created
networkpolicy.networking.k8s.io/argocd-dex-server-network-policy created
networkpolicy.networking.k8s.io/argocd-redis-network-policy created
networkpolicy.networking.k8s.io/argocd-repo-server-network-policy created
networkpolicy.networking.k8s.io/argocd-server-network-policy created
PS C:\mywork\argocd>
```
### 4. podの状態確認

- `oc get pods`コマンドを使い、argocdのnamespaceに存在しているpodの状態を確認します（エラーが出ているPodが無いか）

```
PS C:\mywork\argocd> oc project
Using project "argocd" on server "https://XXXXXX.jp-tok.containers.cloud.ibm.com:31105".
PS C:\mywork\argocd> 
PS C:\mywork\argocd> oc get pods
NAME                                  READY   STATUS    RESTARTS   AGE
argocd-application-controller-0       1/1     Running   0          2m42s
argocd-dex-server-76ff776f97-8pfmc    1/1     Running   0          2m42s
argocd-redis-747b678f89-ltjk9         1/1     Running   0          2m42s
argocd-repo-server-6fc4456c89-wvb2j   1/1     Running   0          2m42s
argocd-server-7d57bc994b-xs8hm        1/1     Running   0          2m42s
PS C:\mywork\argocd>
PS C:\mywork\argocd> oc get pods -n argocd
NAME                                  READY   STATUS    RESTARTS   AGE
argocd-application-controller-0       1/1     Running   0          2m38s
argocd-dex-server-76ff776f97-8pfmc    1/1     Running   0          2m38s
argocd-redis-747b678f89-ltjk9         1/1     Running   0          2m38s
argocd-repo-server-6fc4456c89-wvb2j   1/1     Running   0          2m38s
argocd-server-7d57bc994b-xs8hm        1/1     Running   0          2m38s
PS C:\mywork\argocd> 
```
- 後続作業の前提として、以下の2つのPodの状態は要チェックします

```
PS C:\mywork\argocd> oc -n argocd get pod -l "app.kubernetes.io/name=argocd-server"                                     NAME                             READY   STATUS    RESTARTS   AGE
argocd-server-7d57bc994b-xs8hm   1/1     Running   0          6m22s
PS C:\mywork\argocd> oc -n argocd get pod -l "app.kubernetes.io/name=argocd-dex-server"
NAME                                 READY   STATUS    RESTARTS   AGE
argocd-dex-server-76ff776f97-8pfmc   1/1     Running   0          6m43s
PS C:\mywork\argocd>
```

## ArgoCDサーバーのパスワード取得

- FAQより
    - https://argoproj.github.io/argo-cd/faq/#i-forgot-the-admin-password-how-do-i-reset-it
    - `For Argo CD v1.9 and later, the initial password is available from a secret named argocd-initial-admin-secret`

- SeacretをWeb Consoleから確認
  - [argocd]プロジェクト内のsecretを参照 

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/270508/de27d292-bfd2-6c88-6ea2-b29949206cdb.png)

  - [argocd-initial-admin-secret]を選択し、詳細画面を開く
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/270508/61650c11-d2bf-2cb8-634a-baf808298c7e.png)
  - 画面をスクロール（ここで[Reveal values]リンクをクリックすると表示される）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/270508/132cf376-0731-5885-667a-6f65458905df.png)




## ArgoCDサーバーのExposeおよびRouteの作成

### 1. patchの適用

- 詳細は調べていないのですが（恥）、、検証した人のブログ等を参考に対応しました（`--insecure`の設定を追加したりしていました。）

```
PS C:\mywork\argocd> oc -n argocd patch deployment argocd-server --patch-file argocd-server-deployment.yaml
deployment.apps/argocd-server patched
PS C:\mywork\argocd>
```
### 2. Route作成

```
PS C:\mywork\argocd> oc -n argocd create route edge argocd-server --service=argocd-server --port=http --insecure-policy=Redirect
route.route.openshift.io/argocd-server created
PS C:\mywork\argocd>
PS C:\mywork\argocd> oc get route -n argocd
NAME            HOST/PORT                                                                                                              PATH   SERVICES        PORT   TERMINATION     WILDCARD
argocd-server   argocd-server-argocd.mycluster-jp-tok-123456-0XXXXXXXXXXXXXXXXXXX0-0000.jp-tok.containers.appdomain.cloud          argocd-server   http   edge/Redirect   None
PS C:\mywork\argocd>
```

### 3. ブラウザーからアクセス

- get routeコマンドで確認した`HOST/PORT`の値をブラウザーのアドレスバーに入力し、アクセスします
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/270508/88aa3786-2404-efd2-a51f-bfd9bf06e88e.png)


## Adminパスワードのリセット

### 1. 初回のログイン
-  [Username]には「admin」、[Password]にはsecretから確認した値を指定し[SIGIN IN]をクリックします
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/270508/94a093cf-7f85-4325-c01f-100c23df9f5e.png)
- ログインできることを確認します
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/270508/c0734a4f-7a1e-fc22-30f0-dd6ca8a37996.png)

### 2. パスワードの変更
- FAQより、ガイドを抜粋します
    - To change the password, edit the argocd-secret secret and update the admin.password field with a new bcrypt hash. 
- Web Console上で[argocd-secret]の詳細画面を開きます
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/270508/3defdc8f-fdd2-4945-e1e9-07908cbd7097.png)
- [Action]⇒[Edit Secret]メニューをクリックします
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/270508/537c9e10-f5d8-61c6-5229-d3013b28aea8.png)
- [admin.password]を編集します
    - FAQを参考に暗号化します（`You can use a site like https://www.browserling.com/tools/bcrypt to generate a new hash`）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/270508/b828ef6a-204f-af84-6818-9ac88a35e6e2.png)
- 編集後は忘れず[Save]します

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/270508/8fb2fd4f-559f-53e2-f220-58eec46fb548.png)

- 新しいパスワードでログインできることも確認してください

## ArgoCD CLIのダウンロード

- 以下から最新のモジュールをダウンロードしてインストールします
  - https://github.com/argoproj/argo-cd/releases/
- 今回は以下を利用しました
  - https://github.com/argoproj/argo-cd/releases/download/v2.0.4/argocd-windows-amd64.exe

# 感想

特に躓かずに作業できましたが、以下には手を出せていません。

 - [OpenShift Authentication Integration with ArgoCD](https://www.openshift.com/blog/openshift-authentication-integration-with-argocd)

以上。