Red Hat OpenShift LocalでArgoCDを使ってデプロイを試してみる

# はじめに
今回は、Red Hat OpenShift LocalにArgoCDを導入してデプロイをやってみたいと思います。

# 前提環境
今回使用した手元のRed Hat OpenShift Localの環境はこちらです。

- MacBook Pro (13-inch, 2020)
- MacOS Monterey 12.6
- Red Hat OpenShift Localのバージョン 2.12.0

GitHubなどのGitリポジトリを別途用意してある前提です。

# 準備
OpenShiftでArgoCDを使う場合は、[OpenShift GitOps Operator](https://access.redhat.com/documentation/ja-jp/openshift_container_platform/4.11/html/cicd/getting-started-with-openshift-gitops)を導入するというのが有力案ですが、特定のバージョンのArgoCDを利用したいというケースもあるかと思います。
ということで、今回はArgoCDを導入していきます。

[ArgoCDのオンラインマニュアル](https://argo-cd.readthedocs.io/en/stable/getting_started/)を参照して導入します。
名前空間 argocd を作成して、そこへArgoCDを導入します。

```zsh
$ oc new-project argocd
$ oc apply -n argocd -f https://raw.githubusercontent.com/argoproj/argo-cd/stable/manifests/install.yaml
```

しばらく時間がかかりますが、名前空間argocdのPodが全て起動していることを確認します。

```zsh
$ oc get pods -n argocd
```

Argocd のコンソールへログインできるようにサービス argocd-server に対して route を作成します。
以下のyamlファイルを用意して apply します。

```yaml route-argocd-route.yaml
kind: Route
apiVersion: route.openshift.io/v1
metadata:
  name: argocd-route
  namespace: argocd
spec:
  to:
    kind: Service
    name: argocd-server
    weight: 100
  port:
    targetPort: https
  tls:
    termination: passthrough
    insecureEdgeTerminationPolicy: None
  wildcardPolicy: None
```

```zsh
$ oc apply -f route-argocd-route.yaml -n argocd
```

これで、Argocd のコンソールを表示できるようになります。![argocd-console-app.png]
![argocd-console.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/342308/fc6c1e66-ed88-df84-6aba-c5f2fa7b4df2.png)

adminのパスワードは、argocdプロジェクトのシークレット argocd-initial-admin-secret で参照できます。
無事にログインできると次の画面になります。
![ArgocdコンソールApplication](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/342308/ad2c942a-8c9a-7c38-4dd8-800a67bd1aff.png)

次にクライアントツールも用意します。

```zsh
$ brew install argocd
```

クライアントツールでもログインできることを確かめておきます。

```zsh
$ argocd login --insecure argocd-route-argocd.apps-crc.testing
```

## アプリケーションとカスタムリソース定義

アプリケーションは、hello-openshiftを使います。
マニフェストとして以下のYAMLファイルを用意しました。

```yaml deployment.yml
kind: Deployment
apiVersion: apps/v1
metadata:
  name: hello
  labels:
    app: hello
spec:
  replicas: 1
  selector:
    matchLabels:
      app: hello
  template:
    metadata:
      labels:
        app: hello
        deployment: hello
    spec:
      containers:
        - name: hello
          image: "openshift/hello-openshift:latest"
```

```yaml service.yml
kind: Service
apiVersion: v1
metadata:
  name: hello
  labels:
    app: hello
spec:
  ports:
    - name: 8080-tcp
      protocol: TCP
      port: 8080
      targetPort: 8080
  selector:
    app: hello
    deployment: hello
```

```yaml route.yml
kind: Route
apiVersion: route.openshift.io/v1
metadata:
  name: hello
  labels:
    app: hello
spec:
  to:
    kind: Service
    name: hello
    weight: 100
  port:
    targetPort: 8080-tcp
  wildcardPolicy: None
```

マニュフェストを置いたリポジトリは以下のようにしました。

```
├── Dockerfile
├── README.md
├── manifest
│   └── dev-1
│       ├── deployment.yml
│       ├── route.yml
│       └── service.yml
├── requirements.txt
└── src
    └── main.py
```

次に ArgoCD で必要なリソース定義は以下の通りです。

- AppProject: リポジトリとクラスタへのアクセス制限
- Repository: マニフェストのリポジトリへのパスと接続情報を保持
- Application: AppProjectの下でデプロイするプロジェクト毎に作成する。repoのマニフェストのパスとプロジェクトを紐付けする

いずれも ArgoCD のコンソール画面やYAMLファイルをapplyすることで設定できます。

# ArgoCDのリソース定義

まずAppProjectを設定します。

ArgoCDのコンソール画面から、Settings -> Projectsを選択します。
そして、+ NEW PROJECTボタンを押します。

![create-appproject.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/342308/70d2b931-00c0-7f03-6d3e-dcfe51d9401a.png)

プロジェクト名（今回はproject-hello）を入力して、作成ボタンを押します。

作成されたプロジェクトのSOURCE REPOSITORIESを編集して、ソースコードのリポジトリのパスを入力します。次に、DESTINATIONSを編集して、クラスタを指定します。
![create-appproject-detail.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/342308/cd5c9151-41b0-718f-bacd-aaa14acb94a0.png)

次にRepositoryを設定します。

ArgoCDのコンソール画面から、Settings -> Repositoriesを選択します。
そして、+ CONNECT REPOボタンを押します。

先ほどのProjectを選択して、RepositoryのURL、sshキーを設定して CONNECT ボタンを押します。
![create-repository.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/342308/955f73b5-d915-dc79-f499-360a369a0b94.png)

Successfulのステータスが表示されたら成功です。

最後にApplicationを設定します。

ArgoCDのコンソール画面から、Applications を選択します。
そして、+ NEW APPボタンを押します。

Application Nameを入力して、Projectは上で作成したProjectを入力します。
![application-general.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/342308/67bbc31a-33f0-c0dc-902f-f6f6916c7ed4.png)

画面をスクロールして、SOURCEの欄にリポジトリとマニフェストが入ったパスを指定します。
![application-source.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/342308/ba4a39d0-a1b4-9029-0afa-1eb3d293e199.png)

画面をスクロールして、DESTINATION欄にCluster URLとNamespace名を入力します。
![application-destination.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/342308/516613a8-c5df-ba9e-c3e3-36931364824d.png)

一番上の CREATE ボタンを押します。
するとアプリケーションが作成されます。
初めはmissingのステータスですが、SYNCボタンを押すと同期が取られて、デプロイが実行されます。:smile:
<img width="300" alt="status-sync.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/342308/4ed24f60-e46f-5bda-b208-116f52a888af.png">

以上