LoginSignup
0
0

KICを使ってArgoCDを立てる

Posted at

ArgoCDはIngressの説明が充実しているが、Kong Ingress Controller(KIC)の説明はなかったので実際に試してみた時のメモ。

検証の前提

以下が用意・導入されているものとする。

  • helmコマンド
  • Kubernetesクラスタ
  • KIC
  • cert-manager
  • GitHub CLI(ghコマンド)

また、証明書については自己署名証明書を使う。
ghコマンド部分はコマンドを使わずWebUI等で作業しても問題ない。

ArgoCDの導入

ArgoCDでTLSを利用する場合、本体自身をTLS化してIngressをTLS Passthroughさせる方法と、IngressをTLSの終端とする方法の2種類がある。
ただし、TLS Passthroughに関してはIngress側が対応している必要がある。
KICの場合、kind: GatewayであればTLS Passthroughに対応するが、Ingressでは対応していない
ArgoCDをHelmで構築する場合はIngressのみ指定可能なので、ここではTLSはIngress終端で進める。

自己署名証明書を発行するためのIssuerを作成する。

cat <<EOF | kubectl apply -f -
apiVersion: cert-manager.io/v1
kind: ClusterIssuer
metadata:
  name: selfsigned-issuer
spec:
  selfSigned: {}
EOF

ArgoCDのhelm用values.yamlを作成する。

ARGOCD_HOST=argocd.mydomain.com
GRPC_HOST=grpc.$ARGOCD_HOST
cat <<EOF > ./argocd-values.yaml
global:
  domain: $ARGOCD_HOST

configs:
  params:
    server.insecure: true

server:
  ingress:
    enabled: true
    ingressClassName: kong
    hostname: $ARGOCD_HOST
    annotations:
      cert-manager.io/cluster-issuer: selfsigned-issuer
    extraTls:
      - hosts:
        - $ARGOCD_HOST
        secretName: argocd-server-tls
  ingressGrpc:
    enabled: true
    ingressClassName: kong
    hostname: $GRPC_HOST
    annotations:
      cert-manager.io/cluster-issuer: selfsigned-issuer
    extraTls:
      - hosts:
        - $GRPC_HOST
        secretName: grpc-argocd-server-tls
EOF

ポイントとしては以下となる。

  • IngressでTLSを終端させるため、本体をTLS化させないためにserver.insecure: trueを指定
  • Ingressは単一のプロトコルしかサポート出来ないため、gRPCとArgoCD本体でIngressを別々に作成する

作り終わったらデプロイする。

helm upgrade -i argocd argo/argo-cd -n argocd --create-namespace -f ./argocd-values.yaml

デプロイが終わると初期パスワードがSecretで作成されているので取得する。

kubectl get secret -n argocd argocd-initial-admin-secret -o jsonpath={.data.password} | base64 -d

ArgoCDのURLの方にアクセスし、Username:admin、Password:取得したパスワードでアクセスする。
問題なければ以下のような画面が取得できる。
image.png

次にgRPC側の確認も行う。
CLIはここにインストール方法がある。
ここではMacで進める。

brew install argocd

この後、CLIでArgoCDにアクセスすると以下のような警告が出る。

$ argocd login $GRPC_HOST --insecure
WARN[0002] Failed to invoke grpc call. Use flag --grpc-web in grpc calls. To avoid this warning message, use flag --grpc-web.
Username:

KICでgRPCを使う場合、ここにあるようにServiceのAnnotationでプロトコルの指定が必要なのだが、ArgoCDのServicekonghq.com/protocol: grpcを指定すると今度はWebUIのアクセスが出来なくなってしまう。
konghq.com/protocol: grpc,httpと複数指定してもどうもhttpが優先されてしまうようなので、ここではgRPC用に別のServiceを手動で作成する。

cat <<EOF | kubectl apply -f -
apiVersion: v1
kind: Service
metadata:
  annotations:
    konghq.com/protocol: grpc
  name: argocd-server-grpc
  namespace: argocd
spec:
  ports:
  - name: https
    port: 443
    targetPort: 8080
  selector:
    app.kubernetes.io/instance: argocd
    app.kubernetes.io/name: argocd-server
EOF

なお、TLSはIngressで終端しているので、grpcsではなくgrpcとなる。
作ったServiceに飛ぶようIngress側も更新する。

kubectl patch ingress -n argocd argocd-server-grpc --type='json' -p='[{"op": "replace", "path": "/spec/rules/0/http/paths/0/backend/service/name", "value":"argocd-server-grpc"}]'

これでアクセスすると警告表示が出なくなる。

$ argocd login $GRPC_HOST --insecure
Username:

問題なければ以下のようにログイン出来る。

Username: admin
Password:
'admin:login' logged in successfully
Context 'grpc.argocd.mydomain.com' updated

GitOpsの疎通確認

ここではArgoCDとGitHubを繋いでnginxをクラスタ上にデプロイしてみる。
まずGitHub上に適当なリポジトリを作成してcloneする。

gh repo create argocd-simple-test --public
gh repo clone argocd-simple-test

nginx用のDeploymentのManifestをリポジトリに登録する。

cd argocd-simple-test
mkdir dev
kubectl create deploy nginx-argocd -r 1 -n default --image nginx --dry-run=client -o yaml > ./dev/nginx-deploy.yaml
git add .
git commit -m "initial commit"
git push origin main

次にArgoCDとGitHubを接続する。
ArgoCDのUIでSettings->Repositories->CONNECT REPOから以下のように入力して接続する。

  • connection method: VIA HTTPS
  • Type: git
  • Project: default
  • Repository URL: 作成したリポジトリのURL
    問題なければ以下のようにCONNECTION STATUSSuccessfulとなる。
    image.png

次にApplications->NEW APPからApplication(ArgoCDのプロジェクト管理単位)を作成する。
設定項目は以下の通り。

  • Application Name: nginx
  • Project Name: default
  • SYNC POLICY: Manual
  • Repository URL: 登録したリポジトリ
  • Path: dev
  • Cluster URL: https://kubernetes.default.svc

以下を入力し終えたら上のCREATEをクリックすると以下のようにApplicationが作成される。
image.png

せっかくなのでコマンドでsyncさせてデプロイさせる。
ログインした状態でargocd app sync <Application名>でsyncできるのでコマンドを実行する。

argocd app sync nginx

コマンドを実行するとWebUIの方がSyncedに変わる。
image.png

デプロイの方も正常に行われている。

$ kubectl get pod -n default
NAME                            READY   STATUS    RESTARTS   AGE
nginx-argocd-5797cc5546-cpbk9   1/1     Running   0          84s

以上で、KICでもArgoCDが正常に使えることが確認できた。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0