ArgoCDでProgressive Deliveryを実装するまで（1） - 導入編

このシリーズでは何回かに分けて`ArgoCD`の基本的な使い方から各種Deliveryについて解説していきます。具体的な記事構成は以下のようになっています。

- ArgoCDでProgressive Deliveryを実装するまで（1） - 導入編
- [ArgoCDでProgressive Deliveryを実装するまで（2） - Blue/Green Deployment編](https://qiita.com/ishii1648/items/1673198a4724e7fbb38e)
- ArgoCDでProgressive Deliveryを実装するまで（3） - Blue/Green Deployment Deep Dive編
- ArgoCDでProgressive Deliveryを実装するまで（4） - Canary Release編
- ArgoCDでProgressive Deliveryを実装するまで（5） - Progressive Delivery編

なお、この記事で紹介する内容は以下のリポジトリに格納されていますので必要に応じてご覧ください。

https://github.com/ishii1648/example-gitops-apps/

## インストール

```bash
$ kubectl create namespace argocd
$ kubectl apply -n argocd -f https://raw.githubusercontent.com/argoproj/argo-cd/stable/manifests/install.yaml
```

## ArgoCD Web UIにアクセス

ここでは最も簡単なポートフォワードを利用します。

```bash
$ kubectl port-forward svc/argocd-server -n argocd 8080:443
```

初期ログイン用のパスワードは以下コマンドで取得できます。
（ユーザ名：admin）

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

![スクリーンショット 2021-04-09 0.41.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206595/6797443f-c30c-7caa-6b38-5952471fdd80.png)


以降は作業をコマンドで行い、作業結果をWeb UIで確認していきます。

## Gitリポジトリからアプリケーションを作成

コマンドラインから`ArgoCD`にログインします。以下のように`WARNING`が出力されますが、気にせず続行すると認証情報を聞かれるので先程Webの画面で入力したのと同じ内容を入力するとログインが完了します。

```bash
$ argocd login localhost:8080
WARNING: server certificate had error: x509: certificate signed by unknown authority. Proceed insecurely (y/n)? y
Username: admin
Password: 
```

次に以下のコマンドでアプリケーションを作成されます。

`ArgoCD`ではデプロイ対象をアプリケーションという単位で設定します。アプリケーションは指定したリポジトリの特定のパスを監視し、変更があると自動で検知してデプロイを実行してくれます。

ここでは`ArgoCD`がサンプルとして提供している`guestbook`をデプロイ対象としてアプリケーションを設定します。

```bash
$ export ARGOCD_OPTS='--port-forward-namespace argocd'
$ argocd app create guestbook --repo https://github.com/argoproj/argocd-example-apps.git --path guestbook --dest-server https://kubernetes.default.svc --dest-namespace default --sync-policy automated
```

![スクリーンショット 2021-04-09 0.33.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206595/77b42889-b8ab-92e3-73a8-fe152d596219.png)

アプリケーションが出来ると、リポジトリに格納されている`k8s`のマニフェストファイルを参照して以下のように自動的に各種リソースをデプロイしてくれます。

![スクリーンショット 2021-04-09 0.37.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206595/6675e9c3-56fa-6523-60eb-2d0d0e65320d.png)

## アプリケーションの宣言的管理

上記では`argocd`コマンドでアプリケーションを作成しましたが、この方法は宣言的ではありません。実際の運用ではアプリケーションをマニフェストファイルとして設定します。

試しに先ほど作成した`guestbook`を宣言的にデプロイしてみます。
※上記で作成した`guestbook`は削除しておいてください（Applicationsの画面から削除できます）

### argocd-config.yml

`guestbook`用のマニフェストファイルを書く前に、アプリケーションを管理するアプリケーションのマニフェストファイルを書きます。

これは`ArgoCD`で[App of Apps](https://argoproj.github.io/argo-cd/operator-manual/cluster-bootstrapping/#app-of-apps-pattern)という名前で紹介されているパターンで、こうすることで複数のアプリケーションをまとめて管理することができるようになります。

```yaml
apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
  name: argocd-config
  namespace: argocd
spec:
  project: default
  source:
    repoURL: https://github.com/ishii1648/example-gitops-apps.git
    targetRevision: main
    path: chapter01/argocd-config
  destination:
    server: https://kubernetes.default.svc
    namespace: argocd
  syncPolicy:
    automated:
      prune: true
      selfHeal: true
```

※自身の環境で試される場合は`repoURL`は自分のリポジトリURLに置き換えてください

### guestbook.yml

```yaml
apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
  name: guestbook
  namespace: argocd
spec:
  project: default
  source:
    repoURL: https://github.com/argoproj/argocd-example-apps.git
    path: guestbook
  destination:
    server: https://kubernetes.default.svc
    namespace: default
  syncPolicy:
    automated:
      prune: true
      selfHeal: true
```

### ディレクトリ構成

ここでは上記2ファイルを以下のようなディレクトリ構成で配置して、Gitリポジトリに push します。

```
├ chapter01/
　├ argocd-config/
    └ argocd-config.yml
    └ guestbook.yml
```

### デプロイ & 動作確認

以下コマンドを実行すると`argocd-config`と`guestbook`のアプリケーションが作成されます。

```bash
$ kubectl apply -f chapter01/argocd-config/argocd-config.yml
```

動作順序としては、まず`argocd-config`が作成され、その後`argocd-config`が監視しているGitリポジトリのパス（chapter01/argocd-config）に`guestbook`のマニフェストファイルが格納されている事を検知して、自動で`guestbook`が作成されます。

![スクリーンショット 2021-04-09 3.24.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206595/4bcfdcaa-a0d3-23a7-ddc3-59e6f7b95654.png)

以上が「ArgoCDでProgressive Deliveryを実装するまで（1） - 導入編」になります。

次回以降は`ArgoCD`のより実践的な使い方や、高度なデプロイ戦略の実装方法などについて解説していこうと思います。