初めてのAzure Kubernetes Service(AKS)

2021-01-31Azure,Kubernetes Service(AKS)

初めてのAzure Kubernetes Service(AKS)という事で、リソースの作成からサンプルアプリのコンテナーデプロイまでの手順を紹介します。
手順確認にあたってはMS社公式サイトのチュートリアルに沿って進めています。

AKSチュートリアル

チュートリアルに沿って、AKSとAzure Container Registry(ACR)を連携させ、ACRからアプリケーションをデプロイしています。
チュートリアルはAzure CLIなどでリソースを作成していますが、Azure Portalを利用してリソースを作成しています。

※本記事内ではAzure Kubernetes ServiceをAKSとして記載している箇所があります。
※本記事内ではAzure Container RegistryをACRとして記載している箇所があります。

スポンサーリンク

Azure PortalでACRとAKSのリソースを作成

作成したリソースの設定値

作成したリソースの設定内容です。
仮想マシン、リソースグループ、仮想ネットワークやサブネットは事前に準備したものを利用しています。
検証目的の設定としています。

主なACRの設定値です。

設定値
基本 レジストリ名 acr01
Pricing Tier Basic

主なAKSの設定値です。

設定値
基本 リソース名 aks-01
AKS価格レベル 無料
Kubernetesバージョン 1.29.6(規定)
スケジュール 毎週土曜日2時開始(日本時間)
ノードプール ノードサイズ Standard_D2as_v5
スケーリング方法 手動
ノード数 1
ネットワーク プライベートクラスター 有効
ネットワーク構成 Azure CNI オーバーレイ
独自のAzure仮想ネットワークを持ち込む 有効
仮想ネットワーク vnet-aks-01
クラスターサブネット subnet-aks-01
ネットワークポリシー Azure
統合 コンテナーレジストリ acr01
監視中 Prometheusメトリックを有効にする 無効
推奨されるアラートルールを有効化 無効
詳細 シークレットストア CSI ドライバーの有効化 有効
インフラストラクチャリソースグループ rg-aks-02

※ACRは重複したレジストリ名を許可しません。適時付与下さい。
※検証目的とした設定としています。チュートリアルと異なる部分があります。
※検証コスト削減や、別の検証利用を想定して設定を変更している部分があります。
※ノード数を1にしているなど、Azureの推奨設定と異なっている部分があります。

ACRのリソースを作成

Azure Container Registry(ACR)のリソースを作成します。

ACRリソース作成手順
コンテナーレジストリのメニューで作成を選択します。 Azure Container Registry(ACR)の作成
基本タブです。
レジストリ名やPricing Tierを選択します。
基本タブの設定画面例(Azure Container Registry(ACR)の作成)
ネットワークや暗号化の設定です。
Premium Tierでしか利用できないため、そのまま進めます。
ネットワークの設定画面例(Azure Container Registry(ACR)の作成)
暗号化タブの設定画面例(Azure Container Registry(ACR)の作成)
確認画面です。
内容を確認し、リソースを作成します。
作成確認画面例(Azure Container Registry(ACR)の作成)

AKSのリソースを作成

Azure Kubernetes Service(AKS)のリソースを作成します。

AKSリソース作成手順
Kubernetesサービスのメニューで作成を選択します。
Kubernetes クラスターを選択します。
Kubernetesクラスターの作成開始(AKS(Azure Kubernetes Service)のリソース作成)
基本タブの設定です。
Kubernetesクラスター名、AKS価格レベル、Kubernetesバージョンなどを設定します。
基本タブで価格レベルやバージョンを設定(AKS(Azure Kubernetes Service)のリソース作成)
AKSの自動アップグレード設定です。
有効化やアップデートスケジュールの設定ができます。

【自動アップグレードの説明】
Automatically upgrade an Azure Kubernetes Service (AKS)
Auto-upgrade node OS images

 

基本タブで自動アップグレード設定画面例(AKS(Azure Kubernetes Service)のリソース作成)
AKS自動アップグレードのメンテナンススケジュール設定画面例(AKS(Azure Kubernetes Service)のリソース作成)

ノードプール設定です。
ノードプールを選択してノード数やスケーリング方法を設定します。

※検証コストの都合上、ノード数を1にしていますが、この設定は推奨されません。

ノードプールの設定画面例(AKS(Azure Kubernetes Service)のリソース作成)
ノードプールの設定です。
ノードサイズやスケーリング方法、ノード数を設定します。
最後に更新します。
ノードプールの更新でノードサイズやスケーリング方法を設定(AKS(Azure Kubernetes Service)のリソース作成)
ノードプールの更新設定画面例(AKS(Azure Kubernetes Service)のリソース作成)
ノードプールのVMサイズ選択画面例(AKS(Azure Kubernetes Service)のリソース作成)

ネットワーク設定です。
プライベートクラスターの有効化、ネットワーク構成、ネットワークポリシーなどを設定します。

【プライベートクラスターの説明】
Create a private Azure Kubernetes Service (AKS) cluster

【ネットワーク構成(Azure CNI)の説明】
Azure Container Networking Interface (CNI) Overlay networking

【ネットワークポリシーの説明】
Secure traffic between pods by using network policies in AKS

ネットワーク設定のプライベートアクセス設定(AKS(Azure Kubernetes Service)のリソース作成)
コンテナーネットワーク設定(AKS(Azure Kubernetes Service)のリソース作成)
コンテナーネットワーク設定(AKS(Azure Kubernetes Service)のリソース作成)
統合設定です。
ACRとの接続などを設定します。
統合設定でAzure Container Registryを選択(AKS(Azure Kubernetes Service)のリソース作成)

監視に関する設定です。
今回はマネージドPrometheusやアラート設定を無効化しています。
自身の検証内容に合わせて有効化して下さい。

【マネージドPrometheusの説明】
Prometheus 用の Azure Monitor マネージド サービス

監視中設定(AKS(Azure Kubernetes Service)のリソース作成)
詳細タブです。
必要に応じて修正します。

※インフラストラクチャ リソース グループは、AKSと同時に作成されるリソースのリソースグループ名です。

詳細設定(AKS(Azure Kubernetes Service)のリソース作成)
レビューと作成の画面です。
内容を確認し、リソースを作成します。
レビューと作成確認画面(AKS(Azure Kubernetes Service)のリソース作成)
レビューと作成確認画面(AKS(Azure Kubernetes Service)のリソース作成)
レビューと作成確認画面(AKS(Azure Kubernetes Service)のリソース作成)

AKSと同時に作成されたリソース

AKSと同時に作成されたリソースです。
関連リソースはインフラストラクチャ リソース グループとして指定したリソースグループに作成されます。

関連リソース

インフラストラクチャ リソース グループにノードプールとして構成された仮想マシンスケールセット、プライベートDNS、Load Balancerなどのリソースが作成されています。

※設定内容により作成されるリソースは異なります。

AKS(Azure Kubernetes Service)に関連して作成されたリソース
AKS(Azure Kubernetes Service)に関連して作成されたリソース

ACRのアクセス制御設定

ACRのアクセス制御(IAM)の設定を確認します。

ACRのアクセス制御設定(IAM)

AKSのユーザー割り当てマネージドIDに対して、AcrPullのロールが割り当てされています。

Azure Container Registryのアクセス制御(IAM)設定画面例

—広告—

事前準備(Azure CLI、Docker開発環境を準備)

チュートリアルを実施するための環境を準備します。

作業環境

作業端末にはRocky Linuxの仮想マシン(Standard_B2ms(X86ベース))を利用しています。
チュートリアルに必要なアプリを仮想マシンにインストールしています。

    • 作業環境
      • Rocky Linux release 9.4 (Blue Onyx)
      • Docker version 27.1.1 build 6312585
      • azure-cli 2.62.0
      • git version 2.43.5

作業時点の最新バージョンに合わせて実施します。
kubectlのインストールは後に説明する手順内で実施しています。

Azure CLIのインストール

作業用端末にAzure CLIをインストールします。

Azure CLIインストール(公式サイト)

Rocky LinuxにAzure CLIをインストールする手順についてはこちらで紹介しています。

gitのインストール

チュートリアルで利用するサンプルアプリはGitからClone(複製)します。
gitをインストールします。

[root@test-vm-01 ~]# dnf -y install git

Dockerのインストール

チュートリアルではDocker関連のコマンドが出てきます。
Dockerをインストールします。
Dockerの公式サイトを参考にインストールします。

Install Docker Engine on RHEL

[root@test-vm-01 ~]# dnf install -y yum-utils
[root@test-vm-01 ~]# yum-config-manager –add-repo https://download.docker.com/linux/centos/docker-ce.repo
[root@test-vm-01 ~]# dnf install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin

ローカルのDocker環境でサンプルアプリを実行

ローカルのDocker環境でサンプルのアプリケーションを実行します。
AKSやACRを利用しません。

チュートリアル – Azure Kubernetes Service (AKS) 用のアプリケーションを準備する

Dockerを起動

Dockerを起動します。

[root@test-vm-01 ~]# systemctl start docker

サンプルアプリをGitから複製

サンプルのアプリをローカル環境にダウンロードします。

[root@test-vm-01 ~]# git clone https://github.com/Azure-Samples/aks-store-demo.git
[root@test-vm-01 ~]# cd aks-store-demo/

サンプルアプリを実行

Docker Composeを利用してローカルのDocker環境にアプリケーションをデプロイします。

Docker Composeは、複数のDockerコンテナーを一括して管理・運用するためのツールです。
今回のサンプルアプリは4つのコンテナーから構成されています。
一括して立ち上げています。

Docker Compose overview

[root@test-vm-01 aks-store-demo]# docker compose -f docker-compose-quickstart.yml up -d

作成されたイメージを表示します。

[root@test-vm-01 aks-store-demo]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
aks-store-demo-store-front latest 8b3964378f0d 15 minutes ago 16.8MB
aks-store-demo-product-service latest 05491494aa27 16 minutes ago 121MB
aks-store-demo-order-service latest 0c0649fe0d97 24 minutes ago 172MB
rabbitmq 3.13.2-management-alpine b1dafc50c098 5 months ago 180MB

実行中のコンテナーを表示します。

[root@test-vm-01 aks-store-demo]# docker ps
CONTAINER ID IMAGE
9988e532d8ca aks-store-demo-store-front 
cb52d50ef154 aks-store-demo-order-service
dc055dff4355 rabbitmq:3.13.2-management-alpine
874757342aca aks-store-demo-product-service

Webブラウザを使って、サンプルアプリを確認します。

アクセス確認
作業用の仮想マシン(http://仮想マシンのIPアドレス:8080)にアクセスして確認します。

AKSのサンプルアプリの動作確認画面例

ローカルDocker環境のアプリを停止

ローカルのDocker環境で動作しているサンプルアプリを停止します。

※コンテナーのイメージは削除しないようにします。

[root@test-vm-01 aks-store-demo]# docker compose down

—広告—

ACRからサンプルアプリのイメージを取得してAKS上で実行

Azure CLIでサインイン

az loginコマンドでAzureアカウントにサインインします。

[root@test-vm-01 aks-store-demo]# az login
To sign in, use a web browser to open the page https://microsoft.com/devicelogin and enter the code XXXXXXXXXX to authenticate.

Azure CLI バージョン 2.0.53 以降が必要となります。
Azure CLI バージョンを確認して、必要に応じてアップデートします。

[root@test-vm-01 aks-store-demo]# az –version
azure-cli 2.62.0

core 2.62.0
telemetry 1.1.0

Dependencies:
msal 1.28.1
azure-mgmt-resource 23.1.1

Python location '/usr/bin/python3.9’
Extensions directory '/root/.azure/cliextensions’

Python (Linux) 3.9.18 (main, Jul 3 2024, 00:00:00)
[GCC 11.4.1 20231218 (Red Hat 11.4.1-3)]

コンテナー イメージをACRにプッシュ

サンプルアプリのコンテナー イメージをビルドしてACRにプッシュします。
az acr repository listコマンドでACRのリポジトリのリストを一覧表示しています。

[root@test-vm-01 aks-store-demo]# ACRNAME="acr01″
[root@test-vm-01 aks-store-demo]# az acr build –registry $ACRNAME –image aks-store-demo/product-service:latest ./src/product-service/
[root@test-vm-01 aks-store-demo]# az acr build –registry $ACRNAME –image aks-store-demo/order-service:latest ./src/order-service/
[root@test-vm-01 aks-store-demo]# az acr build –registry $ACRNAME –image aks-store-demo/store-front:latest ./src/store-front/
[root@test-vm-01 aks-store-demo]# az acr repository list –name $ACRNAME –output table
Result
——————————
aks-store-demo/order-service
aks-store-demo/product-service
aks-store-demo/store-front

Azure Portalで確認してみます。

ACRのリポジトリを表示
左側のメニューでリポジトリを選択します。
3つ作成されている事が確認できます。

AKSクラスターの認証情報を取得

AKSクラスターの認証情報を取得します。
認証情報を取得する事により、kubectlコマンドを使用したAKSクラスター管理ができるようになります。

構成情報を取得および確認する

[root@test-vm-01 ~]# az aks get-credentials –resource-group rg-aks-01 –name aks-01
Merged “aks-01" as current context in /root/.kube/config

kubectlをインストール

kubectlを使うと、CLIでKubernetesクラスターを管理できます。
AKSのノード取得、リソースの適用、AKS上で実行されているPodの取得などに利用しています。

kubectl

[root@test-vm-01 ~]# az aks install-cli
[root@test-vm-01 ~]# kubectl get nodes
NAME STATUS ROLES AGE VERSION
aks-agentpool-xxxxxxxx-vmss000001 Ready <none> 136m v1.29.6

kubectl get nodes実行時のエラー例

作業端末でaksのリソースに対する名前解決ができない場合や、作業端末からAKSのリソースへアクセスできない場合にエラーが発生します。

名前解決できない場合には、AKSと共に作成されたプライベートDNSのゾーンが作業端末の仮想ネットワークとリンクされているかを確認します。
されていない場合はリンクさせます。

作業端末からAKSのリソースアクセスできなかった場合は、NSGの設定や仮想ネットワーク間のピアリングを確認します。
自分の場合は仮想ネットワークピアリングの設定が漏れていたために、エラーメッセージ例(2)が発生しました。

#エラーメッセージ例(1)(作業端末でaksのリソースに対する名前解決ができない場合)
Unable to connect to the server: dial tcp: lookup aks-01-dns-xxxxxxxx.xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx.privatelink.japaneast.azmk8s.io on 168.63.129.16:53: no such host
#エラーメッセージ例(2)(作業端末からaksのリソースへのアクセスができない場合)
couldn’t get current server API group list: Get “https://aks-01-dns-xxxxxxxx.xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx.privatelink.japaneast.azmk8s.io:443/api?timeout=32s"

※エラーメッセージや解決方法は1つの例です。
※AKSの設定でプライベートクラスターを利用しています。

ACRのログインサーバー名を取得

ACRのログインサーバ名(リソース名.azurecr.io)を確認します。
ACRからコンテナーのイメージを取得する際に使います。

[root@test-vm-01 ~]# az acr list –resource-group rg-aks-01 –query “[].{acrLoginServer:loginServer}" –output table
AcrLoginServer
—————————–
acr01.azurecr.io

マニフェストファイルの修正

マニュフェストファイルを修正します。
コンテナーイメージ取得先をACRログインサーバー名に置き換えます。

※sedコマンドで"ghcr.io/azure-samples"を"acr01.azurecr.io(ACRログインサーバー名)"に置換しています。

[root@test-vm-01 ~]# cd aks-store-demo
[root@test-vm-01 aks-store-demo]# ls -alh aks-store-quickstart.yaml
-rw-r–r–. 1 root root 6.3K 8月 3 13:10 aks-store-quickstart.yaml
[root@test-vm-01 aks-store-demo]# sed -i 's|ghcr.io/azure-samples|acr01.azurecr.io|g’ aks-store-quickstart.yaml

#マニュフェストファイルの修正箇所は3か所
– name: order-service

image: <acrName>.azurecr.io/aks-store-demo/order-service:latest

– name: product-service
image: <acrName>.azurecr.io/aks-store-demo/product-service:latest

– name: store-front
image: <acrName>.azurecr.io/aks-store-demo/store-front:latest

#変更点を確認
[root@test-vm-01 aks-store-demo]# diff aks-store-quickstart.yaml aks-store-quickstart.yaml.bak
92c92
< image: acr01.azurecr.io/aks-store-demo/order-service:latest

> image: ghcr.io/azure-samples/aks-store-demo/order-service:latest
179c179
< image: acr01.azurecr.io/aks-store-demo/product-service:latest

> image: ghcr.io/azure-samples/aks-store-demo/product-service:latest
238c238
< image: acr01.azurecr.io/aks-store-demo/store-front:latest

> image: ghcr.io/azure-samples/aks-store-demo/store-front:latest

※事前にコピーした編集前のファイル(aks-store-quickstart.yaml.bak)と、編集後のファイルを比較して変更内容を確認しています。

AKSにアプリケーションをデプロイ

kubectl applyコマンドを使用してサンプルアプリをデプロイします。
イメージファイルはACRから取得します。

kubectl apply

[root@test-vm-01 aks-store-demo]# kubectl apply -f aks-store-quickstart.yaml
statefulset.apps/rabbitmq created
configmap/rabbitmq-enabled-plugins created
service/rabbitmq created
deployment.apps/order-service created
service/order-service created
deployment.apps/product-service created
service/product-service created
deployment.apps/store-front created
service/store-front created

デプロイを確認

kubectl get podsコマンドでデプロイ状況を確認します。
STATUSが"Running"となっている事が確認できます。

リソースの検索と閲覧

[root@test-vm-01 ~]# kubectl get pods
NAME READY STATUS RESTARTS AGE
order-service-c94cfcfc6-rsspw 1/1 Running 0 9m54s
product-service-6668bdcc49-h77gk 1/1 Running 0 9m54s
rabbitmq-0 1/1 Running 0 9m47s
store-front-58cfd68f7b-9c475 1/1 Running 0 9m54s

kubectl apply実行後のエラー例

kubectl get podsで確認した時に、STATUSが"CrashLoopBackOff"になり、アプリが
自分の場合は、ARMベースの仮想マシン(スケールセット)を利用している場合に発生しました。
ノードプール作成時の仮想マシンサイズを変更、再作成してエラーを解消しました。

[root@test-vm-01 ~]# kubectl logs pod名
exec /docker-entrypoint.sh: exec format error

※エラーの発生事例や対応方法は1つの例です。
※作業用端末にはx86ベースの仮想マシンを利用しています。

フロントエンドIPアドレスの確認

kubectl get serviceコマンドでサービスの稼働状況を確認します。
稼働開始するとEXTERNAL-IPが表示されます。

リソースの検索と閲覧

[root@test-vm-01 ~]# kubectl get service store-front –watch
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
store-front LoadBalancer 10.0.138.241 203.0.113.1 80:30781/TCP 20m

ブラウザでアクセスして確認

確認したフロントエンドのIPアドレス(EXTERNAL-IP)にWebブラウザでアクセスします。

アクセス確認
サンプルアプリの画面が表示されます。 AKSのサンプルアプリの動作確認画面例

Azure PortalでもPodの稼働状況やサービスの状態が確認できる

Azure PortalでもPodの稼働状況やサービスの状態が確認できます。

ワークロード、サービスの状態を確認
ワークロードのメニューでPodの稼働状況が確認できます。
サービスとイングレスのメニューでサービスの状態が確認できます。
EXTERNAL-IPも確認できます。
サンプルアプリデプロイ後のポッド稼働状況
サンプルアプリデプロイ後のサービスの状態

 NSGやロードバランサーの設定を確認

サンプルアプリをデプロイした後には、NSGの受信セキュリティ規則が追加されています。
またロードバランサーのフロントエンドIP構成にパブリックIPのリソースが追加されています。
このパブリックIPアドレスがEXTERNAL-IPとなります。
InternetからEXTERNAL-IPへ80番ポートのアクセスを許可する受信のセキュリティ規則が追加されています。

NSGやロードバランサーの設定確認
受信セキュリティ規則が追加されています。 AKSのネットワークセキュリティグループ設定例
ロードバランサーのフロントエンドIP構成にパブリックIPアドレスが追加されています。 AKSのロードバランサーのフロントエンドIP構成

リソース削除

kubectl deleteコマンドでAKS上に作成したを削除します。
実行後にNSGの受信セキュリティ規則に作成されたアクセス許可設定は削除されます。
またAKSのリソースを削除すると関連リソースも併せて削除されます。

リソースの削除

[root@test-vm-01 ~]# kubectl delete -f aks-store-quickstart.yaml

—広告—

最後に

チュートリアルの手順を元にAKSやACRのリソース作成からアプリのデプロイまでの手順を確認してみました。
引き続き色々試してみたいと思います。

AKSに関するAzure PowerShell、Azure CLIコマンド一覧です。
クラスターやノードプールの起動、停止、状態確認、自動スケール無効化、ノード数の変更のコマンドを紹介しています。

スポンサーリンク