Azure Kubernetes Service (AKS) での Helm を使用した既存のアプリケーションのインストール

Helm は、Kubernetes アプリケーションのライフサイクルをインストールおよび管理するのに役立つオープン ソースのパッケージ化ツールです。 APTYum などの Linux パッケージ マネージャーと同様に、Helm を使用して、構成済みの Kubernetes リソースのパッケージである Kubernetes チャートを管理できます。

この記事では、Azure Kubernetes Service (AKS) の Kubernetes クラスターで Helm を構成して使用する方法を示します。

開始する前に

  • この記事は、AKS クラスターがすでに存在していることを前提としています。 AKS クラスターが必要な場合は、Azure CLIAzure PowerShell、または Azure portal を使用して作成します。
  • AKS クラスターに ACR が統合されている必要があります。 ACR が統合された AKS クラスターを作成する方法の詳細については、「Azure Kubernetes サービスから Azure Container Registry の認証を受ける」を参照してください。
  • Helm CLI もインストールする必要があります。これは、開発システムで実行されるクライアントです。 Helm を使用してアプリケーションを起動、停止、管理することができます。 Azure Cloud Shell を使用している場合、Helm CLI は既にインストールされています。 ローカル プラットフォームでのインストール手順については、Helm のインストールに関するページを参照してください。

重要

Helm は Linux ノードで実行するものです。 クラスター内に Windows Server ノードがある場合、Helm ポッドが確実に Linux ノードでのみ実行されるようにスケジュールする必要があります。 また、インストールする Helm チャートが確実に正しいノードで実行されるようにスケジュールする必要もあります。 この記事のコマンドでは、node-selectors を使用し、ポッドが正しいノードにスケジュールされるが、一部の Helm チャートではノード セレクターが公開されないようにします。 taints などの、他のオプションをクラスターで使用することを検討することもできます。

Helm のバージョンを確認する

  • helm version コマンドを使用して、Helm 3 がインストールされていることを確認します。

    helm version
    

    次の出力例は、Helm バージョン 3.0.0 がインストールされていることを示しています。

    version.BuildInfo{Version:"v3.0.0", GitCommit:"e29ce2a54e96cd02ccfce88bee4f58bb6e2a28b6", GitTreeState:"clean", GoVersion:"go1.13.4"}
    

Helm v3 を使用してアプリケーションをインストールする

Helm リポジトリの追加

  • helm repo コマンドを使用して、ingress-nginx リポジトリを追加します。

    helm repo add ingress-nginx https://kubernetes.github.io/ingress-nginx
    

Helm チャートの検索

  1. helm search コマンドを使用して、作成済みの Helm チャートを検索します。

    helm search repo ingress-nginx
    

    次の出力例の抜粋は、使用できる一部の Helm チャートを示しています。

    NAME                            CHART VERSION   APP VERSION     DESCRIPTION                                       
    ingress-nginx/ingress-nginx     4.7.0           1.8.0           Ingress controller for Kubernetes using NGINX a...
    
  2. helm repo update コマンドを使用して、チャートの一覧を更新します。

    helm repo update
    

    次の出力例は、リポジトリの更新が成功したことを示しています。

    Hang tight while we grab the latest from your chart repositories...
    ...Successfully got an update from the "ingress-nginx" chart repository
    Update Complete. ⎈ Happy Helming!⎈
    

Helm チャートのイメージを ACR にインポートする

この記事では、3 つのコンテナー イメージに依存する NGINX イングレス コントローラー Helm Chart を使用します。

  • az acr import を使用して、NGINX イングレス コントローラーのイメージを ACR にインポートします。

    REGISTRY_NAME=<REGISTRY_NAME>
    CONTROLLER_REGISTRY=registry.k8s.io
    CONTROLLER_IMAGE=ingress-nginx/controller
    CONTROLLER_TAG=v1.8.0
    PATCH_REGISTRY=registry.k8s.io
    PATCH_IMAGE=ingress-nginx/kube-webhook-certgen
    PATCH_TAG=v20230407
    DEFAULTBACKEND_REGISTRY=registry.k8s.io
    DEFAULTBACKEND_IMAGE=defaultbackend-amd64
    DEFAULTBACKEND_TAG=1.5
    
    az acr import --name $REGISTRY_NAME --source $CONTROLLER_REGISTRY/$CONTROLLER_IMAGE:$CONTROLLER_TAG --image $CONTROLLER_IMAGE:$CONTROLLER_TAG
    az acr import --name $REGISTRY_NAME --source $PATCH_REGISTRY/$PATCH_IMAGE:$PATCH_TAG --image $PATCH_IMAGE:$PATCH_TAG
    az acr import --name $REGISTRY_NAME --source $DEFAULTBACKEND_REGISTRY/$DEFAULTBACKEND_IMAGE:$DEFAULTBACKEND_TAG --image $DEFAULTBACKEND_IMAGE:$DEFAULTBACKEND_TAG
    

    Note

    コンテナー イメージを ACR にインポートするだけでなく、Helm Chart を ACR にインポートすることもできます。 詳細については、「Azure コンテナー レジストリに対する Helm グラフのプッシュおよびプル」を参照してください。

Helm チャートの実行

  1. helm install コマンドを使用し、リリース名と、インストールするチャートの名前を指定して、Helm チャートをインストールします。

    ヒント

    次の例では、ingress-basic という名前のイングレス リソースの Kubernetes 名前空間が作成され、その名前空間内で動作することを想定しています。 必要に応じて、ご自身の環境の名前空間を指定できます。

    ACR_URL=<REGISTRY_URL>
    
    # Create a namespace for your ingress resources
    kubectl create namespace ingress-basic
    
    # Use Helm to deploy an NGINX ingress controller
    helm install ingress-nginx ingress-nginx/ingress-nginx \
        --version 4.0.13 \
        --namespace ingress-basic \
        --set controller.replicaCount=2 \
        --set controller.nodeSelector."kubernetes\.io/os"=linux \
        --set controller.image.registry=$ACR_URL \
        --set controller.image.image=$CONTROLLER_IMAGE \
        --set controller.image.tag=$CONTROLLER_TAG \
        --set controller.image.digest="" \
        --set controller.admissionWebhooks.patch.nodeSelector."kubernetes\.io/os"=linux \
        --set controller.service.annotations."service\.beta\.kubernetes\.io/azure-load-balancer-health-probe-request-path"=/healthz \
        --set controller.admissionWebhooks.patch.image.registry=$ACR_URL \
        --set controller.admissionWebhooks.patch.image.image=$PATCH_IMAGE \
        --set controller.admissionWebhooks.patch.image.tag=$PATCH_TAG \
        --set defaultBackend.nodeSelector."kubernetes\.io/os"=linux \
        --set defaultBackend.image.registry=$ACR_URL \
        --set defaultBackend.image.image=$DEFAULTBACKEND_IMAGE \
        --set defaultBackend.image.tag=$DEFAULTBACKEND_TAG \
        --set defaultBackend.image.digest=""
    

    次の出力例の抜粋は、Helm チャートによって作成された Kubernetes リソースのデプロイ状態を示します。

    NAME: nginx-ingress
    LAST DEPLOYED: Wed Jul 28 11:35:29 2021
    NAMESPACE: ingress-basic
    STATUS: deployed
    REVISION: 1
    TEST SUITE: None
    NOTES:
    The ingress-nginx controller has been installed.
    It may take a few minutes for the LoadBalancer IP to be available.
    You can watch the status by running 'kubectl --namespace ingress-basic get services -o wide -w nginx-ingress-ingress-nginx-controller'
    ...
    
  2. kubectl get services コマンドを使用して、サービスの EXTERNAL-IP を取得します。

    kubectl --namespace ingress-basic get services -o wide -w ingress-nginx-ingress-nginx-controller
    

    次の出力例は、ingress-nginx-ingress-nginx-controller サービスの EXTERNAL-IP を示しています。

    NAME                                     TYPE           CLUSTER-IP    EXTERNAL-IP     PORT(S)                      AGE   SELECTOR
    nginx-ingress-ingress-nginx-controller   LoadBalancer   10.0.254.93   <EXTERNAL_IP>   80:30004/TCP,443:30348/TCP   61s   app.kubernetes.io/component=controller,app.kubernetes.io/instance=nginx-ingress,app.kubernetes.io/name=ingress-nginx
    

リリースを一覧表示する

  • helm list コマンドを使用して、クラスターにインストールされているリリースの一覧を取得します。

    helm list --namespace ingress-basic
    

    次の出力例は、前の手順でデプロイされた ingress-nginx リリースを示しています。

    NAME            NAMESPACE       REVISION        UPDATED                                 STATUS          CHART                   APP VERSION
    ingress-nginx   ingress-basic   1               2021-07-28 11:35:29.9623734 -0500 CDT   deployed        ingress-nginx-3.34.0    0.47.0
    

リソースをクリーンアップする

Helm チャートをデプロイすると、ポッド、デプロイ、サービスなどの Kubernetes リソースが作成されます。

  • helm uninstall コマンドを使用し、リリース名を指定して、リソースをクリーンアップします。

    helm uninstall --namespace ingress-basic ingress-nginx
    

    次の出力例は、ingress-nginx という名前のリリースがアンインストールされたことを示しています。

    release "nginx-ingress" uninstalled
    
  • kubectl delete コマンドを使用し、名前空間の名前を指定して、リソースと共にサンプルの名前空間全体を削除します。

    kubectl delete namespace ingress-basic
    

次のステップ

Kubernetes アプリケーションのデプロイの管理について詳しくは、Helm のドキュメントを参照してください。