Amazon EKSでArgoCDを利用する

# はじめに
Amazon EKSで[ArgoCD](https://argo-cd.readthedocs.io/en/stable/)を利用する方法をまとめます。
Mac環境を想定しています。

# 実行環境の準備
1.  AWS CLIの設定
[AWS CloudFormationを動かすためのAWS CLIの設定](https://qiita.com/miyabiz/items/fed11796f0ea2b7608f4)を参考にしてください。

1.  EKSクラスタの構築
[Macでeksctlを利用してAmazon EKSのクラスターを構築する](https://qiita.com/miyabiz/items/75f83237795b0b7d52bd)を参考にしてください。

1.  EKSのコンテキストの設定
[MacにてAmazon EKSの設定をする](https://qiita.com/miyabiz/items/b98d145cedb35dab9524)を参考にしてください。

1.  Helmの設定
[Amazon EKSでHelmを利用する](https://qiita.com/miyabiz/items/453361e6af64b324443c)を参考にしてください。


# 環境設定
1.  ArgoCD CLIのインストール

    ```sh
    brew install argocd
    ```

1.  ArgoCDのチャートをHelmでインストールする
    ※事前にKubernetesクラスターのコンテキストの設定をします。

    ```sh
    # argo　チャートリポジトリを追加する
    helm repo add argo https://argoproj.github.io/argo-helm

    # リポジトリを更新する
    helm repo update

    # ArgoCD のチャートをインストールする
    # Install CRDs if you are using Helm2.
    helm install argocd argo/argo-cd \
      -n argocd \
      --set installCRDs=false \
      --create-namespace

    # ArgoCD がインストールされたことを確認する
    helm list -n argocd
    ```

1.  ArgoCD 初期パスワードを確認する

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

1.  ArgoCD を起動する

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

1.  ArgoCD 初期パスワードを変更する
    ※デフォルトのアカウント名は `admin` になります。
    ※ArgoCDを起動した状態でないとパスワードの変更はできません。

    ```sh
    # ログインする
    argocd login \
      --username admin \
      --password "$(kubectl -n argocd get secret argocd-initial-admin-secret -o jsonpath='{.data.password}' | base64 -d && echo)" \
      --insecure localhost:8080

    # パスワードを変更する
    argocd account update-password \
      --account admin \
      --current-password "$(kubectl -n argocd get secret argocd-initial-admin-secret -o jsonpath='{.data.password}' | base64 -d && echo)" \
      --new-password "${新しいパスワード}" --insecure
    ```

1.  ArgoCD 初期パスワードが格納されていたSecretを削除する

    ```sh
    kubectl -n argocd delete secret argocd-initial-admin-secret
    ```

1.  ArgoCD にアクセスする

    ```sh
    open "https://localhost:8080"
    ```

# [サンプル] guestbook-goのマニフェスト
[guestbook-go](https://github.com/kubernetes/examples/tree/master/guestbook-go)を構築する。

1.  `guestbook-go.yaml` を作成する

    ```yaml:guestbook-go.yaml
    apiVersion: argoproj.io/v1alpha1
    kind: Application
    metadata:
      name: guestbook
      namespace: argocd
      finalizers:
        - resources-finalizer.argocd.argoproj.io
    spec:
      project: default
      source:
        repoURL: https://github.com/kubernetes/examples.git
        path: guestbook-go
      destination:
        server: 'https://kubernetes.default.svc'
        namespace: guestbook
      syncPolicy:
        syncOptions:
        - CreateNamespace=true
        automated:
          prune: true
          selfHeal: true
    ```

1.  クラスターに適用する

    ```sh
    kubectl apply -f guestbook-go.yaml
    ```

1.  guestbook にアクセスする
    ※ELBが構築されるまで、数分アクセスできないことがあります。

    ```sh
    open "http://$(kubectl get svc -n guestbook guestbook | awk '{ print $4 }' | tail -1):$(kubectl get svc -n guestbook guestbook | awk '{ print $5 }' | tail -1 | cut -d ':' -f 1)"
    ```

# クリーンアップ

1.  クラスターから削除する

    ```sh
    kubectl delete -f guestbook-go.yaml
    ```

1.  ArgoCDをHelmで削除する

    ```sh
    helm delete argo -n argocd 
    ```

1.  Namespaceを削除する

    ```sh
    kubectl delete ns argocd
    ```