hidemium's blog

日々学んだことをアウトプットする。

Cluster API Provider vSphereとArgo CDを使ったKubernetesクラスタの管理

前回、Cluster API Provider vSphereを使ってKubernetesクラスタを作成してみました。今回は、Cluster API Provider vSphereとArgo CDを使ってKubernetesクラスタを管理する方法を試してみたいと思います。

hidemium.hatenablog.com

構成

  • vCenter 7.0 U3
  • ESXi 7.0 Update 3
  • Kubespray
  • kubernetes v1.25.5
  • Cluster API v1.3.2
    • clusterctl v1.3.2
    • cluster-api-provider-vsphere v1.5.1
    • ubuntu-2004-kube-v1.25.5.ova
  • Argo CD v2.6.0

Argo CDについて

Argo CD は、Kubernetes のための宣言的な GitOps 継続的デリバリーツールです。GitOpsパターンに従って、望ましいアプリケーション状態を定義するための信頼できる情報源(source of truth)として Git リポジトリを使用します。

Argo CDで利用できるファイルは以下のようなものがあります。

  • kustomize
  • helmチャート
  • jsonnetファイル
  • manifestsファイル

Gitリポジトリに、アプリケーションの定義ファイルを用意しておくことで、クラスタに自動デプロイすることができます。

Cluster APIとArgo CDを組み合わせて使うことで、Kubernetesクラスタの管理とアプリケーションの管理をGitリポジトリで一元管理することができるようになります。

Argo CDのインストール

前回作成した、management clusterに以下のようにArgo CDをインストールします。

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

以下のように、Argo CD CLI をダウンロードします。

$ curl -sSL -o argocd-linux-amd64 https://github.com/argoproj/argo-cd/releases/latest/download/argocd-linux-amd64
$ sudo install -m 555 argocd-linux-amd64 /usr/local/bin/argocd
$ rm argocd-linux-amd64

デフォルトだと、Argo CD API サーバーは外部 IPで公開されていないため、API サーバーにアクセスするためにIngressを設定します。

$ vi ingress.yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: argocd-server-ingress
  namespace: argocd
  annotations:
    kubernetes.io/ingress.class: "nginx"
    kubernetes.io/tls-acme: "true"
    nginx.ingress.kubernetes.io/force-ssl-redirect: "true"
    nginx.ingress.kubernetes.io/backend-protocol: "HTTPS"
spec:
  tls:
  - hosts:
      - argocd.kube.home.lab
    secretName: ingress-tls
  rules:
  - host: argocd.kube.home.lab
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: argocd-server
            port:
              name: https
$ kubectl apply -f ingress.yaml

ブラウザから https://argocd.kube.home.lab にアクセスできることを確認します。

ブラウザでパスワードが求めれるため、以下のコマンドでパスワードを取得します。

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

以下のように、CLI を使用してログインします。

$ argocd login argocd.kube.home.lab

動作確認

Argo CDのリポジトリにguestbookというアプリケーションが用意されているため、こちらを使って動作確認を行ってみます。

以下のコマンドでアプリケーションの登録を行ってみます。

$ argocd app create guestbook --repo https://github.com/argoproj/argocd-example-apps.git --path guestbook --dest-server https://kubernetes.default.svc --dest-namespace default

guestbookのアプリケーションは自動同期の設定がされていないため、アプリケーションの登録後に以下のように同期を行います。同期を行うことで、リポジトリからマニフェストを取得し、kubectl applyマニフェストを実行します。

$ argocd app sync guestbook

Health StatusがHealthyとなっており、正常に同期されたことが分かります。

$ argocd app get guestbook
Name:               argocd/guestbook
Project:            default
Server:             https://kubernetes.default.svc
Namespace:          default
URL:                https://argocd.kube.home.lab/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

プライベートリポジトリの登録

Argo CDを利用するために、Gitリポジトリが必要なため、プライベートリポジトリとしてBitbucketのリポジトリを用意します。

BitbucketのPersonal settingsでSSH keysにsshの公開鍵を登録しておきます。

以下のように、ssh秘密鍵を利用し、プライベートリポジトリを登録します。

$ argocd repo add git@bitbucket.org:<username>/argocd-apps.git --ssh-private-key-path ~/.ssh/id_rsa

リポジトリマニフェストファイルを追加

リポジトリに以下のようにマニフェストファイルを配置します。

$ tree
.
├── app
│   └── workload-nginx-app.yaml
├── capi-cluster
│   └── cluster.yaml
├── management
│   └── capi-cluster-app.yaml
├── README.md
└── workload
    └── nginx
        ├── deployment.yaml
        └── service.yaml

ファイルについて解説していきます。

こちらは、Argro CDのApplicationを追加するマニフェストファイルになります。動作確認では、argocdコマンドで行っていましたが、マニフェストファイルでも管理することができます。management clusterにデプロイする形となります。

$ vi management/capi-cluster-app.yaml
apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
  name: capi-cluster
  namespace: argocd
spec:
  destination:
    namespace: default
    server: 'https://kubernetes.default.svc'
  source:
    path: capi-cluster
    repoURL: 'git@bitbucket.org:<username>/argocd-apps.git'
    targetRevision: HEAD
  project: default
  syncPolicy:
    automated: {}

capi-cluster/cluster.yamlには、clusterctl で生成したworkload clusterのcluster.yamlの中身をそのまま貼り付けます。

$ clusterctl generate cluster vsphere-quickstart \
    --infrastructure vsphere \
    --kubernetes-version v1.25.5 \
    --control-plane-machine-count 1 \
    --worker-machine-count 3 > cluster.yaml

こちらは、動作確認用のnginxのサービスをworkload clusterへデプロイするための、Argro CDのApplicationのマニフェストファイルになります。

serverには、workload clusterのcontrole planeのエンドポイントのURLを指定しておきます。

$ vi app/workload-nginx-app.yaml
apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
  name: nginx
  namespace: argocd
spec:
  destination:
    namespace: default
    server: 'https://10.0.50.40:6443'
  source:
    path: workload/nginx
    repoURL: 'git@bitbucket.org:<username>/argocd-apps.git'
    targetRevision: HEAD
  project: default
  syncPolicy:
    automated: {}

動作確認用のnginxのサービスの設定になります。

$ vi workload/nginx/deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app: nginx
  name: nginx
spec:
  replicas: 1
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - image: nginx
        name: nginx
        ports:
        - containerPort: 80
$ vi workload/nginx/service.yaml
apiVersion: v1
kind: Service
metadata:
  labels:
    app: nginx
  name: nginx
spec:
  ports:
  - port: 80
    protocol: TCP
    targetPort: 80
  selector:
    app: nginx

workload clusterのインストール

以下のコマンドで、workload clusterをインストールするための、Argo CDのApplicationを設定します。

$ kubectl apply -f management/capi-cluster-app.yaml

Argo CDのUIかコマンドでCluster APIによりworkload clusterのインストールされている様子を確認します。

$ argocd app get argocd/capi-cluster

capi-clusterのステータスがProgressingのままとなっていますが、こちらはCNIのインストールが完了していたいためになります。

workload clusterにCNIのインストールを行います。

まずは、workload clusterにアクセスするためのconfigファイルを以下のように生成します。

$ clusterctl get kubeconfig vsphere-quickstart > vsphere-quickstart.kubeconfig

以下のようにcalicoをインストールします。

$ KUBECONFIG=vsphere-quickstart.kubeconfig kubectl apply -f https://raw.githubusercontent.com/projectcalico/calico/v3.25.0/manifests/calico.yaml

capi-clusterのステータスがHealthyとなれば、workload clusterのインストールの完了となります。

$ argocd app get argocd/nginx
Name:               argocd/capi-cluster
Project:            default
Server:             https://kubernetes.default.svc
Namespace:          default
URL:                https://argocd.kube.home.lab/applications/capi-cluster
Repo:               git@bitbucket.org:<username>/argocd-apps.git
Target:             HEAD
Path:               capi-cluster
SyncWindow:         Sync Allowed
Sync Policy:        Automated
Sync Status:        Synced to HEAD (1c29848)
Health Status:      Healthy

ArgoCDのUI上だと以下のように見えます。

workload clusterでの動作確認

ArgoCDでworkload clusterを扱えるようにするために、clusterの登録を行います。

workload clusterのコンテキスト名を取得します。

$ KUBECONFIG=vsphere-quickstart.kubeconfig kubectl config get-contexts
CURRENT   NAME                                          CLUSTER              AUTHINFO                   NAMESPACE
*         vsphere-quickstart-admin@vsphere-quickstart   vsphere-quickstart   vsphere-quickstart-admin

以下のようにArgoCDにworkload clusterを新クラスタとして登録します。

$ argocd cluster add vsphere-quickstart-admin@vsphere-quickstart --insecure --kubeconfig ./vsphere-quickstart.kubeconfig

以下のコマンドで、動作確認用のnginxのサービスをworkload clusterへデプロイするための、Argro CDのApplicationを設定します。

$ kubectl apply -f app/workload-nginx-app.yaml

nginxのステータスがHealthyとなれば、nginxのインストールの完了となります。

$ argocd app get argocd/nginx
Name:               argocd/nginx
Project:            default
Server:             https://10.0.50.40:6443
Namespace:          default
URL:                https://argocd.kube.home.lab/applications/nginx
Repo:               git@bitbucket.org:<username>/argocd-apps.git
Target:             HEAD
Path:               workload/nginx
SyncWindow:         Sync Allowed
Sync Policy:        Automated
Sync Status:        Synced to HEAD (1c29848)
Health Status:      Healthy

おわりに

ArgoCDを使ってCluster APIを使ったKubernetesクラスタの管理を試してみました。ArgoCDへ作成したworkload clusterのクラスタ登録をどうやって自動で行うかなど課題がありますが、作りこんでいけば、CNIのインストールや、vSphere CSIの再インストールなども自動化して、Gitで管理できるようになるのではと思っています。

参考