0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Cluster APIのHelmChartProxyで複数クラスターにHelmチャートを一括配布しよう

Posted at

今回はCluster APIの機能の1つであるHelmChartProxyを使って、複数のKubernetesクラスターに対して一括でHelmチャートを配布する方法を紹介します。

はじめに

複数のKubernetesクラスターを運用していると、同じHelmチャートを複数のクラスターにデプロイする必要が出てきます。従来は各クラスターに対して個別にHelmコマンドを実行する必要がありましたが、Cluster APIのHelmChartProxyを使うと、一括デプロイが可能になります。

今回は以下のことを試していきます:

  • 全クラスターへの一括デプロイ
  • ラベルを使った特定クラスターへのデプロイ
  • プライベートレジストリからのデプロイ

お試し環境準備

必要なツール

  • Docker (メモリ16GB以上推奨)
  • kubectl
  • kind
  • clusterctl

1. 管理クラスターの作成

まずはkindを使って管理クラスターを作成します。以下の設定ファイルを用意します:

# kind-cluster-with-extramounts.yaml
kind: Cluster
apiVersion: kind.x-k8s.io/v1alpha4
networking:
  ipFamily: dual
nodes:
- role: control-plane
  extraMounts:
    - hostPath: /var/run/docker.sock
      containerPath: /var/run/docker.sock

設定ファイルを使ってクラスターを作成:

kind create cluster --config kind-cluster-with-extramounts.yaml

2. Cluster APIのセットアップ

管理クラスターにCluster APIをインストールします:

export CLUSTER_TOPOLOGY=true
clusterctl init --infrastructure docker --addon helm

全コンポーネントの準備が完了するまで待ちます:

kubectl wait --for=condition=Available --timeout=300s -n capi-system deployments --all && \
kubectl wait --for=condition=Available --timeout=300s -n capi-kubeadm-bootstrap-system deployments --all && \
kubectl wait --for=condition=Available --timeout=300s -n capi-kubeadm-control-plane-system deployments --all && \
kubectl wait --for=condition=Available --timeout=300s -n capd-system deployments --all && \
kubectl wait --for=condition=Available --timeout=300s -n caaph-system deployments --all

3. ワークロードクラスターの作成

今回は「muscat」と「delaware」という2つのクラスターを作成します:

# muscatクラスターのマニフェスト生成
clusterctl generate cluster muscat \
  --flavor development \
  --kubernetes-version v1.28.0 \
  --control-plane-machine-count=3 \
  --worker-machine-count=3 \
  > muscat.yaml

# delawareクラスターのマニフェスト生成
clusterctl generate cluster delaware \
  --flavor development \
  --kubernetes-version v1.28.0 \
  --control-plane-machine-count=3 \
  --worker-machine-count=3 \
  > delaware.yaml

# クラスターの作成
kubectl apply -f muscat.yaml
kubectl apply -f delaware.yaml

kubeconfigの取得:

clusterctl get kubeconfig muscat > muscat-kubeconfig.yaml
clusterctl get kubeconfig delaware > delaware-kubeconfig.yaml

4. CNIのセットアップ

両クラスターにCalicoをインストール:

# muscatにCalico導入
kubectl --kubeconfig=muscat-kubeconfig.yaml apply -f https://raw.githubusercontent.com/projectcalico/calico/v3.26.1/manifests/calico.yaml

# delawareにCalico導入
kubectl --kubeconfig=delaware-kubeconfig.yaml apply -f https://raw.githubusercontent.com/projectcalico/calico/v3.26.1/manifests/calico.yaml

HelmChartProxyを使ったデプロイ

全クラスターへのデプロイ

nginxを全クラスターにデプロイする例を見ていきましょう:

# helm-chart-proxy-nginx.yaml
apiVersion: addons.cluster.x-k8s.io/v1alpha1
kind: HelmChartProxy
metadata:
  name: nginx
spec:
  clusterSelector: {} # 空のセレクターは「全クラスター選択」を意味します
  repoURL: oci://registry-1.docker.io/bitnamicharts
  chartName: nginx
  version: "18.2.5"
  releaseName: nginx
  namespace: nginx
  options:
    waitForJobs: true
    atomic: true
    wait: true
    timeout: 5m
    install:
      createNamespace: true
  valuesTemplate: |-
    service:
      type: NodePort

デプロイと確認:

# nginxのデプロイ
kubectl apply -f helm-chart-proxy-nginx.yaml

# HelmReleaseProxyの準備完了を待機
kubectl wait --for=condition=Ready --timeout=300s helmreleaseproxy --all

# muscatのPod確認
kubectl --kubeconfig=muscat-kubeconfig.yaml get pods -n nginx

# delawareのPod確認
kubectl --kubeconfig=delaware-kubeconfig.yaml get pods -n nginx

特定クラスターへのデプロイ

ラベルを使って特定のクラスターにだけデプロイすることもできます:

# helm-chart-proxy-nginx.yaml
apiVersion: addons.cluster.x-k8s.io/v1alpha1
kind: HelmChartProxy
metadata:
  name: nginx
spec:
  clusterSelector:
    matchLabels:
      use-nginx: "true"  # このラベルを持つクラスターにのみデプロイ
  # ... (他の設定は同じ)

使い方:

# nginxのデプロイ
kubectl apply -f helm-chart-proxy-nginx.yaml

# muscatクラスターにラベル付け
kubectl label cluster muscat use-nginx=true

# デプロイの確認
kubectl get helmreleaseproxy -A

# muscatでnginxが動いているか確認
kubectl --kubeconfig=muscat-kubeconfig.yaml get pods -n nginx

# delawareでnginxが動いていないことを確認
kubectl --kubeconfig=delaware-kubeconfig.yaml get pods -n nginx

プライベートレジストリからのデプロイ

GitHub Container Registryを例に見てみましょう:

  1. GitHub Personal Access Tokenを作成(read:packages権限必要)

  2. レジストリ認証情報の設定:

# base64エンコードした認証情報でconfig.jsonを作成
echo -n "YOUR_GITHUB_USERNAME:YOUR_GITHUB_TOKEN" | base64 > auth.txt

cat > config.json << EOF
{
  "auths": {
    "ghcr.io": {
      "auth": "$(cat auth.txt)"
    }
  }
}
EOF

# シークレットの作成
kubectl create secret generic github-creds \
  --from-file=config.json \
  -n caaph-system
  1. プライベートチャート用のHelmChartProxy作成:
apiVersion: addons.cluster.x-k8s.io/v1alpha1
kind: HelmChartProxy
metadata:
  name: private-chart
spec:
  clusterSelector: {}
  repoURL: oci://ghcr.io/YOUR_GITHUB_USERNAME
  chartName: YOUR_CHART_NAME
  version: "0.1.0"
  credentials:
    secret:
      name: github-creds
      namespace: caaph-system
    key: config.json
  # ... (他の設定)

まとめ

HelmChartProxyを使うことで、複数クラスターへのHelmチャートの配布が格段に楽になりました。特に以下のメリットがあります:

  • 一括デプロイによる運用工数の削減
  • ラベルベースでの柔軟なデプロイ制御
  • プライベートレジストリのサポート

もし複数のKubernetesクラスターを運用している場合は、ぜひHelmChartProxyの導入を検討してみてください。

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

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?