Helm を使用してアプリケーションをデプロイする

適用対象: AKS on Azure Stack HCI 22H2、Windows Server 上の AKS

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

この記事では、Azure Arc で有効になっている Azure Kubernetes Service を使用しているときに、Helm を使用して AKS にアプリケーションをパッケージ化してデプロイする方法について説明します。

開始する前に

次の要件が設定されていることを確認します。

  • Kubernetes クラスター少なくとも 1 つの Windows または Linux ワーカー ノードが稼働しています。
  • クラスターを指すローカル kubectl 環境を構成しました。 Get-AksHciCredential PowerShell コマンドを使用すると、kubectl を使用してご自身のクラスターにアクセスできます。
  • Helm v3 コマンド ラインと必須コンポーネントがインストールされていること。
  • 使用可能なコンテナー レジストリ (DockerHubAzure Container Registry など)。

この記事では、ASP.NET Core アプリケーションを例として使用します。 この GitHub リポジトリからサンプル アプリケーションをダウンロードできます。

アプリケーションは Kubernetes にデプロイされるため、次の例はプロジェクトの単純な Dockerfile です。

FROM mcr.microsoft.com/dotnet/aspnet:5.0-alpine AS base
WORKDIR /app
EXPOSE 80
EXPOSE 443

FROM mcr.microsoft.com/dotnet/sdk:5.0-alpine AS build
WORKDIR /src
COPY ["MyMicroservice.csproj", "./"]
RUN dotnet restore "MyMicroservice.csproj"
COPY . .
WORKDIR "/src/."
RUN dotnet build "MyMicroservice.csproj" -c Release -o /app/build

FROM build AS publish
RUN dotnet publish "MyMicroservice.csproj" -c Release -o /app/publish

FROM base AS final
WORKDIR /app
COPY --from=publish /app/publish .
ENTRYPOINT ["dotnet", "MyMicroservice.dll"]

サンプル アプリケーションをビルドしてコンテナー レジストリにプッシュする

アプリケーション フォルダーに移動し、Dockerfile を使用して、次のコマンドを使ってイメージをビルドおよびプッシュします。

docker build -f Dockerfile -t acr.azurecr.io/mymicroservice:0.1.0 .

Note

コマンドの最後にあるピリオド (.) によって、Dockerfile の位置を設定します (この場合は現在のディレクトリです)。

このコマンドは、ローカル コンピューターにイメージ mymicroservice:0.1.0 を作成します。 イメージが正常に作成されたことを確認するには、 docker images を実行して次のことを確認します。

REPOSITORY              TAG     IMAGE ID       CREATED            SIZE  
acr.azurecr.io/mymicroservice 0.1.0   5be713db571b   About a minute ago 107MB
....

次に、イメージをコンテナー レジストリ ( DockerHub または Azure Container Registry など) にプッシュ。 この例では、コンテナー イメージが Azure Container Registry にプッシュされます。 詳細については、「 ACR から Kubernetes クラスターへのイメージのプルを参照してください。

docker push acr.azurecr.io/mymicroservice:0.1.0

Helm グラフを作成する

サンプル アプリケーションの準備ができたので、次の手順では、次のように helm create コマンドを使用して Helm チャートを生成します。

helm create mymicroserviceapp

次のように、 mymicroserviceapp/values.yaml を更新します。

  • image.repositoryacr.azurecr.io/mymicroservice に変更します。
  • service.typeNodePort に変更します。

次に例を示します。

# Default values for webfrontend.
# This is a YAML-formatted file.
# Declare variables to be passed into your templates.

replicaCount: 1

image:
  repository: acr.azurecr.io/mymicroservice
  pullPolicy: IfNotPresent
...
service:
  type: NodePort
  port: 80
...

mymicroserviceapp/templates/deployment.yaml ファイルに移動し、正常性チェックを構成します。 Kubernetes は、正常性チェックを使用してアプリケーションのデプロイを管理します。 次の例に示すように、 liveness プローブと readiness プローブの両方へのパスを path: /weatherforecastに置き換えます。

...
 livenessProbe:
    httpGet:
      path: /weatherforecast
      port: http
    initialDelaySeconds: 0
    periodSeconds: 10
    timeoutSeconds: 1
    failureThreshold: 3
 readinessProbe:
    httpGet:
      path: /weatherforecast
      port: http
    successThreshold: 3
...

Helm chart を Kubernetes にデプロイする

ソリューション ディレクトリの charts\mymicroserviceapp ディレクトリから起動して、次のコマンドを実行します。

helm upgrade --install mymicroserviceapp . --namespace=local --set mymicroserviceapp.image.tag="0.1.0" 

このコマンドは、Kubernetes クラスターのlocal名前空間にmymicroserviceapp名前を使用して既存のリリースを作成 (またはアップグレード) し、次の例のような出力を生成します。

Release "mymicroserviceapp" does not exist. Installing it now.
NAME: mymicroserviceapp
LAST DEPLOYED: Fri Apr  2 08:47:24 2021
NAMESPACE: local
STATUS: deployed
REVISION: 1
NOTES:
1. Get the application URL by running these commands:
  export NODE_PORT=$(kubectl get --namespace local -o jsonpath="{.spec.ports[0].nodePort}" services mymicroserviceapp)
  export NODE_IP=$(kubectl get nodes --namespace local -o jsonpath="{.items[0].status.addresses[0].address}")
  echo http://$NODE_IP:$NODE_PORT

Helm チャートをデプロイした後、 kubectl get all -n localを実行して、リソースが正しくデプロイされたことを確認できます。

コマンドの実行からの出力は次のとおりです。

NAME                                     READY   STATUS    RESTARTS   AGE
pod/mymicroserviceapp-7849f949df-fwgbn   1/1     Running   0          101s

NAME                        TYPE       CLUSTER-IP     EXTERNAL-IP   PORT(S)        AGE
service/mymicroserviceapp   NodePort   10.100.149.1   <none>        80:30501/TCP   101s

NAME                                READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/mymicroserviceapp   1/1     1            1           101s

NAME                                           DESIRED   CURRENT   READY   AGE
replicaset.apps/mymicroserviceapp-7849f949df   1         1         1       101s

デプロイのテスト

アプリケーションはサービスおよびノード ポートと共にデプロイされるため、クラスターの外部から API を呼び出すことができます。 この呼び出しを行うには、http://$NODE_IP:$NODE_PORT に要求を送信します。

curl http://10.193.2.103:30501/WeatherForeCast/
StatusCode        : 200
StatusDescription : OK
Content           : [{"date":"2021-04-03T15:51:04.795216+00:00","temperatureC":45,"temperatureF":112,"summary":"Balmy"},{"date":"2021-04-04T15:51:04.
                    7952176+00:00","temperatureC":23,"temperatureF":73,"summary":"Cool"},{"...
RawContent        : HTTP/1.1 200 OK
                    Transfer-Encoding: chunked
                    Content-Type: application/json; charset=utf-8
                    Date: Fri, 02 Apr 2021 15:51:04 GMT
                    Server: Kestrel

                    [{"date":"2021-04-03T15:51:04.795216+00:00","tempera...
Forms             : {}
Headers           : {[Transfer-Encoding, chunked], [Content-Type, application/json; charset=utf-8], [Date, Fri, 02 Apr 2021 15:51:04 GMT], [Server,
                    Kestrel]}
Images            : {}
InputFields       : {}
Links             : {}
ParsedHtml        : mshtml.HTMLDocumentClass
RawContentLength  : 494

クラスターをクリーンアップする

最後の手順では、クラスターをクリーンアップします。 Kubernetes のデプロイ リソースを削除するには、次のコマンドを実行します。

helm uninstall mymicroserviceapp -n local

次の例のような出力が表示されます。

release "mymicroserviceapp" uninstalled

次のステップ