kind で作成したクラスタに Argo CD で色々試した

Date: 2021/04/06
Tags: K8s Kind Argocd

kind で作成したクラスタ上に Argo CD をデプロイし、GitOps なるものをできるようにした。実際に試したら苦労したため、メモとして残す。

ゴール

kind でクラスタを作成

外部から Ingress 経由のアクセスをできるようにしたいため、 extraPortMappingsnode-labels の設定を入れる。kind – Ingress にも記載されているとおり、role が controle-plane のものに設定を追加すれば良い。

❯ cat <<EOF | kind create cluster --config=-
kind: Cluster
apiVersion: kind.x-k8s.io/v1alpha4
networking:
  apiServerAddress: "192.168.1.100"
  apiServerPort: 6443
nodes:
- role: control-plane
  kubeadmConfigPatches:
  - |
    kind: InitConfiguration
    nodeRegistration:
      kubeletExtraArgs:
        node-labels: "ingress-ready=true"    
  extraPortMappings:
  - containerPort: 80
    hostPort: 80
    protocol: TCP
  - containerPort: 443
    hostPort: 443
    protocol: TCP
EOF

NGINX Ingress Controller をデプロイする。

❯ kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/master/deploy/static/provider/kind/deploy.yaml

# pod/ingress-nginx-controller-xxxxxxxx-xxxxx condition metが出力されればOK
❯ kubectl wait --namespace ingress-nginx \
  --for=condition=ready pod \
  --selector=app.kubernetes.io/component=controller \
  --timeout=90s
pod/ingress-nginx-controller-c7c5dfc9f-4rh2r condition met

サンプルアプリをデプロイして動作することを確認。

❯ kubectl apply -f https://kind.sigs.k8s.io/examples/ingress/usage.yaml
pod/foo-app created
service/foo-service created
pod/bar-app created
service/bar-service created
Warning: networking.k8s.io/v1beta1 Ingress is deprecated in v1.19+, unavailable in v1.22+; use networking.k8s.io/v1 Ingress
ingress.networking.k8s.io/example-ingress created

❯ curl http://192.168.1.100/foo
foo

❯ curl http://192.168.1.100/bar
bar

Argo CD のデプロイ

Getting Started - Argo CD - Declarative GitOps CD for Kubernetes の手順に沿って、Argo CD をデプロイする。Custom Resource や Pod など必要なものが一通りデプロイされる。

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

Argo CD 関連の Pod が Running になっていれば OK。

❯ kubectl get po -n argocd
NAME                                 READY   STATUS    RESTARTS   AGE
argocd-application-controller-0      1/1     Running   0          5h8m
argocd-dex-server-567b48df49-5fj2p   1/1     Running   0          5h8m
argocd-redis-6fb68d9df5-cdcrt        1/1     Running   0          5h8m
argocd-repo-server-6dcbd9cb-mvcw8    1/1     Running   0          5h8m
argocd-server-69678b4f65-gt55h       1/1     Running   0          5h8m

Argo CD の Ingress をデプロイ

以下の公式ドキュメントにあるとおり、Ingress リソースを作成してアクセスする。
今回は、NGINX Ingress Controler を使うパターンを試す。

Ingress Configuration - Argo CD - Declarative GitOps CD for Kubernetes

Ingress リソースの作成

Option 1: SSL-Passthrough で試すと、Web UI にアクセスできるが、 argocd login ができなかった。
そのため、Option 2: Multiple Ingress Objects And Hosts の HTTP と GRPC で Ingress を分けるパターンを試した。

以下の manifest を作成し、Ingress リソースを apply した。argocd.ingress.m1ya0t0.com, gprc.argocd.ingress.m1yam0t0.com の部分は任意のドメインに変更する。

metadata:
  name: argocd-server-ingress
  namespace: argocd
  annotations:
    kubernetes.io/ingress.class: nginx
    nginx.ingress.kubernetes.io/force-ssl-redirect: "true"
    nginx.ingress.kubernetes.io/backend-protocol: "HTTP"
spec:
  rules:
    - host: argocd.ingress.m1yam0t0.com
      http:
        paths:
          - backend:
              serviceName: argocd-server
              servicePort: http
            path: /
  tls:
    - hosts:
        - argocd.ingress.m1yam0t0.com
      secretName: argocd-secret
---
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: grpc-argocd-server-ingress
  namespace: argocd
  annotations:
    kubernetes.io/ingress.class: nginx
    nginx.ingress.kubernetes.io/backend-protocol: "GRPC"
spec:
  rules:
    - host: grpc.argocd.ingress.m1yam0t0.com
      http:
        paths:
          - backend:
              serviceName: argocd-server
              servicePort: https
            path: /
  tls:
    - hosts:
        - grpc.argocd.ingress.m1yam0t0.com
      secretName: argocd-secret

ドメインの設定を行う

手軽な方法として、 /etc/hosts を編集した。

argocd.ingress.m1yam0t0.com, gprc.argocd.ingress.m1yam0t0.com の部分は manifest で設定したドメインと同じものに設定する。

192.168.1.100 argocd.ingress.m1yam0t0.com
192.168.1.100 grpc.argocd.ingress.m1yam0t0.com

argocd-server の TLS を無効化

Ingress を http/https と grpc で分割した場合、argocd-server の TLS を無効化する必要がある。無効化の際は、 argocd-server deployment を修正して、 —insecure オプションを付与する。

❯ kubectl edit deploy argocd-server -n argocd
deployment.apps/argocd-server edited

変更内容は以下。

spec:
  template:
    spec:
      containers:
        - name: argocd-server
          command:
            - argocd-server
            - --staticassets
            - /shared/app
            - --insecure # この部分を追加

動作確認

Ingress の動作確認

設定したドメインにアクセスすると、Argo CD の WebUI にログインできた。

ArgoCD のログイン画面

argocd コマンドも使えることが確認できた。

❯ argocd login grpc.argocd.ingress.m1yam0t0.com:443
WARNING: server certificate had error: x509: certificate is valid for ingress.local, not grpc.argocd.ingress.m1yam0t0.com. Proceed insecurely (y/n)? y
Username: admin
Password:
'admin' logged in successfully
Context 'grpc.argocd.ingress.m1yam0t0.com:443' updated

サンプルアプリのデプロイ

公式が提供しているサンプルアプリをデプロイしてみる。

❯ argocd app create guestbook \
  --repo https://github.com/argoproj/argocd-example-apps.git \
  --path guestbook \
  --dest-server https://kubernetes.default.svc \
  --dest-namespace default
application 'guestbook' created

❯ argocd app list
NAME       CLUSTER                         NAMESPACE  PROJECT  STATUS  HEALTH   SYNCPOLICY  CONDITIONS  REPO                                                 PATH       TARGET
guestbook  https://kubernetes.default.svc  default    default  Synced  Healthy  <none>      <none>      https://github.com/argoproj/argocd-example-apps.git  guestbook

❯ argocd app sync guestbook
TIMESTAMP                  GROUP        KIND   NAMESPACE                  NAME    STATUS   HEALTH        HOOK  MESSAGE
2021-04-04T18:28:48+09:00            Service     default          guestbook-ui    Synced  Healthy
2021-04-04T18:28:48+09:00   apps  Deployment     default          guestbook-ui    Synced  Healthy
2021-04-04T18:28:48+09:00            Service     default          guestbook-ui    Synced  Healthy              service/guestbook-ui unchanged
2021-04-04T18:28:48+09:00   apps  Deployment     default          guestbook-ui    Synced  Healthy              deployment.apps/guestbook-ui unchanged

Name:               guestbook
Project:            default
Server:             https://kubernetes.default.svc
Namespace:          default
URL:                https://grpc.argocd.ingress.m1yam0t0.com/applications/guestbook
Repo:               https://github.com/argoproj/argocd-example-apps.git
Target:
Path:               guestbook
SyncWindow:         Sync Allowed
Sync Policy:        <none>
Sync Status:        Synced to  (53e28ff)
Health Status:      Healthy

Operation:          Sync
Sync Revision:      53e28ff20cc530b9ada2173fbbd64d48338583ba
Phase:              Succeeded
Start:              2021-04-04 18:28:48 +0900 JST
Finished:           2021-04-04 18:28:48 +0900 JST
Duration:           0s
Message:            successfully synced (all tasks run)

GROUP  KIND        NAMESPACE  NAME          STATUS  HEALTH   HOOK  MESSAGE
       Service     default    guestbook-ui  Synced  Healthy        service/guestbook-ui unchanged
apps   Deployment  default    guestbook-ui  Synced  Healthy        deployment.apps/guestbook-ui unchanged

Web UI 上でもサンプルアプリが追加されていることを確認できた。

ArgoCD の App resource

実際にリソースがデプロイされている。

❯ kubectl get all
NAME                                READY   STATUS    RESTARTS   AGE
pod/guestbook-ui-85985d774c-nlltb   1/1     Running   0          9m54s

NAME                   TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)   AGE
service/guestbook-ui   ClusterIP   10.96.91.116   <none>        80/TCP    9m54s
service/kubernetes     ClusterIP   10.96.0.1      <none>        443/TCP   6h58m

NAME                           READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/guestbook-ui   1/1     1            1           9m54s

NAME                                      DESIRED   CURRENT   READY   AGE
replicaset.apps/guestbook-ui-85985d774c   1         1         1       9m54s

port-forward して、サンプルアプリにアクセスできることも確認できた。

❯ kubectl port-forward svc/guestbook-ui 8080:80
Forwarding from 127.0.0.1:8080 -> 80
Forwarding from [::1]:8080 -> 80

サンプルアプリ

おわりに

kind で作成したクラスタ上で Argo CD を立ち上げることができた。
Argo CD を使って、各種アプリケーションを GitOps でデプロイできるようにやっていきたい。