kind で作成したクラスタに Argo CD で色々試した
kind で作成したクラスタ上に Argo CD をデプロイし、GitOps なるものをできるようにした。実際に試したら苦労したため、メモとして残す。
ゴール
- kind で作成したクラスタ上で、Argo CD を動かす
- Ingress 経由で Argo CD の Web UI へアクセスできるようにする
kind でクラスタを作成
外部から Ingress 経由のアクセスをできるようにしたいため、 extraPortMappings
と node-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 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 上でもサンプルアプリが追加されていることを確認できた。
実際にリソースがデプロイされている。
❯ 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 でデプロイできるようにやっていきたい。