[kubernetes]ArgoCDを利用したサービスのデプロイ

# 事前準備

## kindのインストール

```powershell
choco install kind
kind -version
#>kind v0.11.1 go1.16.4 windows/amd64

```
## argoCD-cliのインストール
```powershell
$version = (Invoke-RestMethod https://api.github.com/repos/argoproj/argo-cd/releases/latest).tag_name
$url = "https://github.com/argoproj/argo-cd/releases/download/" + $version + "/argocd-windows-amd64.exe"
$output = "C:\argocd\argocd.exe"
Invoke-WebRequest -Uri $url -OutFile $output
```

その後、システム環境変数にargoCDを設定する。

```powershell
argocd version
#>argocd: v2.0.3+8d2b13d
#>  BuildDate: 2021-05-27T17:42:53Z
#>  GitCommit: 8d2b13d733e1dff7d1ad2c110ed31be4804406e2
#>  GitTreeState: clean
#>  GoVersion: go1.16
#>  Compiler: gc
#>  Platform: windows/amd64
```

# クラスター作成

```yaml:kind-3-3-cluster.yaml
# a cluster with 3 control-plane nodes and 3 workers
kind: Cluster
apiVersion: kind.x-k8s.io/v1alpha4
nodes:
  - role: control-plane
  - role: control-plane
  - role: control-plane
  - role: worker
  - role: worker
  - role: worker
```

```powershell
kind create cluster --config kind-3-3-cluster.yaml
kubectl create namespace argocd
```

# argoCDセットアップ

## argoCD展開

```powershell
kubectl apply -n argocd -f argoCD.yaml
kubectl get svc argocd-server -n argocd

#>NAME            TYPE           CLUSTER-IP    EXTERNAL-IP   PORT(S)                      AGE
#>argocd-server   LoadBalancer   10.96.91.38   <pending>     80:30619/TCP,443:32674/TCP   3h10m
```

### helmchartの場合

```powershell
PS C:\Users\aruki\Desktop\dev\kind> helm repo list
#NAME            URL
#gitlab          https://charts.gitlab.io
#local           http://***/api/v4/projects/8/packages/helm/stable
#bitnami         https://charts.bitnami.com/bitnami
#ingress-nginx   https://kubernetes.github.io/ingress-nginx

helm install my-argo-cd local/argo-cd

```




## argoCD UI接続

https://argo-cd.readthedocs.io/en/stable/getting_started/#port-forwarding

```powershell
# Kubectlポートフォワーディング
kubectl port-forward svc/argocd-server -n argocd 8080:443

# 初期パスワードのチェック
kubectl -n argocd get secret argocd-initial-admin-secret -o go-template="{{.data.password | base64decode }}"
#>********

argocd login localhost:8080
#> WARNING: server certificate had error: x509: certificate signed by unknown authority. Proceed insecurely (y/n)?
#>Username: admin
#>Password:
#>'admin:login' logged in successfully
#>Context 'localhost:8080' updated

# パスワード変更
argocd account update-password
```
その後、ブラウザで下記に接続するとargoCDのUIが表示される。
https://localhost:8080/applications

## サンプル：kubernetes-dashboardのデプロイ

### 事前準備

kubernetes-dashboardをargoCDでデプロイする(Helmchart経由)

- SettingsRepositoriesで、リポジトリを追加する

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/161516/062b021f-d8a1-7da0-f5d5-7510d4f04cc0.png)

```yaml:kubernetes-dashboard.yaml
project: default
source:
  repoURL: 'https://kubernetes.github.io/dashboard/'
  targetRevision: 4.3.1
  helm:
    valueFiles:
      - values.yaml
    parameters:
      - name: serviceAccount.name
        value: admin-user
  chart: kubernetes-dashboard
destination:
  server: 'https://kubernetes.default.svc'
  namespace: kubernetes-dashboard
syncPolicy:
  syncOptions:
    - CreateNamespace=true

```

- NEW APPで下記のように登録
   - helmchartの名前、バージョンを指定する
   - すると、VALUES FILESをクリックしたときに候補としてvalues.yamlを選択できるようになるので、選択する
   - values.yamlを選択するとデフォルトの設定が入力されるが、デフォルト設定から、一か所だけ変更を加える。
       - serviceaccount.nameをadmin-userにする。これにより、ServiceAccountが追加される

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/161516/7c8d31b1-9bf4-4f34-572a-bf435c6cb2a9.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/161516/637543c5-6542-c7e5-d39a-2e202254a2aa.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/161516/846dd09b-fe2e-1c21-bb0c-238e4dc9de1a.png)

### デプロイ

下記のように設定し、sync(同期)する

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/161516/8f22abd1-43f5-5af3-d4db-c0df8ddd68a5.png)

結果、すべて作成され、同期できたことを確認できる。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/161516/3ef4a825-60ed-af71-9299-38eaf8ad7122.png)

### 作成結果
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/161516/aaff726f-cbdc-169d-c895-0b36319858a8.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/161516/126e90be-2e42-e954-afec-eb922c26301c.png)

デフォルト設定からは、一か所だけ変更を加えている。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/161516/e8b786c6-514e-8352-4435-1aea0746a07f.png)

### kubernetes-dashboardの接続

https://github.com/kubernetes/dashboard/blob/master/docs/user/access-control/creating-sample-user.md#creating-sample-user

ログインするためには、ServiceAccountとclusterrolebindingが必要
- clusterrolebindingを追加する
※ServiceAccountは、argocdからdashboardを作成した時に設定しているので、追加不要

```yaml:clusterrole.yaml
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
  name: admin-user
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: cluster-admin
subjects:
- kind: ServiceAccount
  name: admin-user
  namespace: kubernetes-dashboard
```


```powershell
 kubectl apply -f clusterrole.yaml
```

- トークン取得

```powershell
# トークン取得
kubectl -n kubernetes-dashboard get secret $(kubectl -n kubernetes-dashboard get sa/admin-user -o jsonpath="{.secrets[0].name}") -o go-template="{{.data.token | base64decode}}"
>#eyJ*************************************************************************

kubectl proxy
```

その後、ブラウザで下記に接続するとkubernetes-dashboardのUIが表示されるので、先ほど表示したトークンを入力する

http://localhost:8001/api/v1/namespaces/kubernetes-dashboard/services/https:kubernetes-dashboard:https/proxy/#/workloads?namespace=_all

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/161516/c65b3dd6-447a-0acc-1218-6d8ac22a5f9a.png)

結果、ログインに成功し、すべてのリソースが正常(緑表示)になっていることを確認する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/161516/c4dbdb48-8738-6e58-c349-5605ee907c1c.png)