Argo CD インストール

# 概要
 - k8sテスト環境構築<br>
<b>Argo CD インストール</b>

# 構築目次
 - [全体目次](https://qiita.com/prodigy413/items/89fcb8cfb71e80f541d8)

# 環境
 - Rancher: v2.6.3
 - kubernetes(Client): v1.22.4
 - kubernetes(Server): v1.22.4
 - Argocd: v2.2.1

# 前提条件
 - NGINX Ingress インストール済み<br>
[NGINX Ingress インストール] (https://qiita.com/prodigy413/items/b26bac84bbb4555ac8f0)
 - MetalLB インストール済み<br>
[MetalLB インストール] (https://qiita.com/prodigy413/items/3a24ff85819dc5eafe25)

# インストール

 - 作業場所: ClientPC
 - Argocd install page<br>
https://argo-cd.readthedocs.io/en/stable/getting_started/

### Argocd コマンドのダウンロード
 - Argocd release page<br>
https://github.com/argoproj/argo-cd/releases

~~~
$ wget https://github.com/argoproj/argo-cd/releases/download/v2.2.1/argocd-linux-amd64
$ mv argocd-linux-amd64 argocd
$ chmod +x argocd
$ sudo mv argocd /usr/local/bin/
$ argocd version --client
argocd: v2.2.1+122ecef
  BuildDate: 2021-12-17T01:31:40Z
  GitCommit: 122ecefc3abfe8b691a08d9f3cecf9a170cc8c37
  GitTreeState: clean
  GoVersion: go1.16.11
  Compiler: gc
  Platform: linux/amd64
~~~

### Argocd インストール

~~~
## Namespace 作成 ##
$ kubectl create namespace argocd

## Argocd インストール ##
$ kubectl apply -n argocd -f https://raw.githubusercontent.com/argoproj/argo-cd/stable/manifests/install.yaml

## 確認 ##
$ kubectl get all -n argocd
NAME                                      READY   STATUS    RESTARTS   AGE
pod/argocd-application-controller-0       1/1     Running   0          7m29s
pod/argocd-dex-server-76c978c87-v66jf     1/1     Running   0          7m29s
pod/argocd-redis-5b6967fdfc-7p59t         1/1     Running   0          7m29s
pod/argocd-repo-server-8555f94d4f-zwn6n   1/1     Running   0          7m29s
pod/argocd-server-bc59fd78c-kj2f5         1/1     Running   0          7m29s

NAME                            TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)                      AGE
service/argocd-dex-server       ClusterIP   10.43.215.83    <none>        5556/TCP,5557/TCP,5558/TCP   7m30s
service/argocd-metrics          ClusterIP   10.43.98.185    <none>        8082/TCP                     7m30s
service/argocd-redis            ClusterIP   10.43.48.168    <none>        6379/TCP                     7m30s
service/argocd-repo-server      ClusterIP   10.43.142.118   <none>        8081/TCP,8084/TCP            7m30s
service/argocd-server           ClusterIP   10.43.255.118   <none>        80/TCP,443/TCP               7m30s
service/argocd-server-metrics   ClusterIP   10.43.13.156    <none>        8083/TCP                     7m29s

NAME                                 READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/argocd-dex-server    1/1     1            1           7m29s
deployment.apps/argocd-redis         1/1     1            1           7m29s
deployment.apps/argocd-repo-server   1/1     1            1           7m29s
deployment.apps/argocd-server        1/1     1            1           7m29s

NAME                                            DESIRED   CURRENT   READY   AGE
replicaset.apps/argocd-dex-server-76c978c87     1         1         1       7m29s
replicaset.apps/argocd-redis-5b6967fdfc         1         1         1       7m29s
replicaset.apps/argocd-repo-server-8555f94d4f   1         1         1       7m29s
replicaset.apps/argocd-server-bc59fd78c         1         1         1       7m29s

NAME                                             READY   AGE
statefulset.apps/argocd-application-controller   1/1     7m29s
~~~

# 設定

### Ingress 設定

 - 設定参照
https://argo-cd.readthedocs.io/en/stable/operator-manual/ingress/#kubernetesingress-nginx

 - マニフェスト作成

~~~yaml:ingress.yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: argocd-server-ingress
  namespace: argocd
  annotations:
    nginx.ingress.kubernetes.io/force-ssl-redirect: "true"
    nginx.ingress.kubernetes.io/ssl-passthrough: "true"
spec:
  ingressClassName: nginx
  rules:
  - host: argocd.test.local
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: argocd-server
            port:
              number: 443
~~~

 - マニフェスト適用

~~~
$ kubectl apply -f ingress.yaml
~~~

 - hosts 設定追加<br>
Load BalancerのIPとIngressで設定したhostを紐づけ

~~~
$ cat /etc/hosts
........
192.168.245.111 argocd.test.local
........
~~~

### ログイン設定

 - 初期パスワード確認

~~~
$ kubectl -n argocd get secret argocd-initial-admin-secret -o jsonpath="{.data.password}" | base64 -d; echo
xxxxxxxxxx
~~~

 - ログイン

~~~
## サーバーは上記Ingressで設定したホスト名、パスワードは初期パスワードでログイン。
$ argocd login argocd.test.local --username admin --password xxxxxxx

## ログイン後、パスワードを自分用に変更。
$ argocd account update-password
*** Enter password of currently logged in user (admin): 
*** Enter new password for user admin: 
*** Confirm new password for user admin: 
Password updated
Context 'argocd.test.local' updated

## パスワード変更後、初期パスワード用secretは削除
$ kubectl delete secret -n argocd argocd-initial-admin-secret

※ログアウトする場合は以下実行
$ argocd logout argocd.test.local
~~~

# 動作確認

 - Argocd コマンドリンク<br>
https://argo-cd.readthedocs.io/en/stable/user-guide/commands/argocd/

### レポジトリ追加

 - レポジトリ追加方法はいくつがあるが、ここではSSH Private Key利用<br>
※GithubのSSH設定は説明スキップ

~~~
## 追加 ##
$ argocd repo add git@github.com:prodigy413/argocd-test.git --ssh-private-key-path ~/.ssh/github_key

## 確認 ##
$ argocd repo list
TYPE  NAME  REPO                                       INSECURE  OCI    LFS    CREDS  STATUS      MESSAGE  PROJECT
git         git@github.com:prodigy413/argocd-test.git  false     false  false  false  Successful 
~~~

### Application 追加

- マニフェスト作成
 - 対象Namespace：argocd-test
 - レポジトリ：argocd-test
 - パス：ルートディレクトリ
 - auto sync：有効（3分間隔でレポジトリ自動チェック）
 - prune：有効（Githubからリソースが消えるとKubernetes上のリソースも自動削除）
 - selfheal：有効（GithubとKubernetesのリソース差分があった場合、自動復旧）

~~~yaml:application.yaml
apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
  name: test
  namespace: argocd
spec:
  destination:
    name: ''
    namespace: argocd-test
    server: 'https://kubernetes.default.svc'
  source:
    path: ./
    repoURL: 'git@github.com:prodigy413/argocd-test.git'
    targetRevision: HEAD
  project: default
  syncPolicy:
    automated:
      prune: true
      selfHeal: true
~~~

 - マニフェスト適用

~~~
## 適用 ##
$ kubectl apply -f application.yaml

## 確認 ##
$ argocd app list
NAME  CLUSTER                         NAMESPACE    PROJECT  STATUS     HEALTH   SYNCPOLICY  CONDITIONS  REPO                                       PATH  TARGET
test  https://kubernetes.default.svc  argocd-test  default  OutOfSync  Missing  <none>      <none>      git@github.com:prodigy413/argocd-test.git  ./    HEAD
~~~

### Kubernetes 設定

 - Namespace 作成

~~~
$ kubectl create ns argocd-test
~~~

 - テスト用Pod作成
以下マニフェストを`argocd-test`レポジトリにアップロード

~~~yaml:nginx.yaml
apiVersion: v1
kind: Pod
metadata:
  name: nginx
  labels:
    app: nginx
    env: test
spec:
  containers:
  - name: nginx
    image: nginx:1.21.4
    imagePullPolicy: IfNotPresent
    ports:
    - containerPort: 80
~~~

### 確認

~~~
## Podが自動作成されている。
$ kubectl get pod -n argocd-test
NAME    READY   STATUS    RESTARTS   AGE
nginx   1/1     Running   0          5s

## Podを削除しても自動で再作成される。
$ kubectl delete pod nginx -n argocd-test

$ kubectl get pod -n argocd-test
NAME    READY   STATUS    RESTARTS   AGE
nginx   1/1     Running   0          5s
~~~