LoginSignup
0
0

Azure Kubernetes Service (AKS) に C# ASP.NET Core Webサービスをデプロイする (Docker Hub カスタムコンテナイメージ)

Last updated at Posted at 2023-03-25

Azure Kubernetes Service (AKS) に C# ASP.NET Core Webサービスをデプロイする (Docker Hub カスタムコンテナイメージ)

こんにちは、@studio_meowtoon です。今回は、Azure Kubernetes Service 環境で C# ASP.NET Core Web アプリケーションをコンテナとして起動する方法を紹介します。
aspnet-core_on_azure-kubernetes-service.png

目的

Windows 11 の Linux でクラウド開発します。

こちらから記事の一覧がご覧いただけます。

実現すること

Microsoft Azure Kubernetes Service (AKS) に C# ASP.NET Core Web アプリケーションのカスタムコンテナイメージをデプロイします。

この記事では、Docker Hub に公開するパブリックアクセス可能なカスタムコンテナイメージを使用しています。実際のシステム開発では、どのレジストリからコンテナイメージを取得するかは異なる場合がありますので、適宜ご確認ください。

技術トピック

Microsoft Azure Kubernetes Service (AKS) とは?

こちらを展開してご覧いただけます。

Microsoft Azure Kubernetes Service (AKS)

Azure 上で実行されるマネージド Kubernetes サービスです。AKS は、クラウド上で Kubernetes クラスターを簡単に展開、管理、スケーリングできるようにすることで、Kubernetes の運用を簡素化します。

キーワード 内容
スケーラビリティ AKS は、需要の変化に合わせてアプリケーションをスケールアップ/ダウンできます。Kubernetes の標準機能を使い、Pod の数を調整することで、クラスター全体のリソース使用率を最適化できます。
自動化 AKS は、クラスターのデプロイ、アップグレード、監視、スケーリング、および管理に関連するタスクを自動化します。これにより、ユーザーは Kubernetes に関連する複雑なタスクを簡素化できます。
セキュリティ AKS は、ユーザーが Kubernetes クラスタをセキュアに設定するのに役立ちます。AKS は、構成可能なネットワークポリシー、構成済みのログイン、Role-Based Access Control (RBAC) などをサポートしています。
ポータビリティ AKS は、クラウドネイティブアプリケーションをどこでも実行できるようにするため、オープンソースの Kubernetes を使用しています。AKS は、Azure の他のサービス、オンプレミス環境、および他のクラウドプロバイダーにデプロイできます。
プロダクションレディ AKS は、高可用性、監視、スケーラビリティ、およびセキュリティに焦点を当て、プロダクションレディな Kubernetes クラスターを提供します。AKS は、SLA で 99.95% の可用性を提供します。

開発環境

  • Windows 11 Home 22H2 を使用しています。

WSL の Ubuntu を操作していきますので macOS の方も参考にして頂けます。

WSL (Microsoft Store アプリ版) ※ こちらの関連記事からインストール方法をご確認いただけます

> wsl --version
WSL バージョン: 1.0.3.0
カーネル バージョン: 5.15.79.1
WSLg バージョン: 1.0.47

Ubuntu ※ こちらの関連記事からインストール方法をご確認いただけます

$ lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description:    Ubuntu 22.04.1 LTS
Release:        22.04

.NET SDK ※ こちらの関連記事からインストール方法をご確認いただけます

$ dotnet --list-sdks
7.0.202 [/usr/share/dotnet/sdk]
$ dotnet --version
7.0.202

Docker ※ こちらの関連記事からインストール方法をご確認いただけます

$ docker --version
Docker version 23.0.1, build a5ee5b1

Azure CLI ※ こちらの関連記事からインストール方法をご確認いただけます

$ az --version
azure-cli                         2.45.0
core                              2.45.0
telemetry                          1.0.8

この記事では基本的に Ubuntu のターミナルで操作を行います。Vim を使用してコピペする方法を初めて学ぶ人のために、以下の記事で手順を紹介しています。ぜひ挑戦してみてください。

作成する Web アプリケーションの仕様

No エンドポイント HTTPメソッド MIME タイプ
1 /api/data GET application/json

Hello World を表示する手順

ASP.NET Core Web サービスの作成

こちらの関連記事で手順がご確認いただけます。

ここまでの手順で、ローカル環境の Ubuntu にアプリのカスタムコンテナイメージをビルドすることができました。

プロジェクトフォルダに移動

プロジェクトフォルダに移動します。
※ ~/tmp/WebApp をプロジェクトフォルダとします。

$ cd ~/tmp/WebApp

コンテナイメージの確認

Docker デーモンを起動します。

$ sudo service docker start
 * Starting Docker: docker      [ OK ]

Docker 環境をお持ちでない場合は、以下の関連記事から Docker Engine のインストール手順をご確認いただけます。

コンテナイメージを確認します。

$ docker images | grep app-hello-aspnet-core
REPOSITORY              TAG       IMAGE ID       CREATED          SIZE
app-hello-aspnet-core   latest    63ec70def9d5   45 seconds ago   208MB

Docker Hub にコンテナイメージを登録

Docker Hub のアカウントを作成します。

Docker Hub にログインします。

$ docker login
Login Succeeded

コンテナイメージにタグを付けます。

ここで $USER という埋め込み変数は、Ubuntu のシェル変数 USER のことです。つまり、カスタムコンテナイメージを Docker Hub にプッシュする際に指定するアカウント名と、Ubuntuユーザー名を同じにすると、イメージの取り扱いが簡単になります。ただし、この方法は検証用途に限定されます。

$ docker tag app-hello-aspnet-core:latest $USER/app-hello-aspnet-core:latest

Docker Hub にコンテナイメージをプュシュします。

$ docker push $USER/app-hello-aspnet-core:latest

ここまでの作業で、Docker Hub に $USER/app-hello-aspnet-core:latest としてカスタムコンテナイメージを公開できました。

シェル変数の作成

シェル変数として、Ubuntu に以下の値を作成します。

$ location_name=japaneast
$ resource_group_name=rg-hello
$ aks_name=aks-hello

Azure 環境にサインイン

こちらの関連記事で手順がご確認いただけます。

Azure CLI でログインします。

$ az login

Azure 環境

リソースグループ

リソースグループを作成します。

Microsoft.Resources/resourceGroups
$ az group create \
    --name $resource_group_name \
    --location $location_name

AKS 環境

AKS を作成すると、Kubernetes クラスター用の多数のリソースが自動的に作成されます。これらのリソースは、Azure Portal 上で確認することができます。ただし、AKS のリソースを削除すると自動的に関連リソースも削除されますが、共有している Azure サブスクリプションで検証される場合など、ご注意ください。

aks.png
AKS クラスターを作成します。
※ Kubernetes 基盤の環境作成に少し時間がかかります。

Microsoft.ContainerService/ManagedClusters
$ az aks create \
    --resource-group $resource_group_name \
    --name $aks_name \
    --node-count 1 \
    --generate-ssh-keys

AKS クラスターの一覧を表示してみます。

$ az aks list

設定ファイルの権限を修正します。
※ 初回のみ必要です。

$ chmod 600 /home/$USER/.kube/config

AKS クラスターと接続します。
※ 既存設定の上書きを許可する為、yes を選択します。

$ az aks get-credentials \
    --resource-group $resource_group_name \
    --name $aks_name

接続設定が成功した場合の出力は、以下のようになります。

Merged "aks-hello" as current context in /home/$USER/.kube/config

ここまでで Azure 上に構築した Kubernetes クラスターに接続できました。ここからはその Kubernetes クラスターをリモートでコマンド操作していきます。

Kubernetes クラスター (AKS) の操作

AKS にデプロイするために、Minikube を経由して kubectl を使用する代わりに、Azure CLI で kubectl を直接インストールする手順を紹介しています。

Kubernetes コマンドライン ツール、kubectl をインストールします。

$ sudo az aks install-cli

Minikube で使用したシンボリックリンクを削除します。

$ unalias kubectl

kubectl のバージョンを確認します。

$ kubectl version --short
Client Version: v1.26.2
Kustomize Version: v4.5.7
Server Version: v1.24.9

現在の接続先を確認します。

$ kubectl config current-context
aks-hello

Kubernetes クラスターに接続していることを確認することは、誤ったクラスターに対してコマンド操作を実行することを防ぐために重要です。例えば、誤ったクラスターに対してデプロイメントを適用したり、Pod を削除したりすると、誤操作が原因サービスの停止データの消失などの致命的な問題を引き起こす可能性があります。

Kubernetes マニフェスト作成

Kubernetes のマニュフェストを作成します。

$USER の部分はご自身のコンテナリポジトリに書き換えて下さい。

$ vim kube-all-in-one.yaml
kube-all-in-one.yaml
apiVersion: v1
kind: Service
metadata:
  name: app-service
spec:
  type: LoadBalancer
  ports:
  - port: 80
    targetPort: 80
  selector:
    app: app
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: app
spec:
  replicas: 1
  selector:
    matchLabels:
      app: app
  template:
    metadata:
      labels:
        app: app
    spec:
      containers:
      - name: app
        image: $USER/app-hello-aspnet-core:latest
        ports:
        - containerPort: 80

Kubernetes クラスターにデプロイします。

$ kubectl apply -f kube-all-in-one.yaml
service/app-service created
deployment.apps/app-deployment created

Kubernetes クラスターの状態を確認します。

$ kubectl get pods,services,deployments
NAME                      READY   STATUS    RESTARTS   AGE
pod/app-b69b5685c-wltz8   1/1     Running   0          14s

NAME                  TYPE           CLUSTER-IP   EXTERNAL-IP     PORT(S)        AGE
service/app-service   LoadBalancer   10.0.251.6   xx.xx.xx.xx     80:32300/TCP   14s
service/kubernetes    ClusterIP      10.0.0.1     <none>          443/TCP        5m3s

NAME                  READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/app   1/1     1            1           14s

コンテナ動作の確認

app-service サービスの EXTERNAL-IP を Ubuntu のシェル変数 aks_external_ip に取得します。

$ aks_external_ip=$(kubectl get svc app-service \
    -o jsonpath='{.status.loadBalancer.ingress[0].ip}')

別ターミナルから curl コマンドで確認します。

$ curl http://$aks_external_ip/api/data -w "\n"
{"message":"Hello Blue!"}
詳細を表示します。
$ curl -v http://$aks_external_ip/api/data -w "\n"
*   Trying xx.xx.xx.xx:80...
* Connected to xx.xx.xx.xx (xx.xx.xx.xx) port 80 (#0)
> GET /api/data HTTP/1.1
> Host: xx.xx.xx.xx
> User-Agent: curl/7.81.0
> Accept: */*
>
* Mark bundle as not supporting multiuse
< HTTP/1.1 200 OK
< Content-Type: application/json
< Date: Sat, 25 Mar 2023 01:07:30 GMT
< Server: Kestrel
< Transfer-Encoding: chunked
<
* Connection #0 to host xx.xx.xx.xx left intact
{"message":"Hello World!"}

ターミナルに {"message":"Hello World!"} と表示され、JSON データを取得することが出来ました。

コンテナに接続

POD の名前を Ubuntu のシェル変数 aks_pod_name に取得します。

$ aks_pod_name=$(kubectl get pods -o=name)

コンテナに接続します。

$ kubectl exec -it $aks_pod_name -- /bin/bash

コンテナに接続後にディレクトリを確認します。
※ コンテナから出るときは ctrl + D を押します。

# pwd
/App
# ls -lah
total 200K
drwxr-xr-x 1 root root 4.0K Mar 24 14:34 .
drwxr-xr-x 1 root root 4.0K Mar 24 23:00 ..
-rwxr-xr-x 1 root root 140K Mar 24 14:34 WebApp
-rw-r--r-- 1 root root  388 Mar 24 14:34 WebApp.deps.json
-rw-r--r-- 1 root root 8.5K Mar 24 14:34 WebApp.dll
-rw-r--r-- 1 root root  20K Mar 24 14:34 WebApp.pdb
-rw-r--r-- 1 root root  469 Mar 24 14:34 WebApp.runtimeconfig.json
-rw-r--r-- 1 root root  119 Mar 24 12:59 appsettings.Development.json
-rw-r--r-- 1 root root  142 Mar 24 12:59 appsettings.json
-rw-r--r-- 1 root root  482 Mar 24 14:34 web.config

top コマンドで状況を確認します。

# apt update
# apt install procps
# top
top - 01:05:25 up 14 min,  0 users,  load average: 0.28, 0.29, 0.37
Tasks:   3 total,   1 running,   2 sleeping,   0 stopped,   0 zombie
%Cpu0  :  2.3 us,  1.0 sy,  0.0 ni, 96.7 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
%Cpu1  :  1.7 us,  2.0 sy,  0.0 ni, 96.0 id,  0.0 wa,  0.0 hi,  0.3 si,  0.0 st
MiB Mem :   6949.5 total,   3818.9 free,    819.8 used,   2310.7 buff/cache
MiB Swap:      0.0 total,      0.0 free,      0.0 used.   5859.8 avail Mem

    PID USER      PR  NI    VIRT    RES    SHR S  %CPU  %MEM     TIME+ COMMAND
      1 root      20   0   12.0g  69424  40820 S   0.0   1.0   0:00.84 dotnet
     69 root      20   0    4028   3472   2984 S   0.0   0.0   0:00.01 bash
    401 root      20   0    6996   3236   2752 R   0.0   0.0   0:00.00 top

コンテナの情報を表示してみます。

# cat /etc/*-release
PRETTY_NAME="Debian GNU/Linux 11 (bullseye)"
NAME="Debian GNU/Linux"
VERSION_ID="11"
VERSION="11 (bullseye)"
VERSION_CODENAME=bullseye
ID=debian
HOME_URL="https://www.debian.org/"
SUPPORT_URL="https://www.debian.org/support"
BUG_REPORT_URL="https://bugs.debian.org/"

このコンテナは Debian Linux をベースに作成されています。つまり、Debian Linux と同じように扱うことができます。

まとめ

Azure Kubernetes Service (AKS) 環境で、Dockerfile からビルドした C# ASP.NET Core Web サービスのカスタムコンテナイメージを起動することができました。

.NET SDKDockerAzure CLIkubectl を使って、ASP.NET Core アプリの開発からコンテナイメージの作成、Azure 環境へのデプロイまで、すべてをターミナルから行うことができます。このように、クラウドでのシステム開発に必要なスキルや理解を深めることができます。初めての人でも簡単に手順を追うことができるので、ぜひ挑戦してみてください。

どうでしたか? 検証目的として、WSL Ubuntu で、C# ASP.NET Core Web アプリケーションを Azure Kubernetes Service (AKS) 環境でコンテナとして手軽に起動することができます。ぜひお試しください。今後も Azure の開発環境などを紹介していきますので、ぜひお楽しみにしてください。

関連記事

Java Spring Boot

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