Aug 10, 2021
Aug 18, 2021
N/A Views
MD
warning
この記事は2年以上前に更新されたものです。情報が古くなっている可能性があります。

BitnamiのHelm ChartArgo CD をインストールするメモ。併せてArgo CDで ytt を使う設定も行います。

目次

Kindクラスタの作成

Kindでk8sクラスタを作成します。Ingress用に80, 443ポートをexposeする設定を行います。

curl -sL https://github.com/projectcontour/contour/raw/main/examples/kind/kind-expose-port.yaml > kind-expose-port.yaml
kind create cluster --config kind-expose-port.yaml 

Contourのインストール

Ingressとして Contour を使用します。

kubectl apply -f https://projectcontour.io/quickstart/contour.yaml

Argo CDのインストール

使用するHelmのバージョンは次の通りです。

$ helm version                                                         
version.BuildInfo{Version:"v3.6.3", GitCommit:"d506314abfb5d21419df8c7e7e68012379db2354", GitTreeState:"dirty", GoVersion:"go1.16.5"}

helm installでインストールする方法とhelm template + kappでインストールする方法を説明します。

BitnamiのChartレポジトリを追加します。

helm repo add bitnami https://charts.bitnami.com/bitnami

次のバージョンのChartをインストールします。

$ helm search repo argo-cd
NAME            CHART VERSION   APP VERSION     DESCRIPTION                                       
bitnami/argo-cd 1.0.1           2.0.5           Declarative, GitOps continuous delivery tool fo...

helm installでインストール

Argo CDで使用するホスト名を設定します。ARGO_CD_HOSTNAMEはWebブラウザ用、ARGO_CD_GRPC_HOSTNAMEargocd CLI用です。

export ARGO_CD_HOSTNAME=argo-cd.localhost.ik.am
export ARGO_CD_GRPC_HOSTNAME=grpc.argo-cd.localhost.ik.am

*.localhost.ik.am127.0.0.1に解決されます。KindにArgo CDをインストールする場合は、このドメインを使用できます。

次のコマンドでhelm installに渡す設定値を生成します。

cat <<EOF > values.yaml
server:
  service:
    annotations:
      projectcontour.io/upstream-protocol.h2c: https,443 
  ingress:
    enabled: true
    hostname: ${ARGO_CD_HOSTNAME}
    tls: false
    selfSigned: true
    extraTls:
    - hosts:
      - ${ARGO_CD_HOSTNAME}
      secretName: ${ARGO_CD_HOSTNAME}-tls
  ingressGrpc:
    enabled: true
    hostname: ${ARGO_CD_GRPC_HOSTNAME}
    tls: true
    selfSigned: true    
  insecure: true
  config: |
    configManagementPlugins: |-
      - name: bash
        generate:
          command:
          - /bin/bash
          args:
          - -ce    
          - ./generate
redis:
  replica:
    replicaCount: 1
EOF

configManagementPluginsに、Argo CDがKubernetesにデプロイするマニフェストをgenerateというファイル名の任意のBASHスクリプトで生成できるbashプラグインを設定しています。汎用的に使えて便利です。

次のコマンドでArgo CDをインストールします。

export TZ=UTC
helm install argo-cd --create-namespace -n argo-cd bitnami/argo-cd --values values.yaml --wait

Warning

helm install実行時のタイムゾーンをUTCにしないと、正しい認証情報でログインしようとしても生成されるadmin.passwordMtimeのタイムゾーンがずれ、 invalid session: Account password has changed since token issued というエラーメッセージが出力されました。

https://github.com/argoproj/argo-cd/issues/4177 と同じ現象です。

インストールが完了後、作成されたリソースを次のコマンドで確認できます。

$ kubectl get all,secret,cm,ingress -n argo-cd
NAME                                          READY   STATUS    RESTARTS   AGE
pod/argo-cd-app-controller-6b58c49d7f-nqstq   1/1     Running   0          78s
pod/argo-cd-redis-master-0                    1/1     Running   0          78s
pod/argo-cd-redis-replicas-0                  1/1     Running   0          78s
pod/argo-cd-repo-server-687c9d5446-p7jpm      1/1     Running   0          78s
pod/argo-cd-server-84d568b4c7-9v5tr           1/1     Running   0          78s

NAME                             TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)          AGE
service/argo-cd-app-controller   ClusterIP   10.96.166.20    <none>        8082/TCP         78s
service/argo-cd-redis-headless   ClusterIP   None            <none>        6379/TCP         78s
service/argo-cd-redis-master     ClusterIP   10.96.186.201   <none>        6379/TCP         78s
service/argo-cd-redis-replicas   ClusterIP   10.96.25.86     <none>        6379/TCP         78s
service/argo-cd-repo-server      ClusterIP   10.96.188.128   <none>        8081/TCP         78s
service/argo-cd-server           ClusterIP   10.96.205.121   <none>        80/TCP,443/TCP   78s

NAME                                     READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/argo-cd-app-controller   1/1     1            1           78s
deployment.apps/argo-cd-repo-server      1/1     1            1           78s
deployment.apps/argo-cd-server           1/1     1            1           78s

NAME                                                DESIRED   CURRENT   READY   AGE
replicaset.apps/argo-cd-app-controller-6b58c49d7f   1         1         1       78s
replicaset.apps/argo-cd-repo-server-687c9d5446      1         1         1       78s
replicaset.apps/argo-cd-server-84d568b4c7           1         1         1       78s

NAME                                      READY   AGE
statefulset.apps/argo-cd-redis-master     1/1     78s
statefulset.apps/argo-cd-redis-replicas   1/1     78s

NAME                                               TYPE                                  DATA   AGE
secret/argo-cd-argocd-app-controller-token-7xtcd   kubernetes.io/service-account-token   3      78s
secret/argo-cd-argocd-repo-server-token-4v6kn      kubernetes.io/service-account-token   3      78s
secret/argo-cd-argocd-server-token-vtp4q           kubernetes.io/service-account-token   3      78s
secret/argo-cd-redis                               Opaque                                1      78s
secret/argo-cd-redis-token-tlnlt                   kubernetes.io/service-account-token   3      78s
secret/argo-cd.localhost.ik.am-tls                 kubernetes.io/tls                     3      78s
secret/argocd-secret                               Opaque                                4      78s
secret/default-token-zptxj                         kubernetes.io/service-account-token   3      78s
secret/grpc.argo-cd.localhost.ik.am-tls            kubernetes.io/tls                     3      78s
secret/sh.helm.release.v1.argo-cd.v1               helm.sh/release.v1                    1      78s

NAME                                    DATA   AGE
configmap/argo-cd-redis-configuration   3      78s
configmap/argo-cd-redis-health          6      78s
configmap/argo-cd-redis-scripts         2      78s
configmap/argocd-cm                     1      78s
configmap/argocd-ssh-known-hosts-cm     1      78s
configmap/kube-root-ca.crt              1      78s

NAME                                            CLASS    HOSTS                          ADDRESS   PORTS     AGE
ingress.networking.k8s.io/argo-cd-server        <none>   argo-cd.localhost.ik.am                  80, 443   78s
ingress.networking.k8s.io/argo-cd-server-grpc   <none>   grpc.argo-cd.localhost.ik.am             80, 443   78s

https://${ARGO_CD_HOSTNAME}にアクセスします。自己署名証明書を使用しているので、Chromeの場合はブラウザに"thisisunsafe"を入力して進んでください。

image

ユーザー名はadmin、パスワードは次のコマンドで取得できます。

kubectl -n argo-cd get secret argocd-secret -o template="{{.data.clearPassword | base64decode}}"

image

helm installコマンドでパスワードやTLS証明書が自動生成されています。この状態でhelm upgradeを実行すると、再生成が行われ、アプリケーションが壊れる可能性があるので、
次のコマンドで生成された値をvalues.yamlに反映し、helm upgradeで再生性が行われないようにします。

cat <<EOF > values.yaml
server:
  service:
    annotations:
      projectcontour.io/upstream-protocol.h2c: https,443
  ingress:
    enabled: true
    hostname: ${ARGO_CD_HOSTNAME}
    tls: false
    selfSigned: false
    extraTls:
    - hosts:
      - ${ARGO_CD_HOSTNAME}
      secretName: ${ARGO_CD_HOSTNAME}-tls    
    secrets:
    - name: $(kubectl get secret -n argo-cd --field-selector type=kubernetes.io/tls -o template='{{(index (index (index .items 0) "metadata") "name")}}')
      certificate: |
$(kubectl get secret -n argo-cd --field-selector type=kubernetes.io/tls -o template='{{index (index (index .items 0) "data") "tls.crt" | base64decode}}' | sed 's/^/        /g')      
      key: |
$(kubectl get secret -n argo-cd --field-selector type=kubernetes.io/tls -o template='{{index (index (index .items 0) "data") "tls.key" | base64decode}}' | sed 's/^/        /g')
  ingressGrpc:
    enabled: true
    hostname: ${ARGO_CD_GRPC_HOSTNAME}
    tls: true
    selfSigned: false
    secrets:
    - name: $(kubectl get secret -n argo-cd --field-selector type=kubernetes.io/tls -o template='{{(index (index (index .items 1) "metadata") "name")}}')
      certificate: |
$(kubectl get secret -n argo-cd --field-selector type=kubernetes.io/tls -o template='{{index (index (index .items 1) "data") "tls.crt" | base64decode}}' | sed 's/^/        /g')      
      key: |
$(kubectl get secret -n argo-cd --field-selector type=kubernetes.io/tls -o template='{{index (index (index .items 1) "data") "tls.key" | base64decode}}' | sed 's/^/        /g')
  insecure: true
  config: |
    configManagementPlugins: |-
      - name: bash
        generate:
          command:
          - /bin/bash
          args:
          - -ce    
          - ./generate
redis:
  replica:
    replicaCount: 1
  auth:
    password: $(kubectl get secret -n argo-cd argo-cd-redis -otemplate='{{index .data "redis-password" | base64decode}}')
config:
  secret:
    argocdServerAdminPassword: $(kubectl get secret -n argo-cd argocd-secret -otemplate='{{index .data "clearPassword" | base64decode}}')
    argocdServerAdminPasswordMtime: $(kubectl get secret -n argo-cd argocd-secret -otemplate='{{index .data "admin.passwordMtime" | base64decode}}')
    extra:
      server.secretkey: $(kubectl get secret -n argo-cd argocd-secret -otemplate='{{index .data "server.secretkey" | base64decode}}')
EOF

次のコマンドでhelm upgradeを実行します。

helm upgrade argo-cd -n argo-cd bitnami/argo-cd --values values.yaml --wait

パスワード自体は変わっていませんが、Redisクラスタの再作成が行われます。

ブラウザをReloadしても同じ画面が表示されることを確認してください。

Argo CDをアンインストールしたい場合は次のコマンドを実行してください。

helm uninstall -n argo-cd argo-cd

helm template + kappでインストール

helm installでインストールするよりもhelm templateで生成したマニフェストをkappでインストールした方が
作成されるリソースが分かりやすいのとアップデート時に変更の差分を確認できてメンテナンスしやすいです。

helm installの代わりにhelm templateでマニフェストを生成する場合は次のコマンドを実行します。values.yaml./post-render.shの生成方法は上記の通りです。

export TZ=UTC
helm template argo-cd --create-namespace --include-crds -n argo-cd bitnami/argo-cd --values values.yaml > argo-cd.yaml

このマニフェストをkappでデプロイする場合は次のコマンドを実行してください。

kubectl create ns argo-cd
kapp deploy -a argo-cd -f argo-cd.yaml -c --diff-mask=false

Argo CDをアンインストールしたい場合は次のコマンドを実行してください。

kapp delete -a argo-cd --apply-ignored=true

Argo CDでCarvel(ytt)を使用できるようにする

Argo CDはKusomize、Helm、Jsonnetを直接サポートしていますが、yttはサポートされていません。
上記のインストールでbashプラグインを設定したので、generateスクリプト内でyttを使ってmanifestを作成すれば良いです。

そのために、generateスクリプトを実行するrepo-serverにyttをインストールする必要があります。
ドキュメントは こちら

values.yamlに次の設定を追記して、repo-serverにCarvelをインストールします。

cat <<'EOF' >> values.yaml
repoServer:
  extraVolumes:
  - name: carvel
    emptyDir: {}
  initContainers:
  - name: install-carvel
    image: docker.io/k14s/image
    command:
    - bash
    - -ce
    args:
    - |
      mv `which ytt` ${K14SIO_INSTALL_BIN_DIR}
      mv `which kapp` ${K14SIO_INSTALL_BIN_DIR}
      mv `which kbld` ${K14SIO_INSTALL_BIN_DIR}
      mv `which kwt` ${K14SIO_INSTALL_BIN_DIR}
      mv `which imgpkg` ${K14SIO_INSTALL_BIN_DIR}
      mv `which vendir` ${K14SIO_INSTALL_BIN_DIR}
      # or if you want to install the latest carvel tools
      # wget -O- https://carvel.dev/install.sh | bash
    env:
    - name: K14SIO_INSTALL_BIN_DIR
      value: /carvel
    volumeMounts:
    - mountPath: /carvel
      name: carvel
  extraVolumeMounts:
  - mountPath: /usr/local/bin/ytt
    name: carvel
    subPath: ytt
  - mountPath: /usr/local/bin/kapp
    name: carvel
    subPath: kapp
  - mountPath: /usr/local/bin/kbld
    name: carvel
    subPath: kbld
  - mountPath: /usr/local/bin/kwt
    name: carvel
    subPath: kwt
  - mountPath: /usr/local/bin/imgpkg
    name: carvel
    subPath: imgpkg
  - mountPath: /usr/local/bin/vendir
    name: carvel
    subPath: vendir  
EOF

helm installでArgo CDをインストールした場合は次のコマンドでアップデートしてください。

helm upgrade argo-cd -n argo-cd bitnami/argo-cd --values values.yaml --wait

helm template + kappでArgo CDをインストールした場合は次のコマンドでアップデートしてください。

kapp deploy -a argo-cd -f argo-cd.yaml -c --diff-mask=false

アップデートが完了したら次のコマンドを実行してrepo-serverにCarvelがインストールされていることを確認してください。

$ kubectl exec -ti -n argo-cd $(kubectl get pod -n argo-cd -l app.kubernetes.io/component=repo-server -o jsonpath='{.items[0].metadata.name}') -- bash -c "find /usr/local/bin -type f -exec {} version \;"

imgpkg version 0.11.0

Succeeded
kbld version 0.30.0

Succeeded
ytt version 0.34.0
vendir version 0.16.0

Succeeded
Client Version: 0.0.6

Succeeded
kapp version 0.37.0

Succeeded

Applicationの作成

インストールしたArgo CDを使ってApplicationを作成します。ここからはCLIを使います。
CLIは次のコマンドでインストールできます。

brew install argocd

次のバージョンを使用しました。

$ argocd version --client
argocd: v2.0.5+4c94d88.dirty
  BuildDate: 2021-07-23T05:09:14Z
  GitCommit: 4c94d886f56bcb2f9d5b3251fdc049c2d1354b88
  GitTreeState: dirty
  GoVersion: go1.16.6
  Compiler: gc
  Platform: darwin/amd64

次のコマンドでArgo CDへログインします。gRPCのIngressを経由します。

argocd login ${ARGO_CD_GRPC_HOSTNAME} --insecure --username admin --password $(kubectl get secret -n argo-cd argocd-secret -otemplate='{{index .data "clearPassword" | base64decode}}') 

Dev用のApplicationを作成します

# Dev
argocd app create hello-tanzu-dev \
--repo https://github.com/making/argo-cd-gitops-demo.git \
--path dev \
--config-management-plugin bash \
--dest-server https://kubernetes.default.svc \
--sync-policy automated \
--auto-prune

Prod用のApplicationも作成します。

# Prod
argocd app create hello-tanzu-prod \
--repo https://github.com/making/argo-cd-gitops-demo.git \
--path prod \
--config-management-plugin bash \
--dest-server https://kubernetes.default.svc \
--sync-policy automated \
--auto-prune

Dashboardには次のように表示されます。

APP HEALTHが"Progressing"になっているのはArgo CDが中からIngress(*.localhost.ik.am = 127.0.0.1)にアクセスできないからだと思います。Kind以外では問題ないはずです。

image

image

image

実際にアプリケーションにアクセスします。

image

yttを使用しているのでDev/Prodそれぞれに対してoverlayを用意することが可能です。

Found a mistake? Update the entry.
Share this article: