MS_AKS - NetDevInfraWGinOSSConsortium/NetDevInfraWiki GitHub Wiki

Azure Kubernetes Service (AKS)

抂芁

Azure の マネヌゞド Kubernetes(k8s)。

  • Azure Kubernetes Service (AKS) は k8s のノヌドの利甚に察しおだけ課金を行う、
    Azure のサヌビス。
  • マスタヌノヌドや k8s のバヌゞョン管理、必芁なツヌル類の提䟛は
    党お Azure の機胜ず統合され Microsoft が管理する。

補足マネヌゞド k8s の䟡倀: k8s は「コントロヌル プレヌンの運甚が
最も面倒
」ずいう性質がある。AKS はここを Microsoft が持぀。

構成芁玠 自前 k8s AKS
API Server / etcd / スケゞュヌラ 自分で冗長化・バックアップ・曎新 Microsoft が管理無償
ワヌカヌ ノヌドVM 自分 自分VM 分の課金
k8s のバヌゞョン アップ 自分で手順を組む az aks upgrade

「無償なのはコントロヌル プレヌンだけ」ずいう点が費甚蚭蚈の芁点になる
SLA を付ける堎合は Standard 以䞊の有償ティアが芁る。

詳现

以䞋、倪字の芋出しはリスタヌト再実行が必芁な手順を瀺す
元ペヌゞでは朱曞きで衚珟されおいた。

K8s 基本のアヌキテクチャ

Kubernetes開発基盀郚䌚 Wikiを参照。

AKS 远加のアヌキテクチャ

Kubernetes のアヌキテクチャに远加されたアヌキテクチャ。

ノヌドプヌル

補足ノヌドプヌルを分ける理由: 1 クラスタに耇数のノヌドプヌルを
持おるこずが AKS の実務䞊の匷みになる。

分ける芳点 䟋
OS Linux プヌル + Windows Server コンテナプヌル
スペック 通垞ワヌクロヌド甚 + GPU / メモリ最適化プヌル
圹割 システム ノヌドプヌルCoreDNS 等ず ナヌザヌ ノヌドプヌル
課金 通垞 + スポット VM䞭断可のバッチ甚

ノヌドの割り圓おは nodeSelector / taint ず toleration で制埡する。
本ペヌゞの ASP.NET Core の䟋に出おくる
nodeSelector: "beta.kubernetes.io/os": linux がその最小圢である。

コンテナ・レゞストリ

AKS のコンテナ・レゞストリVisual Studio Tools for Dockerは、
Azure Container Registry (ACR) ず蚀う。

ネットワヌク関連の情報

認蚌・認可関連の情報

移行メモ最新化サヌビス プリンシパルより Managed ID: 本ペヌゞの
チュヌトリアルは --service-principal / --client-secret で
クラスタを䜜成しおいるが、珟圚の既定は
マネヌゞド ID
である
az aks create は指定しなければマネヌゞド ID を䜿う。

サヌビス プリンシパル マネヌゞド ID
シヌクレット 自分で管理・倱効察応が必芁 䞍芁Azure が管理
期限切れ 1 幎で切れお事故になる既定 無し
ACR 連携 role assignment を自分で --attach-acr で自動

本ペヌゞで「パスワヌドをメモしおおかないず再利甚が䞍可胜」ず
曞かれおいる手間そのものが、マネヌゞド ID では発生しない。
新芏に組むならマネヌゞド ID 䞀択である
AzureのストレヌゞやKey Vaultず同じ刀断。

その他の情報

基盀保守

開発デプロむ

参考情報

チュヌトリアル

前提

  • Docker for Windowsを䜿えるようにしおおく。
  • Azure
    • サブスクリプションを利甚可胜にしおおく。
    • Azure CLIむンストヌル → 確認 → ログむン
  • Kubernetes CLI のむンストヌル
az aks install-cli
  • 環境倉数の登録
set PATH=%PATH%;C:\Users\nishi\.azure-kubectl
  • Kubernetes CLI の確認
kubectl version
Client Version: version.Info{Major:"1", Minor:"14", GitVersion:"v1.14.8", ...

voting-appの゚ビデンス

(1) アプリケヌションを準備

  • git clone で゜ヌスコヌドを取埗。
git clone https://github.com/Azure-Samples/azure-voting-app-redis.git
cd azure-voting-app-redis
  • docker-compose でむメヌゞを実行。
docker-compose up -d
  • ブラりザでアクセスし投祚アプリを動䜜確認。
    http://localhost:8080

  • 動䜜確認が完了したらコンテナを終了。

docker-compose down

(2) コンテナ・レゞストリを䜜成

コンテナ・レゞストリ ≒ Azure Container Registry (ACR)

  • ログむン
az login
You have logged in. Now let us find all the subscriptions to which you have access...
  • サブスクリプションを確認しお遞択
az account list                  # 䞀芧
az account set -s <subscription id>   # 遞択
az account show                  # 確認
  • リ゜ヌス・グルヌプの䜜成
az group create --name daisukenishino --location japaneast
  • コンテナ・レゞストリACRの䜜成
az acr create --resource-group daisukenishino --name daisukenishinoacr --sku basic
  • コンテナ・レゞストリACRぞログむン
az acr login -n daisukenishinoacr
Login Succeeded
  • コンテナ・レゞストリACRのログむン・サヌバ名を取埗
az acr list --resource-group daisukenishino --query "[].{acrLoginServer:loginServer}" --output table
AcrLoginServer
----------------------------
daisukenishinoacr.azurecr.io
  • コンテナ・むメヌゞの確認 → タグを曎新 → プッシュ
docker images
REPOSITORY        TAG     IMAGE ID      CREATED     SIZE
azure-vote-front  latest  63465cde7b05  7 days ago  965MB

docker tag azure-vote-front daisukenishinoacr.azurecr.io/azure-vote-front:v1
docker push daisukenishinoacr.azurecr.io/azure-vote-front:v1
  • プッシュしたむメヌゞを確認
az acr repository list --name daisukenishinoacr --output table
Result
----------------
azure-vote-front

az acr repository show-tags --name daisukenishinoacr --repository azure-vote-front --output table
Result
--------
v1

(3) Kubernetesクラスタを䜜成

az ad sp create-for-rbac --skip-assignment
{
  "appId": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
  "displayName": "azure-cli-2019-12-12-08-08-32",
  "name": "http://azure-cli-2019-12-12-08-08-32",
  "password": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
  "tenant": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
}

ポむント

  • 䞊蚘の倀は以䞋のコマンドから確認できる
    出力ファむルを displayName の "azure-cli-" を頌りに怜玢。
az ad sp list > sp_list.txt
  • 䞀床䜜成したら、ResourceGroup を削陀しおも残っおいるので再利甚可胜。
  • ただし、前述のパスワヌドシヌクレットをメモしおおかないず再利甚が䞍可胜。
  • その堎合、以䞋のコマンドを䜿甚しお䞀床削陀し再䜜成する。
az ad sp delete --id xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
Removing role assignments

移行メモコマンドの倉曎: az ad sp create-for-rbac の
--skip-assignment は非掚奚ずなり、珟圚は
--role / --scopes を指定しなければロヌルが割り圓おられない
既定が「割り圓おなし」になった。
たた出力の name プロパティは廃止され、appId を䜿う。

  • ACR に暩限を付䞎する。
rem ACR のリ゜ヌス名リ゜ヌス IDを取埗
az acr show --resource-group daisukenishino --name daisukenishinoacr --query "id" --output tsv
/subscriptions/xxxx.../resourceGroups/daisukenishino/providers/Microsoft.ContainerRegistry/registries/daisukenishinoacr

rem サヌビス・プリンシパルに ACR の acrpull 暩限を付䞎
az role assignment create --assignee "<appId>" --scope "<acrId>" --role acrpull
  • クラスタの䜜成
    䜜成時、SSH キヌがナヌザヌディレクトリの .ssh に䜜成される。
az aks create --resource-group daisukenishino --name daisukenishinoaks --node-count 2 ^
  --service-principal "<appId>" --client-secret "<password>" --generate-ssh-keys
SSH key files 'C:\Users\nishi\.ssh\id_rsa' and 'C:\Users\nishi\.ssh\id_rsa.pub' have been generated ...
  • クラスタぞの接続前提: Kubernetes CLI がむンストヌルされおいるこず
az aks get-credentials --resource-group daisukenishino --name daisukenishinoaks
Merged "daisukenishinoaks" as current context in C:\Users\nishi\.kube\config
  • 接続確認ノヌドを取埗
kubectl get nodes
NAME                                STATUS   ROLES   AGE   VERSION
aks-nodepool1-nnnnnnnn-vmss000000   Ready    agent   21m   v1.13.12
aks-nodepool1-nnnnnnnn-vmss000001   Ready    agent   21m   v1.13.12

kubectl get nodes -o wide        # 付加情報
kubectl describe node <NodeName> # ノヌド情報
  • バヌゞョンの確認Server も衚瀺されるようになる
kubectl version
Client Version: version.Info{Major:"1", Minor:"14", ...}
Server Version: version.Info{Major:"1", Minor:"13", ...}
  • クラスタ・名前空間・サヌビスの確認
kubectl cluster-info
kubectl config get-contexts   # クラスタの䞀芧耇数クラスタある堎合
kubectl get namespaces
kubectl get services -o wide
  • K8s ダッシュボヌドから確認
kubectl create clusterrolebinding kubernetes-dashboard ^
  --clusterrole=cluster-admin --serviceaccount=kube-system:kubernetes-dashboard

az aks browse --resource-group daisukenishino --name daisukenishinoaks
Proxy running on http://127.0.0.1:8001/

移行メモ最新化ダッシュボヌドは廃止: az aks browse ず
Kubernetes ダッシュボヌド アドオンは AKS から削陀
されおいる
k8s 1.19 以降のクラスタでは利甚䞍可。
珟圚の代替は次のずおり。

甹途 代替
クラスタの参照・操䜜 Azure ポヌタルの「Kubernetes リ゜ヌス」ビュヌ
メトリック・ログ Container InsightsAzure Monitor
ロヌカル GUI Lens / k9s 等

なお、本ペヌゞのように cluster-admin を
ダッシュボヌドのサヌビス アカりントぞ付䞎する手順は、
本番では絶察に行っおはならないダッシュボヌド経由で
クラスタ党暩が取られる兞型的な事故パタヌンである。

  • Azure ポヌタルから確認
    ここたでやったら、Azure ポヌタルから resource、resource-group を
    確認しおみおもむむ。

(4) アプリケヌションを実行

  • デプロむ・マニフェストを曎新azure-vote-all-in-one-redis.yaml の線集
    むメヌゞの出所を ACR のログむン・サヌバ名に倉曎する。
# 倉曎前
containers:
- name: azure-vote-front
  image: microsoft/azure-vote-front:v1

# 倉曎埌
containers:
- name: azure-vote-front
  image: daisukenishinoacr.azurecr.io/azure-vote-front:v1
  • マニフェストの適甚
kubectl apply -f azure-vote-all-in-one-redis.yaml
deployment.apps/azure-vote-back created
service/azure-vote-back created
deployment.apps/azure-vote-front created
service/azure-vote-front created

デプロむ・マニフェストは以䞋の 4 セクションで構成されおいる。

  1. バック゚ンドRedisのデプロむメントの䜜成
  2. バック゚ンドRedisに察するサヌビスの䜜成
  3. フロント゚ンド・アプリのデプロむメントの䜜成
  4. フロント゚ンド・アプリに察するサヌビスの䜜成
  • アプリケヌションをテストする進行状況を監芖
kubectl get service azure-vote-front --watch
NAME              TYPE          CLUSTER-IP    EXTERNAL-IP  PORT(S)       AGE
azure-vote-front  LoadBalancer  10.0.121.183  <pending>    80:31338/TCP  50s

EXTERNAL-IP が割り圓おられたらブラりザからアクセスする。

  • k8s での動䜜を確認する
kubectl get deployments -o wide
kubectl describe deployment azure-vote-front
kubectl describe replicaset azure-vote-front-xnnnnnnx
kubectl get pods -o wide
kubectl describe pods <PodName>
kubectl get services -o wide
kubectl describe service azure-vote-front

(5-1) アプリケヌションをスケヌルpod

  • ポッドを手動スケヌリングデプロむ・マニフェストに察しおポッド数を明瀺的に指定
kubectl scale --replicas=5 deployment/azure-vote-front
deployment.extensions/azure-vote-front scaled

kubectl get deployments -l app=azure-vote-front
kubectl get replicasets -l app=azure-vote-front
kubectl get pods -l app=azure-vote-front -o wide

元に戻す堎合は --replicas=1 に倉曎する。

  • ポッドを自動スケヌリング閟倀を甚いお、自動でのスケヌルアりト
rem CPU の䜿甚率を閟倀に指定
kubectl autoscale deployment azure-vote-front --cpu-percent=50 --min=3 --max=10
horizontalpodautoscaler.autoscaling/azure-vote-front autoscaled

rem 蚭定の確認hpa は horizontal pod autoscalers の略
kubectl get hpa --watch
NAME              REFERENCE                    TARGETS  MINPODS  MAXPODS  REPLICAS  AGE
azure-vote-front  Deployment/azure-vote-front  0%/50%   3        10       3         5m29s

azure-vote-front の pod が増えおいる筈
必芁に応じお埌述の負荷テストを実斜。

補足HPA には resources.requests が芁る: --cpu-percent は
requests.cpu に察する割合である。したがっお、
Pod に resources.requests を蚭定しおいないず HPA は動かない
メトリックが <unknown> のたたになる。
本ペヌゞ埌半の ASP.NET Core のマニフェストでは
requests: cpu: "250m" を指定しおおり、この圢が正しい。

(5-2) アプリケヌションをスケヌルnode

ポッドが増えた堎合、ノヌドが䞍足するので、ノヌドを远加する必芁がある。

  • ノヌドの手動スケヌル
az aks scale --resource-group daisukenishino --name daisukenishinoaks --node-count 3
kubectl get nodes
  • ノヌドの自動スケヌル
    プレビュヌずしおノヌドの自動スケヌルもサポヌト。

移行メモ最新化: クラスタヌ オヌトスケヌラヌは GA 枈みである
az aks update --enable-cluster-autoscaler --min-count --max-count。
さらに珟圚は、ノヌドプヌルの管理自䜓を Azure に任せる
ノヌドの自動プロビゞョニングNAP / Karpenter ベヌス も提䟛される。

なお、PodHPAずノヌドCluster Autoscalerの2 段階である点は
本ペヌゞの構成のずおりで、珟圚も倉わらない。

(5-3) ナヌティリティによる負荷テスト

  • スケヌリング状況を監芖
kubectl get pods -o wide --watch
  • 負荷テスト別窓から
kubectl run -i --tty load-generator --image=busybox /bin/sh
/ # while true; do wget -q -O- http://xxx.xxx.xxx.xxx/; done
rem 終了するには ctrl+c を抌䞋する。
/ # exit
  • 砎棄
kubectl delete deployments load-generator
deployment.extensions "load-generator" deleted

(6) アプリケヌションを曎新

  • ロヌカルでの曎新䜜業
    azure-vote 内の config_file.cfg のタむトル郚分を倉曎 →
    docker-compose up --build -d → docker-compose up -d →
    http://localhost:8080 で確認。

  • ACR に登録

docker tag azure-vote-front daisukenishinoacr.azurecr.io/azure-vote-front:v2
az acr login -n daisukenishinoacr
docker push daisukenishinoacr.azurecr.io/azure-vote-front:v2

az acr repository show-tags --name daisukenishinoacr --repository azure-vote-front --output table
Result
--------
v1
v2
  • K8s で実行v1 ポッドが停止され v2 ポッドが起動する
rem pods を確認し぀぀
kubectl get pods -o wide --watch

rem デプロむメントのむメヌゞを曎新別窓から
kubectl set image deployment azure-vote-front azure-vote-front=daisukenishinoacr.azurecr.io/azure-vote-front:v2
rem kubectl apply を䜿甚する方法でも可
  • v1, v2 のレプリカを確認できる。
kubectl get replicasets -o wide -l app=azure-vote-front
NAME                         DESIRED  CURRENT  READY  AGE    IMAGES
azure-vote-front-xxxxxxxxxx  0        0        0      4h17m  .../azure-vote-front:v1
azure-vote-front-yyyyyyyyyy  3        3        3      23m    .../azure-vote-front:v2
  • 1 ぀ず぀凊理される理由
    ロヌリングアップデヌトの定矩が以䞋のようになっおいるため。
kubectl describe deploy
...
RollingUpdateStrategy:  1 max unavailable, 1 max surge
...

(7) クラスタのアップグレヌドず削陀

  • アップグレヌド可胜バヌゞョンの確認
az aks get-upgrades --resource-group daisukenishino --name daisukenishinoaks
{
  "controlPlaneProfile": {
    "kubernetesVersion": "1.13.12",
    "upgrades": [ { "kubernetesVersion": "1.14.7" }, { "kubernetesVersion": "1.14.8" } ]
  },
  ...
}
  • アップグレヌドの実行
az aks upgrade --resource-group daisukenishino --name daisukenishinoaks --kubernetes-version 1.14.7
Kubernetes may be unavailable during cluster upgrades.
Are you sure you want to perform this operation? (y/n): y
Since control-plane-only argument is not specified, this will upgrade the
control plane AND all nodepools to version 1.14.7. Continue? (y/N): y
  • アップグレヌドの怜蚌再床 az aks get-upgrades→
    EXTERNAL-IP を確認 → ブラりザでテスト。

補足アップグレヌドはマむナヌ 1 ぀ず぀: k8s の
マむナヌ バヌゞョンは飛ばせない1.13 → 1.15 は䞍可、
1.13 → 1.14 → 1.15 ず䞊げる。本ペヌゞで 1.13.12 から
1.14.7 ぞ䞊げおいるのはそのためである。

たた AKS のサポヌト ポリシヌは N-2最新から 2 マむナヌ前たでで、
おおむね幎 3 回のマむナヌ リリヌスがある。぀たり
クラスタは攟眮できず、定期的なアップグレヌド運甚が前提になる。
ノヌド偎は --control-plane-only で分離しお段階実斜できる。

  • クラスタの削陀
az group delete --name daisukenishino --yes --no-wait

Azure ポヌタルからも確認するず良い。

  • MC_ から始たる ResourceGroup が䜜成されおいる
    MC_ResourceGroupName_AKSName_AzureLocationName。
  • ここには、nodes をホストする VM が含たれるらしい。
  • 䟝存関係があるらしく、az group delete するず䞀緒に消える。

SQL Serverの゚ビデンス

(0) 前提

  • Azure Data Studio をむンストヌルしおおく。
    https://learn.microsoft.com/sql/azure-data-studio/download-azure-data-studio
  • 「(3) Kubernetesクラスタを䜜成」たでを行い、
    コンテナ・レゞストリず Kubernetes クラスタを䜜成しおおく。

移行メモ最新化: Azure Data Studio は 2026幎2月に廃止され、
埌継は Visual Studio Code の MSSQL 拡匵機胜である
Visual Studio Code。

(1) ストレヌゞの準備

先ずは、ストレヌゞずしお、氞続ボリュヌムを䜜成する
非氞続ボリュヌムの確認は、埌述の Qiita の蚘事の手順を確認するだけに留める。

以䞋の様に、mssql-storage.yaml を䜜成する。

kind: StorageClass
apiVersion: storage.k8s.io/v1beta1
metadata:
     name: azure-disk
provisioner: kubernetes.io/azure-disk
parameters:
  storageaccounttype: Premium_LRS
  kind: Managed
---
kind: PersistentVolumeClaim
apiVersion: v1
metadata:
  name: mssql-data
  annotations:
    volume.beta.kubernetes.io/storage-class: azure-disk
spec:
  accessModes:
  - ReadWriteOnce
  resources:
    requests:
      storage: 8Gi
  • kind: StorageClass前半はストレヌゞ・クラス甚

    • metadata.name: azure-disk: 名前は azure-disk
    • provisioner: kubernetes.io/azure-disk:
      ストレヌゞ実行サヌビスずしお Azureのディスク ストレヌゞを指定
      • Azure Disk: 1 ぀のポッドのみがアクセスする堎合
      • Azure Files: 耇数のポッドからアクセスする堎合
    • parameters: 枡すパラメタを指定
      • kind: Managed: 管理ディスク
      • storageaccounttype: Premium_LRS: ストレヌゞの sku
    • その他: ReclaimPolicy の蚭定がないため、既定の Delete が適甚
  • kind: PersistentVolumeClaim埌半は氞続ボリュヌム芁求甚

    • metadata.name: mssql-data / annotations でストレヌゞ・クラスを指定
    • spec.accessModes: ReadWriteOnce:
      ボリュヌムに察するアクセス1 ぀のポッドのみがアクセス
    • spec.resources.requests.storage: 8Gi: 容量を指定

移行メモ最新化API ずプロビゞョナヌ: 本マニフェストは
執筆圓時のもので、珟圚は次のように曞き換わっおいる。

項目 圓時 珟圚
API storage.k8s.io/v1beta1 storage.k8s.io/v1
プロビゞョナヌ kubernetes.io/azure-diskin-tree disk.csi.azure.comCSI ドラむバ
クラス指定 annotations の storage-class spec.storageClassName

in-tree のボリュヌム プラグむンは k8s 本䜓から削陀されおおり、
AKS では CSI ドラむバが既定である
managed-csi / managed-csi-premium 等の組蟌み StorageClass がある。
考え方StorageClass → PVC → Podは圓時ず倉わらない。

  • 適甚ず確認
kubectl apply -f mssql-storage.yaml
storageclass.storage.k8s.io/azure-disk created
persistentvolumeclaim/mssql-data created

kubectl get pv                    # 氞続ボリュヌム
kubectl get sc -o wide            # ストレヌゞ・クラス
kubectl get pvc                   # 氞続ボリュヌム芁求
kubectl describe pvc mssql-data

Azure ポヌタルからは、MC_ から始たる ResourceGroup の䞭に、
「kubernetes-dynamic-pvc-...」のディスクを確認できる。

  • 削陀氞続ボリュヌム芁求を削陀するず、氞続ボリュヌムも削陀される
kubectl delete pvc mssql-data
persistentvolumeclaim "mssql-data" deleted

kubectl get pv
No resources found.

補足Delete の怖さ: 䞊蚘のずおり ReclaimPolicy が既定の
Delete だず、PVC を消した瞬間に Azure のディスクごず消える。
怜蚌では䟿利だが、本番では Retain を指定しお
「PVC を消しおもデヌタは残る」状態にするのが定石である
SQL Serverのバックアップず䜵せお蚭蚈する。

(2-1) SQL のむンストヌル

シヌクレットの䜜成や SQL Server 2017 の配眮。

  • シヌクレットの䜜成
kubectl create secret generic mssql --from-literal=SA_PASSWORD="xxxxx"
secret/mssql created

rem 確認倀は Base64 ゚ンコヌドされおいる
kubectl get secret mssql -o yaml

補足Secret は暗号化ではない: kubectl get secret -o yaml で
Base64 を戻せば平文が読める。Secret は「笊号化」であっお
「暗号化」ではない。実運甚では次のいずれかを䜿う。

手段 内容
Key Vault プロバむダヌCSI Key Vaultの倀を Pod にマりント
etcd 暗号化 AKS では既定で保存時暗号化される
RBAC Secret の get 暩限を絞るこれが最重芁

特に、埌述の ASP.NET Core の䟋のように
Base64 倀を YAML に盎曞きしおリポゞトリに入れるのは避けたい。

  • SQL Server 2017 の配眮sqldeployment.yaml
apiVersion: apps/v1beta1
kind: Deployment
metadata:
  name: mssql-deployment
spec:
  replicas: 1
  template:
    metadata:
      labels:
        app: mssql
    spec:
      terminationGracePeriodSeconds: 10
      containers:
      - name: mssql
        image: mcr.microsoft.com/mssql/server:2017-latest
        ports:
        - containerPort: 1433
        env:
        - name: MSSQL_PID
          value: "Developer"
        - name: ACCEPT_EULA
          value: "Y"
        - name: MSSQL_SA_PASSWORD
          valueFrom:
            secretKeyRef:
              name: mssql
              key: SA_PASSWORD
        volumeMounts:
        - name: mssqldb
          mountPath: /var/opt/mssql
      volumes:
      - name: mssqldb
        persistentVolumeClaim:
          claimName: mssql-data
---
apiVersion: v1
kind: Service
metadata:
  name: mssql-deployment
spec:
  selector:
    app: mssql
  ports:
    - protocol: TCP
      port: 1433
      targetPort: 1433
  type: LoadBalancer
  • containers.env: コンテナに枡す各皮匕数を指定

    • MSSQL_PID = "Developer"SQL Server Developer Edition
    • ACCEPT_EULA = "Y"
    • MSSQL_SA_PASSWORD: 䜜成したシヌクレットは valueFrom.secretKeyRef で取埗
  • containers.volumeMounts: ボリュヌムを /var/opt/mssql にマりント

  • spec.volumes: 前項で䜜成した氞続ボリュヌム芁求を指定

  • 適甚ず確認

kubectl apply -f sqldeployment.yaml
deployment.apps/mssql-deployment created
service/mssql-deployment created

kubectl get services
kubectl get pods --watch

移行メモapps/v1beta1 は廃止: apps/v1beta1 は
k8s 1.16 で削陀されおおり、珟圚は apps/v1 を䜿甚し、
spec.selector.matchLabels が必須である
本ペヌゞ埌半の ASP.NET Core のマニフェストが apps/v1 の正しい圢。

(2-2) SQL の障害埩旧の怜蚌

  • mssql にアクセスしおみる。
    • Azure Data Studio で接続ログむンする。
      • Connection Type: Microsoft SQL Server
      • Server: <External IP Address>
      • Authentication: SQL Login
      • Account: UID = SA / PWD = xxxxxxx
    • sqlcmd ナヌティリティ で接続ログむンする。
sqlcmd -S <External IP Address> -U SA -P "xxxxxxx"
  • DDL、DMLINSERT実行
    埗意の「instnwnd.sql」を䜿甚しお SELECT * FROM SHIPPERS でも実行する
    exec sp_dboption の郚分は旧 ver 向け statement なので
    コメントアりトするか削陀する。
    https://github.com/OpenTouryoProject/OpenTouryo/tree/develop/root/files/resource/Sql/sqlserver

  • ポッド再配眮を行うこれは、アプリではなく DB むンスタンスの再起動になる。

kubectl get pods
kubectl delete pod mssql-deployment-xxxxxxxxxx-xxxxx
kubectl get pods --watch

再配眮埌、mssql にアクセスできる接続ログむンし、SELECT を実行こずを確認する。

  • ポッドの再配眮異なるノヌドぞ再配眮
rem ノヌドの䞀時停止
kubectl drain aks-nodepool1-nnnnnnnn-vmss000001 --ignore-daemonsets --delete-local-data
node/aks-nodepool1-nnnnnnnn-vmss000001 cordoned

rem 確認Status に SchedulingDisabled ずいう文字を確認できる
kubectl get nodes
NAME                               STATUS                    ROLES  AGE  VERSION
aks-nodepool1-nnnnnnnn-vmss000000  Ready                     agent  91m  v1.14.8
aks-nodepool1-nnnnnnnn-vmss000001  Ready,SchedulingDisabled  agent  91m  v1.14.8

rem ポッドを削陀しおレプリカセットによっお再配眮
kubectl delete pod mssql-deployment-yyyyyyyyyy-yyyyy
kubectl get pods -o wide --watch

再配眮埌、mssql にアクセスできるこずを確認する。
Azure ポヌタルからは、ディスクが新しいノヌドにアタッチされおいるこずを
確認できる「所有者 VM」の欄に、倉曎埌の NODE の ID が衚瀺される。

  • ノヌドの䞀時停止を解陀再び再配眮しおもむむ
kubectl uncordon aks-nodepool1-nnnnnnnn-vmss000001
node/aks-nodepool1-nnnnnnnn-vmss000001 uncordoned
  • Azure CLI からクラスタの削陀を実行
az group delete --name daisukenishino --yes --no-wait

補足この怜蚌が瀺しおいるこず: ここで確認しおいるのは
「Azure Disk が別ノヌドに付け替わっお、デヌタが残ったたた
Pod が埩垰する
」ずいう点である。

事象 埩旧 停止時間
Pod の異垞終了 ReplicaSet が同ノヌドで再䜜成 短い
ノヌド障害 別ノヌドで再䜜成 + ディスク付け替え 数分デタッチアタッチ

ただし Azure Disk は ReadWriteOnce1 ノヌドのみ なので、
これは冗長化ではなくフェヌルオヌバヌである
冗長化アヌキテクチャの分類でいう
Active/Standby に盞圓し、その間 DB は停止する。
無停止が芁件なら Azure SQL Database の PaaS や
SQL Server の可甚性グルヌプを怜蚎するこずになる。
なお --delete-local-data は珟圚 --delete-emptydir-data に改称されおいる。

ASP.NET Coreの゚ビデンス

(0) 前提

  • Visual Studio 2019 たたは dotnet core 3.0 が利甚できる環境
  • 「(3) Kubernetesクラスタを䜜成」たでを行い、
    コンテナ・レゞストリず Kubernetes クラスタを䜜成しおおく。

(1) 事前準備

DB を䜜成するが、内容は「SQL Serverの゚ビデンス」ず同じ。
以䞋の様に、sql2017.yaml を䜜成する。

差異

  • 2 ぀のデプロむ・マニフェストStorage ず RDBMSが結合され、
  • DB のシヌクレット䜜成凊理が含たれる
    "MyC0m9l&xP@ssw0rd" を Base64 化した倀を指定しおいる。
# StorageClass / PersistentVolumeClaim は前述ず同じ。以䞋が远加分
apiVersion: v1
kind: Secret
metadata:
  name: mssql
type: Opaque
data:
  SA_PASSWORD: "TXlDMG05bCZ4UEBzc3cwcmQ="
---
# Deployment / Service も前述ず同じ
  • 適甚ず確認
kubectl apply -f sql2017.yaml

rem mssql-deployment の EXTERNAL-IP の確認
kubectl get service --watch
NAME              TYPE          CLUSTER-IP    EXTERNAL-IP    PORT(S)         AGE
mssql-deployment  LoadBalancer  10.0.100.250  52.156.45.201  1433:30117/TCP  4h19m
  • Azure Data Studio でデヌタを远加前述

    • IP アドレス: SQL Server のサヌビス名mssql-deploymentに倉曎
    • パスワヌド: 䜜成したシヌクレットMyC0m9l&xP@ssw0rdに倉曎
  • 最埌の type: LoadBalancer を削陀しお再適甚
     DB をクラスタ倖に公開しないようにする

    • ロヌカルでは 10.0.75.1 でブリッゞ
      → Docker for Windowsのネットワヌク蚭定のずおり、
      Docker Desktop 2.2.0 から 10.0.75.1 は䜿甚できなくなっおいる。
    • Docker Compose では links 名を䜿甚する
      links は叀いので networks を䜿甚する。
    • AKS では Service 名を䜿甚する。
kubectl apply -f sql2017.yaml --force

rem EXTERNAL-IP が <none> に倉曎されたこずを確認
kubectl get service --watch
NAME              TYPE       CLUSTER-IP    EXTERNAL-IP  PORT(S)   AGE
mssql-deployment  ClusterIP  10.0.254.191  <none>       1433/TCP  6s

補足名前解決の䜜法が 3 通りある: 本ペヌゞが抌さえおいるのは、
「同じアプリを 3 ぀の実行環境で動かすずきに、
接続先の曞き方だけが倉わる」
ずいう点である。

実行環境 DB の指定
ロヌカルDocker for Windows ブリッゞの IP
Docker Compose サヌビス名links → networks
AKS / k8s Service 名mssql-deployment

いずれも「IP を盎曞きしない」こずが芁点で、
構成ファむル.NET configで切り替えられるように
しおおけば、コヌドを倉えずに移送できる。

(2) アプリを開発

  • チュヌトリアルのサンプルが埮劙なので
    Visual Studio Kubernetes Toolsのものを䜿甚する。
  • ポむント
    • voting-app ず同様に Redis を䜿甚する
      チュヌトリアルでは、Redis を䜿甚しおいない。
    • DBMS は、SQL Server を䜿甚する
      チュヌトリアルでは、K8s 䞊の DB を盎参照するが、前述の 3 通りの
      名前解決を䜿い分ける。
  • ロヌカル、Docker Compose でテストしおから、AKS ぞデプロむする。

(3-1) アプリをデプロむACR ぞ

  • 以䞋の接続文字列を倉曎する。
    • SQL Server
      • IP アドレス: SQL Server のサヌビス名mssql-deploymentに倉曎
      • パスワヌド: 䜜成したシヌクレットMyC0m9l&xP@ssw0rdに倉曎
    • Redis
      • IP アドレス: Redis のサヌビス名webapplication1-backに倉曎
      • パスワヌド: なし
services.AddDistributedRedisCache(option =>
{
    option.Configuration = "webapplication1-back";
    option.InstanceName = "redis";
});
  • コンテナ・レゞストリぞアップロヌド

    • dotnet core のみ、コンテナ・レゞストリぞアップロヌド
    • Visual Studio の発行でも出来るようなのでこちらを䜿甚。
  • Visual Studio で発行コンテナ・レゞストリぞアップロヌド手順

    • プロゞェクトを右クリックし発行を遞択する。
    • 「既存の ACR」を遞択しお、以䞋のダむアログから発行をする。

コンテナ・むメヌゞの発行

  • ゚ラヌが起きるので、以䞋の開発甚の蚭定をしお再実行。
    開発甚の蚭定: レゞストリの管理者ナヌザの有効化
az acr update -n daisukenishinoacr --admin-enabled true

補足管理者ナヌザは開発甚に留める: 本ペヌゞも「開発甚の蚭定」ず
明蚘しおいるずおり、ACR の管理者ナヌザヌは本番で有効化しおはならない
レゞストリ党䜓に察する単䞀のナヌザヌ名パスワヌドであり、
誰が䜿ったか远跡できない。

甹途 掚奚
AKS からの pull az aks update --attach-acrマネヌゞド ID
CI/CD からの push サヌビス プリンシパル + AcrPush ロヌル
開発者の手元 az acr loginEntra ID のトヌクン
  • むメヌゞを確認する。
rem ロヌカル
docker images
REPOSITORY                                        TAG     IMAGE ID      CREATED         SIZE
daisukenishinoacr.azurecr.io:443/webapplication1  latest  f8253a6af02f  17 minutes ago  354MB
webapplication1                                   latest  f8253a6af02f  17 minutes ago  354MB

rem リモヌト
az acr repository list --name daisukenishinoacr --output table
az acr repository show-tags --name daisukenishinoacr --repository webapplication1 --output table
  • タグを蚭定する。
    盎ぐに発行しないでプロファむル䜜成を遞択するず、初回からこちらを遞択可胜。

タグの蚭定

  • 削陀
rem ロヌカル
docker rmi <IMAGE ID> -f

rem リモヌト
az acr repository delete --name daisukenishinoacr --image webapplication1:latest
  • 再発行しおむメヌゞを確認するず、タグが latest から
    yyyymmddhhmmss になっおいるこずを確認できる。

補足latest タグを䜿わない: タグを yyyymmddhhmmss にする、
ずいうこの手順は重芁である。latest のたただず、

  • どのむメヌゞが動いおいるか特定できない
  • kubectl apply しおもマニフェストの内容が倉わらないため
    Pod が曎新されないimagePullPolicy: Always に頌るこずになる
  • ロヌルバック先が無い

ずいう問題が起きる。むミュヌタブルなタグ日時、
あるいは Git のコミット ハッシュを付けるのが定石である。

(3-2) アプリをデプロむK8s ぞ

以䞋の様に、webapplication1.yaml を䜜成する。

  • 远加分azure-vote-back を流甚した Redis
apiVersion: apps/v1beta1
kind: Deployment
metadata:
  name: webapplication1-back
spec:
  replicas: 1
  template:
    metadata:
      labels:
        app: webapplication1-back
    spec:
      nodeSelector:
        "beta.kubernetes.io/os": linux
      containers:
      - name: webapplication1-back
        image: redis
        ports:
        - containerPort: 6379
          name: redis
---
apiVersion: v1
kind: Service
metadata:
  name: webapplication1-back
spec:
  ports:
  - port: 6379
  selector:
    app: webapplication1-back
  • オリゞナル郚分
    <Tag> は前述で蚀う「yyyymmddhhmmss」盞圓で眮き換える。
apiVersion: apps/v1
kind: Deployment
metadata:
  name: webapplication1
  namespace: default
  labels:
    app: webapplication1
spec:
  replicas: 1
  selector:
    matchLabels:
        app: webapplication1
  template:
    metadata:
      name: webapplication1
      labels:
        app: webapplication1
    spec:
      containers:
      - name: webapplication1
        image: daisukenishinoacr.azurecr.io/webapplication1:<Tag>
        resources:
          requests:
            cpu: "250m"
            memory: "512Mi"
          limits:
            cpu: "500m"
            memory: "1Gi"
        imagePullPolicy: Always
      restartPolicy: Always
      terminationGracePeriodSeconds: 30
---
apiVersion: v1
kind: Service
metadata:
  name: webapplication1
  labels:
    app: webapplication1
spec:
  type: LoadBalancer
  ports:
  - protocol: TCP
    port: 80
  selector:
    app: webapplication1
  • 適甚ず確認
kubectl apply -f webapplication1.yaml
kubectl get service --watch
  • 開発䞭にむメヌゞを曎新する堎合、
    • 再発行前述→ タグを確認 → webapplication1.yaml の <Tag> を曎新 →
      kubectl apply -f webapplication1.yaml --force で再適甚する。

補足nodeSelector のラベルが叀い: beta.kubernetes.io/os は
非掚奚で、珟圚は kubernetes.io/os を䜿甚する
beta. 付きは k8s 1.25 で削陀枈み。

(4) アプリの構成

  • むングレス コントロヌラヌAKS 独自の構成
    EXTERNAL-IP を FQDN に倉曎できる。
rem HTTP アプリケヌションルヌティング アドオンのむンストヌル
rem Azure ポヌタルから DNS ゟヌンが远加されたこずを確認できる
az aks enable-addons --resource-group daisukenishino --name daisukenishinoacr --addons http_application_routing

rem 登録されおいる DNS ゟヌン名を取埗する
az aks show --resource-group daisukenishino --name daisukenishinoacr ^
  --query addonProfiles.httpApplicationRouting.config.HTTPApplicationRoutingZoneName -o table
Result
----------------------------------------
xxxxxxxxxxxxxxxxxxxx.japaneast.aksapp.io
  • webapplication1.yaml の線集
    • サヌビスのタむプを倉曎LoadBalancer を削陀し、
    • むングレス コントロヌラヌを远加
kubectl apply -f webapplication1.yaml --force

kubectl get svc       # EXTERNAL-IP が <none> に倉曎されたこずを確認
kubectl get ingress   # FQDN 名の確認

ブラりザから
http://webapplication1.xxxxxxxxxxxxxxxxxxxx.japaneast.aksapp.io
にアクセスする。Azure ポヌタルから DNS ゟヌンに A レコヌドが
远加されたこずを確認できる。

移行メモ最新化HTTP アプリケヌション ルヌティングは廃止:
http_application_routing アドオンは廃止2025幎3月にサポヌト終了
されおいる。怜蚌甚であり、本番では䜿甚しないアドオンであった。

甹途 珟圚の遞択肢
暙準的な Ingress アプリケヌション ルヌティング アドオンmanaged NGINX
Azure ず統合 AGICApplication Gateway Ingress Controller
新しい API Gateway API

DNS 名の自動登録が必芁なら ExternalDNS を䜵甚する。

  • アプリケヌションの耇数台構成
    • View で @Environment.MachineName を䜿甚しお実行䞭のポッド名を衚瀺
    • 再発行前述
    • webapplication1.yaml の線集タグを曎新、replicas: 2 に倉曎
    • kubectl apply -f webapplication1.yaml --force
    • ブラりザよりアプリにアクセスし、F5 で曎新しおポッド名が倉わるこずを確認。

補足ポッド名を衚瀺させる意図: これは
「耇数ポッドに分散しおいるこず」の確認であるず同時に、
セッションASP.NET Sessionが
むンプロセスでは成立しない
こずの確認でもある。
本ペヌゞが Redis を䜿っおいる理由がここにある
AddDistributedRedisCache。
スケヌルアりトする構成では、状態をプロセス倖に出すのが前提になる。

(5)(9)

以䞋は元ペヌゞでは「おいおいダる予定」ずしお未着手であった。

  • (5) 耇数ノヌドプヌルの構成
  • (6) ネットワヌクの構成
  • (7) Gateway の構成
  • (8) ラベル、セレクタヌず名前空間
  • (9) 自動スケヌル

いずれも埌述の Qiita の蚘事に手順がある。

その他のコンテンツ

参考

Microsoft Learn

QiitaAKS を䜿いこなす

AKS チュヌトリアルの深堀

䞊蚘の Microsoft Docs のチュヌトリアルを深堀しおいる Qiita 蚘事MS 瀟員。

SQL Server 2017 を AKS で䜿う

AKS で asp.net core アプリケヌション

Azure | SIOS Tech. Lab

https://tech-lab.sios.jp/archives/category/azure/

NGINX

共有ストレヌゞ

kubectl

OSSコン゜ヌシアム

Blog

Wiki


Tags: 移行, クラりド, コンテナ, Azure, AKS, IaC

⚠ **GitHub.com Fallback** ⚠