はじめてEKS/ArgoCDを触る人に向けた手順書

## はじめに
改善項目がありましたら基本的には直接プルリクエスト、又はマージリクエストを頂けたらと思います.

今回主に利用する[kahirokunn/k8s-templates リポジトリ](https://github.com/kahirokunn/k8s-templates)には[kind](https://kind.sigs.k8s.io/docs/user/quick-start/)又は[Amazon Elastic Kubernetes Service (EKS)](https://aws.amazon.com/jp/eks)を立ち上げ、その上に様々なアプリケーションを展開する方法を記録しています.
今回はこちらを利用して、EKS環境の構築方法と、その上にArgoCDを立ち上げる方法を紹介します

## 環境構築

### 1. git clone

```sh
$ git clone https://github.com/kahirokunn/k8s-templates.git
$ cd k8s-templates
```

### 2. 今回利用するAWSの名前付きprofileを設定する

設定方法がわからない方は[AWS CLI の profile を追加する](https://qiita.com/noid11/items/bdc2dc15213da43a10a7)を参照して、今回利用する為の名前付きプロファイルを1つ作成してください.

### 3. config.json.sampleを元にconfig.jsonを作成し、<>で囲われている部分を適切な値で埋めてください

```sh
$ cp config.json.sample config.json
$ vim config.json
```

### 4. current directoryを`eks`に変更してください.

```sh
$ cd eks
```

### 5. terraformとeksctlを利用して、EKSに必要な環境とEKSを構築します

所要時間: 50分前後

以下のコマンドの裏では、[terraform-aws-modules/vpc/aws](https://registry.terraform.io/modules/terraform-aws-modules/vpc/aws/latest)を使ってたり、`eksctl`を使ってたりしております.

```sh
$ make all
```

[コード](https://github.com/kahirokunn/k8s-templates/blob/f75135b1094a4e9aec3f599137eb76bbced4696f/eks/cluster-spec.jsonnet#L49)を参照して頂くと記載されている通り

* `cluster-autoscaler`
* `aws-load-balancer-controller`
* `ebs-csi-controller-sa`

のIRSAの設定もついでにしてあります.
興味あるかたはそれらを利用したり、追加したりして、対応するものをdeployしてみてください.

### 6. kubectlのcontextが作成したeksに向いている事を確認してください.

```sh
$ kubectl config current-context
```

もし向いてなかったら、`$ make update-kubeconfig`を実行してください

## ArgoCDをdeployする

ArgoCDとは？その構成は？に関しては、[Architectural Overview](https://argo-cd.readthedocs.io/en/stable/operator-manual/architecture)を参照してください.

### 1. current directoryを`examples/argocd`に変更してください.

```sh
$ ../examples/argocd
```

### 2. ArgoCDをdeployします

```sh
$ helm repo add argo https://argoproj.github.io/argo-helm
$ helm repo update
$ helm install argocd argo/argo-cd -n argocd --wait --create-namespace -f argocd-app/argocd-add-plugin-values.yaml
```

### 3. ArgoCDのdashboardにアクセスします

パスワードをメモ

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

port-forwardして、dashboardにアクセスする.
nameは`admin`、パスワードは先程メモしたものを利用する.

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

## ArgoCDで色々Deployしてみる

### 1. gitで管理されているnginxのhelm chartをArgoCDのGUI経由でDeployしてみます

[k8s-templates/examples/argocd/sample-nginx-charts](https://github.com/kahirokunn/k8s-templates/tree/c99dee4c2e1d05ca845b384527026a735c9acf82/examples/argocd/sample-nginx-charts)をdeployします.

Podを消したりして耐障害性を確認してみましょう.

### 2. prom-grafanaをkubectl経由でDeployします

[kahirokunn/k8s-templates/examples/argocd/prom-grafana](https://github.com/kahirokunn/k8s-templates/tree/c99dee4c2e1d05ca845b384527026a735c9acf82/examples/argocd/prom-grafana)をdeployし、GUIで状態を確認します

```sh
$ kubectl apply -f ./prom-grafana
```

deployが完了するとこういう画面になります.

![スクリーンショット 2021-12-15 16.36.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/141711/7f5e5b0e-9960-5d07-f6f1-4a7f99e583d9.png)

dashboardにアクセスしてみましょう.

```sh
$ kubectl port-forward svc/grafana 8082:3000 -n prom-grafana-dev
```

初期のnameは`admin`、passは`admin`です.
入れると画面が見れます.

![スクリーンショット 2021-12-15 16.38.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/141711/4de402b3-8560-cda3-0f91-cda227ba7657.png)
スクリーンショット 2021-12-15 16.38.12

### 3. ArgoCDの状態もArgoCDで確認できるようにします

[k8s-templates/examples/argocd/argocd-app](https://github.com/kahirokunn/k8s-templates/tree/c99dee4c2e1d05ca845b384527026a735c9acf82/examples/argocd/argocd-app)をdeployし、GUIで状態を確認します

```sh
$ cd argocd-app
$ jsonnet -S argocd-app.jsonnet | kubectl apply -f-
```

適用した瞬間には既にSyncとでます.

![スクリーンショット 2021-12-15 16.40.20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/141711/8871da95-1114-90b3-79a6-ca0f9ddb1b83.png)

同様にArgoCD Serverを消したりして耐障害性を確認してみましょう.