マイクロソフト系技術情報 Wiki」は、「Open棟梁Project」,「OSSコンソーシアム .NET開発基盤部会」によって運営されています。

目次

概要

Azure の マネージド Kubernetes(k8s)

  • Azure Kubernetes Service (AKS) は k8s のノードの利用に対してだけ課金を行う、Azure のサービス
  • マスターノードや k8s のバージョン管理、必要なツール類の提供は全て Azure の機能と統合され Microsoft が管理する

詳細

朱書きはリスタート手順

基本のアーキテクチャ

追加のアーキテクチャ

Kubernetesのアーキテクチャに追加されたアーキテクチャ。

ノードプール

  • ノードのプールで、ノードはノードプールに所属する。
  • ノードプール内のノードは異なる VM で構成できる。

コンテナ・レジストリ

AKSのコンテナ・レジストリは、Azure Container Registry (ACR)と言う。

...

チュートリアル

前提

  • Docker for Windowsを使えるようにしておく。
  • Azure のサブスクリプションを利用可能にしておく。
  • Azure CLIのインストール
    管理者として PowerShell を開始し、次のコマンドを実行。
    >Invoke-WebRequest -Uri https://aka.ms/installazurecliwindows -OutFile .\AzureCLI.msi; Start-Process msiexec.exe -Wait -ArgumentList '/I AzureCLI.msi /quiet'
  • Azure CLIの確認
    >az -v
    azure-cli                         2.0.77
    ...
  • Azureへのログイン
    >az login
    You have logged in. Now let us find all the subscriptions to which you have access...
  • 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
  • 動作確認が完了したらコンテナを終了。
    >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
    {...json...}
  • 選択
    >az account set -s <subscription id>
  • 確認
    >az account show
    {...json...}
  • リソース・グループの作成
    >az group create --name daisukenishino --location japaneast
    {...json...}
  • コンテナ・レジストリ(ACR)の作成
    >az acr create --resource-group daisukenishino --name daisukenishinoacr --sku basic
    {...json...}
  • コンテナ・レジストリ(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
  • コンテナ・レジストリ(ACR)にプッシュ
    >docker push daisukenishinoacr.azurecr.io/azure-vote-front:v1
    The push refers to repository [daisukenishinoacr.azurecr.io/azure-vote-front]
    ...
  • コンテナ・レジストリ(ACR)にプッシュしたイメージを確認
    • ImageName?
      >az acr repository list --name daisukenishinoacr --output table 
      Result
      ----------------
      azure-vote-front
    • Tag
      >az acr repository show-tags --name daisukenishinoacr --repository azure-vote-front --output table
      Result
      --------
      v1

(3) Kubernetesクラスタを作成

  • サービス・プリンシパルの作成
    SPNのAzure版で、Subscriptionが変更されても、
    azure-cliから操作する際の権限を維持可能と言う事?
    >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
  • ACR に権限を付与する。
  • ACR のリソース名を取得。
    >az acr show --resource-group daisukenishino --name daisukenishinoacr --query "id" --output tsv
    /subscriptions/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/resourceGroups/daisukenishino/providers/Microsoft.ContainerRegistry/registries/daisukenishinoacr
  • サービス・プリンシパルに ACR の acrpull 権限を付与。
    • appId : xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
    • acrId : /subscriptions/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/resourceGroups/daisukenishino/providers/Microsoft.ContainerRegistry?/registries/daisukenishinoacr
      >az role assignment create --assignee "<appId>" --scope "<acrId>" --role acrpull
      {...json...}
  • クラスタの作成
    作成時、SSH キーがユーザーディレクトリの .ssh に作成される。
    • appId : xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
    • password : xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
      >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 under ~/.ssh to allow SSH access to the VM.
      If using machines without permanent storage like Azure Cloud Shell without an attached file share, back up your keys to a safe location
      {...json...}
  • クラスタへの接続
    (前提となる、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
    NAME  STATUS  ROLES  AGE  VERSION  INTERNAL-IP  EXTERNAL-IP  OS-IMAGE  KERNEL-VERSION  CONTAINER-RUNTIME
    ...
  • ノード情報
    >kubectl describe node <NodeName>
    ...
  • バージョンの確認
    (Serverも表示されるようになる)
    >kubectl version
    Client Version: version.Info{Major:"1", Minor:"14", GitVersion:"v1.14.8", ...}
    Server Version: version.Info{Major:"1", Minor:"13", GitVersion:"v1.13.12", ...}
  • クラスタの確認
    >kubectl cluster-info
    Kubernetes master is running at https://...
    CoreDNS is running at https://...
    kubernetes-dashboard is running at https://...
    Metrics-server is running at https://...
    To further debug and diagnose cluster problems, use 'kubectl cluster-info dump'.
  • クラスタの一覧
    (複数クラスタある場合)
    >kubectl config get-contexts
  • 名前空間一覧
    >kubectl get namespaces
    NAME          STATUS   AGE
    default       Active   37m
    kube-public   Active   37m
    kube-system   Active   37m
  • サービスの確認
    >kubectl get services -o wide
    NAME         TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)   AGE   SELECTOR
    kubernetes   ClusterIP   10.0.0.1     <none>        443/TCP   41m   <none>
  • K8sダッシュボードから確認
    • 権限を付与する。
      >kubectl create clusterrolebinding kubernetes-dashboard --clusterrole=cluster-admin --serviceaccount=kube-system:kubernetes-dashboard
  • 前述の「kubernetes-dashboard」のURLにProxy経由でアクセスする。
    >az aks browse --resource-group daisukenishino --name daisukenishinoaks
    Merged "daisukenishinoaks" as current context in C:\Users\nishi\AppData\Local\Temp\xxxxxxxxxxx
    Proxy running on http://127.0.0.1:8001/
    Press CTRL+C to close the tunnel...
    バッチ ジョブを終了しますか (Y/N)? Y
    >
  • Azure ポータルから確認
    ここまでやったら、Azure ポータルから
    resource、resource-groupを確認してみてもイイ。

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

  • デプロイ・マニフェストを更新
  • コンテナ・レジストリ(ACR)のログイン・サーバ名を取得(前述)
  • 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
  • azure-vote-all-in-one-redis.yamlの適用
    >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が割り当てられるまで待つ。
    NAME              TYPE          CLUSTER-IP    EXTERNAL-IP      PORT(S)       AGE
    azure-vote-front  LoadBalancer  10.0.121.183  xxx.xxx.xxx.xxx  80:31338/TCP  50s
  • k8s での動作を確認する
  • デプロイメント
  • 一覧
    >kubectl get deployments -o wide
    NAME             READY  UP-TO-DATE  AVAILABLE  AGE     CONTAINERS        IMAGES                                            SELECTOR
    azure-vote-back  1/1    1           1          8m13s   azure-vote-back   redis                                             app=azure-vote-back
    azure-vote-front 1/1    1           1          8m13s   azure-vote-front  daisukenishinoacr.azurecr.io/azure-vote-front:v1  app=azure-vote-front
  • 詳細
    >kubectl describe deployment azure-vote-front
  • レプリカセット
    >kubectl describe replicaset azure-vote-front-xnnnnnnx
  • ポッド
  • 一覧
    >kubectl get pods -o wide
    NAME                               READY  STATUS  RESTARTS  AGE  IP  NODE  NOMINATED NODE  READINESS GATES
    azure-vote-back-xxxxxxxxxx-xxxxx   ...
    azure-vote-front-xxxxxxxxxx-xxxxx  ...
  • 詳細
    >kubectl describe pods <PodName>
  • サービス
  • 一覧(≒進行状況の監視)
    >kubectl get services -o wide
    NAME              TYPE          CLUSTER-IP     EXTERNAL-IP      PORT(S)       AGE  SELECTOR
    azure-vote-back   ClusterIP     10.0.36.57     <none>           6379/TCP      18m  app=azure-vote-back
    azure-vote-front  LoadBalancer  10.0.121.183   xxx.xxx.xxx.xxx  80:31338/TCP  18m  app=azure-vote-front
    kubernetes        ClusterIP     10.0.0.1       <none>           443/TCP       18h  <none>
  • 詳細
    フロント
    >kubectl describe service azure-vote-front
    ...
    バック
    >kubectl describe service azure-vote-back
    ...
  • K8sダッシュボードから確認(前述)
    リソースの消費状況を確認できる。

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

  • ポッドの一覧
    >kubectl get pods
    NAME  READY  STATUS  RESTARTS  AGE
    ...   ...    ...     ...       ...
  • ポッドを手動スケーリング
    デプロイ・マニフェストに対してポッド数を明示的に指定。
  • スケーリング
    >kubectl scale --replicas=5 deployment/azure-vote-front
    deployment.extensions/azure-vote-front scaled
  • deployments(ラベル指定)
    >kubectl get deployments -l app=azure-vote-front
    NAME               READY   UP-TO-DATE   AVAILABLE   AGE
    azure-vote-front   5/5     5            5           72m
  • replicasets(ラベル指定)
    >kubectl get replicasets -l app=azure-vote-front
    NAME                          DESIRED   CURRENT   READY   AGE
    azure-vote-front-64b548d9cf   5         5         5       72m
  • pods(通常)
    >kubectl get pods
    NAME  READY  STATUS  RESTARTS  AGE
    ...   ...    ...     ...       ...
  • pods(ラベル指定&詳細)
    >kubectl get pods -l app=azure-vote-front -o wide
    NAME                               READY  STATUS  RESTARTS  AGE  IP  NODE  NOMINATED NODE  READINESS GATES
    azure-vote-front-xxxxxxxxxx-xxxxx  ...
  • node(詳細)
    >kubectl describe node aks-nodepooln-...
  • service(詳細)
    >kubectl describe service azure-vote-front
  • 元に戻す。
  • replicas=1に変更する。
    >kubectl scale --replicas=1 deployment/azure-vote-front
    deployment.extensions/azure-vote-front scaled
  • 反映を確認する。
    >kubectl get pods
    NAME                                READY   STATUS    RESTARTS   AGE
    azure-vote-back-xxxxxxxxxx-xxxxx    1/1     Running   0          81m
    azure-vote-front-xxxxxxxxxx-xxxxx   1/1     Running   0          81m
  • ポッドを自動スケーリング
    閾値を用いて、自動でのスケールアウト
  • CPU の使用率を閾値に指定
    >kubectl autoscale deployment azure-vote-front --cpu-percent=50 --min=3 --max=10
    horizontalpodautoscaler.autoscaling/azure-vote-front autoscaled
  • 設定の確認
    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が増えている筈(必要に応じて負荷テストを実施)。
    >kubectl get pods
    NAME                               READY  STATUS   RESTARTS  AGE
    azure-vote-back-xxxxxxxxxx-xxxxx   1/1    Running  0         90m
    azure-vote-front-xxxxxxxxxx-xxxxx  1/1    Running  0         5m34s
    azure-vote-front-xxxxxxxxxx-xxxxx  1/1    Running  0         5m34s
    azure-vote-front-xxxxxxxxxx-xxxxx  1/1    Running  0         90m

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

ポッドが増えた場合、ノードが不足するので、ノードを追加する必要がある。

  • ノードの手動スケール
  • ノードの追加
    >az aks scale --resource-group daisukenishino --name daisukenishinoaks --node-count 3
    {...json...}
  • ノードの確認
    >kubectl get nodes
    NAME                                STATUS   ROLES   AGE     VERSION
    aks-nodepool1-nnnnnnnn-vmss000000   Ready    agent   21h     v1.13.12
    aks-nodepool1-nnnnnnnn-vmss000001   Ready    agent   21h     v1.13.12
    aks-nodepool1-nnnnnnnn-vmss000002   Ready    agent   3m54s   v1.13.12
  • ノードの自動スケール
    プレビューとしてノードの自動スケールもサポート

(5-3) ユーティリティによる負荷テスト

  • スケーリング状況を監視
    >kubectl get pods -o wide --watch
  • 負荷テスト(別窓から)
  • 実行
    >kubectl run -i --tty load-generator --image=busybox /bin/sh
    kubectl run --generator=deployment/apps.v1 is DEPRECATED and will be removed in a future version. Use kubectl run --generator=run-pod/v1 or kubectl create instead.
    If you don't see a command prompt, try pressing enter.
    / # while true; do wget -q -O- http://xxx.xxx.xxx.xxx/; done
    ...ココで負荷テストが実行される。...
    ...終了するには「ctrl+c」を押下する。...
    / # exit
    Session ended, resume using 'kubectl attach load-generator-xxxxxxxxxx-xxxxx -c load-generator -i -t' command when the pod is running
    >kubectl attach load-generator-xxxxxxxxxx-xxxxx -c load-generator -i -t
    If you don't see a command prompt, try pressing enter.
    / # 
  • 破棄
    >kubectl delete deployments load-generator
    deployment.extensions "load-generator" deleted

(6) アプリケーションを更新

  • ローカルでの更新作業
  • アプリケーションを更新する。
    azure-vote 内の config_file.cfg のタイトル部分を変更
  • Dockerイメージを更新する。
    >docker-compose up --build -d
  • Dockerコンテナを実行する。
    >docker-compose up -d
  • ACRに登録
  • イメージにタグを付けて
    >docker tag azure-vote-front daisukenishinoacr.azurecr.io/azure-vote-front:v2
  • プッシュする
    >az acr login -n daisukenishinoacr
    Login Succeeded
    >docker push daisukenishinoacr.azurecr.io/azure-vote-front:v2
    The push refers to repository [daisukenishinoacr.azurecr.io/azure-vote-front]
    ...
  • ACRに登録されたことを確認
    >az acr repository show-tags --name daisukenishinoacr --repository azure-vote-front --output table
    Result
    --------
    v1
    v2
  • K8sで実行
  • podsを確認しつつ、
    (v1 ポッドが停止され v2 ポッドが起動する)
    >kubectl get pods -o wide --watch
  • デプロイメントのイメージを更新(別窓から)
  • kubectl setを使用する方法
    >kubectl set image deployment azure-vote-front azure-vote-front=daisukenishinoacr.azurecr.io/azure-vote-front:v2                               
  • kubectl applyを使用する方法(前述)
  • AGEから、更新を確認できる。
    >kubectl get pods -o wide
    NAME                              READY  STATUS   RESTARTS  AGE    IP           NODE                               NOMINATED NODE  READINESS GATES
    azure-vote-back-xxxxxxxxxx-xxxxx  1/1    Running  0         3h59m  10.244.1.3   aks-nodepool1-nnnnnnnn-vmss000000  <none>          <none>
    azure-vote-front-xxxxxxxxxx-xxxxx 1/1    Running  0         6m1s   10.244.1.13  aks-nodepool1-nnnnnnnn-vmss000000  <none>          <none>
    azure-vote-front-xxxxxxxxxx-xxxxx 1/1    Running  0         6m8s   10.244.2.3   aks-nodepool1-nnnnnnnn-vmss000002  <none>          <none>
    azure-vote-front-xxxxxxxxxx-xxxxx 1/1    Running  0         6m8s   10.244.2.2   aks-nodepool1-nnnnnnnn-vmss000002  <none>          <none>
  • EXTERNAL-IPを確認(前述)
    >kubectl get service azure-vote-front
    NAME              TYPE          CLUSTER-IP    EXTERNAL-IP      PORT(S)       AGE
    azure-vote-front  LoadBalancer  10.0.121.183  xxx.xxx.xxx.xxx  80:31338/TCP  4h28m
  • k8s での動作を確認する(前述) 追加の手順
  • v1, v2のレプリカを確認できる。
    >kubectl get replicasets -o wide -l app=azure-vote-front
    NAME                         DESIRED  CURRENT  READY  AGE    CONTAINERS        IMAGES                                            SELECTOR
    azure-vote-front-xxxxxxxxxx  0        0        0      4h17m  azure-vote-front  daisukenishinoacr.azurecr.io/azure-vote-front:v1  app=azure-vote-front,pod-template-hash=xxxxxxxxxx
    azure-vote-front-yyyyyyyyyy  3        3        3      23m    azure-vote-front  daisukenishinoacr.azurecr.io/azure-vote-front:v2  app=azure-vote-front,pod-template-hash=yyyyyyyyyy
  • デプロイメントのイベントで更新を確認できる。
    >kubectl describe deployments azure-vote-front
    Events:
      Type    Reason             Age   From                   Message
      ----    ------             ----  ----                   -------
      v1のReplicaSetのpodがdown
      v2のReplicaSetのpodがup   ... みたいなログが出る。
  • 1つずつ処理される理由
    ローリングアップデートの定義は以下のようになっているため。
    >kubectl describe deploy
    ...
    RollingUpdateStrategy:  1 max unavailable, 1 max surge
    ...

(7) クラスタのアップグレードと削除

  • アップグレード
  • アップグレード可能バージョンの確認
    >az aks get-upgrades --resource-group daisukenishino --name daisukenishinoaks
    {
      "agentPoolProfiles": null,
      "controlPlaneProfile": {
        "kubernetesVersion": "1.13.12",
        "name": null,
        "osType": "Linux",
        "upgrades": [
          {
            "isPreview": null,
            "kubernetesVersion": "1.14.7"
          },
          {
            "isPreview": null,
            "kubernetesVersion": "1.14.8"
          }
        ]
      },
      "id": "",
      "name": "default",
      "resourceGroup": "daisukenishino",
      "type": "Microsoft.ContainerService/managedClusters/upgradeprofiles"
    }
  • アップグレードの実行
    >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
    {...json...}
  • アップグレードの検証
    >az aks get-upgrades --resource-group daisukenishino --name daisukenishinoaks
    {
      "agentPoolProfiles": null,
      "controlPlaneProfile": {
        "kubernetesVersion": "1.14.7",
        "name": null,
        "osType": "Linux",
        "upgrades": [
          {
            "isPreview": null,
            "kubernetesVersion": "1.14.8"
          },
          {
            "isPreview": true,
            "kubernetesVersion": "1.15.4"
          },
          {
            "isPreview": true,
            "kubernetesVersion": "1.15.5"
          }
        ]
      },
      "id": "",
      "name": "default",
      "resourceGroup": "daisukenishino",
      "type": "Microsoft.ContainerService/managedClusters/upgradeprofiles"
    }
  • EXTERNAL-IPを確認(前述)
    >kubectl get service azure-vote-front
    NAME              TYPE          CLUSTER-IP    EXTERNAL-IP      PORT(S)       AGE
    azure-vote-front  LoadBalancer  10.0.121.183  xxx.xxx.xxx.xxx  80:31338/TCP  4h28m
  • クラスタの削除
  • Azure CLIから実行
    >az group delete --name daisukenishino --yes --no-wait
  • Azureポータルからも確認すると良い。
  • MC_から始まる、ResourceGroup?が作成されている。
    MC_ResourceGroupName_AKSName_AzureLocationName
  • ここには、nodesをホストする vm が含まれるらしい。
  • 依存関係があるらしく、az group deleteすると一緒に消える。

SQL Serverのエビデンス

(0) 前提

(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
  • その他
    ReclaimPolicy? の設定がないため、既定の Delete が適用
  • kind: PersistentVolumeClaim?
    後半は永続ボリューム要求用
  • metadata:
    ・name: mssql-data
     名前は mssql-data
    ・annotations: volume.beta.kubernetes.io/storage-class: azure-disk
     ストレージクラスとして Azureのディスク ストレージ を指定
  • spec:
    ・accessModes: - ReadWriteOnce?
     ボリュームに対するアクセス(1 つのポッドのみがアクセス)
    ・resources: requests: storage: 8Gi
     容量を指定
  • mssql-storage.yamlの適用
    >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
    NAME     CAPACITY  ACCESS MODES  RECLAIM POLICY  STATUS  CLAIM  STORAGECLASS 
    REASON     AGE
    pvc-...  8Gi       RWO           Delete          Bound   default/mssql-data   azure-disk  15s
  • 永続ボリューム要求
    • 一覧
      >kubectl get pvc
      NAME        STATUS  VOLUME   CAPACITY  ACCESS MODES  STORAGECLASS  AGE
      mssql-data  Bound   pvc-...  8Gi       RWO           azure-disk    2m9s
  • 詳細
    >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.
  • 永続ボリューム要求の再作成
    >kubectl apply -f mssql-storage.yaml
    storageclass.storage.k8s.io/azure-disk unchanged
    persistentvolumeclaim/mssql-data created
  • 再度チェック
    >kubectl get pv --watch
    ...

(2-1) SQL のインストール

シークレットの作成や SQL Server 2017 の配置

  • シークレットの作成
  • mssqlのシークレットを作成(K=SA_PASSWORD, V="xxxxx")
    >kubectl create secret generic mssql --from-literal=SA_PASSWORD="xxxxx"
    secret/mssql created
  • シークレットの確認(値はBase64エンコされている)
    >kubectl get secret mssql -o yaml
    ...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:
    コンテナに渡す各種引数を指定
  • name: MSSQL_PID
    value: "Developer"(SQL Server Developer Edition)
  • name: ACCEPT_EULA
    value: "Y"
  • name: MSSQL_SA_PASSWORD
    作成したシークレットは valueFrom.secretKeyRef? で取得
  • containers.volumeMounts:
    ボリュームを「/var/opt/mssql」にマウント
  • spec.volumes:
    前回作成した永続ボリューム要求を指定
  • sqldeployment.yamlの適用
    >kubectl apply -f sqldeployment.yaml
    deployment.apps/mssql-deployment created
    service/mssql-deployment created
  • サービス・ポッドの確認
  • サービス
    >kubectl get services 
    NAME              TYPE          CLUSTER-IP    EXTERNAL-IP      PORT(S)         AGE
    kubernetes        ClusterIP     10.0.0.1      <none>           443/TCP         31m
    mssql-deployment  LoadBalancer  10.0.148.142  xxx.xxx.xxx.xxx  1433:xxxxx/TCP  18s
  • ポッド
    >kubectl get pods --watch
    NAME                               READY  STATUS   RESTARTS  AGE
    mssql-deployment-xxxxxxxxxx-xxxxx  1/1    Running  0         3m33s

(2-2) SQL の障害復旧の検証

  • sqlcmd ユーティリティ で接続&ログインする。
    >sqlcmd -S <External IP Address> -U SA -P "xxxxxxx"
  • DDL、DML(INSERT)実行
    得意の「instnwnd.sql」を使用して「SELECT * FROM SHIPPERS」でも実行する。
    (exec sp_dboptionの部分は旧ver向けstatementなのでコメントアウトするか削除する)
  • ポッド再配置を行う。
    (これは、アプリではなくDBインスタンスの再起動になる。)
  • ポッド一覧の取得
    >kubectl get pods
    NAME                               READY  STATUS   RESTARTS  AGE
    mssql-deployment-xxxxxxxxxx-xxxxx  1/1    Running  0         23m
  • ポッドの削除
    >kubectl delete pod mssql-deployment-xxxxxxxxxx-xxxxx
    pod "mssql-deployment-xxxxxxxxxx-xxxxx" deleted
  • ポッド一覧の取得(再配置の確認)
    >kubectl get pods --watch
    NAME                               READY  STATUS   RESTARTS  AGE
    mssql-deployment-yyyyyyyyyy-yyyyy  1/1    Running  0         3m33s
  • 再配置後、mssqlにアクセスできることを確認する。
    • 接続&ログインし、
    • DML(SELECT)を実行する。
  • ポッドの再配置(異なるノードへ再配置)
  • ポッド一覧の取得
    >kubectl get pods -o wide
    NAME                               READY  STATUS   RESTARTS  AGE    IP           NODE                               NOMINATED NODE  READINESS GATES
    mssql-deployment-yyyyyyyyyy-yyyyy  1/1    Running  0         5m45s  10.244.1.4   aks-nodepool1-nnnnnnnn-vmss000001  <none>          <none>
  • ノードの一時停止
    >kubectl drain aks-nodepool1-nnnnnnnn-vmss000001 --ignore-daemonsets --delete-local-data
    node/aks-nodepool1-nnnnnnnn-vmss000001 cordoned
    WARNING: ignoring DaemonSet-managed Pods: kube-system/kube-proxy-xxxxx
    evicting pod "coredns-xxxxxxxxxx-xxxxx"
    pod/coredns-xxxxxxxxxx-xxxxx evicted
    node/aks-nodepool1-nnnnnnnn-vmss000001 evicted
  • ノード一時停止の確認
    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
  • ポッドを削除してレプリカセットによって再配置。
    >kubectl delete pod mssql-deployment-yyyyyyyyyy-yyyyy 
  • ポッド一覧の取得(再配置の確認 1→0)
    >kubectl get pods -o wide --watch
    NAME                               READY  STATUS   RESTARTS  AGE    IP          NODE                               NOMINATED NODE  READINESS GATES
    mssql-deployment-zzzzzzzzzz-zzzzz  1/1    Running  0         2m53s  10.244.1.4  aks-nodepool1-nnnnnnnn-vmss000000  <none>          <none>
  • 再配置後、mssqlにアクセスできることを確認する。
    • 接続&ログインし、
    • DML(SELECT)を実行する。
  • Azure ポータルから確認
    ディスクが新しいノードにアタッチされていることを確認できる。
    (「所有者 VM」の欄に、変更後のNODEのIDが表示される。)
  • ノードの一時停止を解除(再び再配置してもイイ 0→1)
    >kubectl uncordon aks-nodepool1-nnnnnnnn-vmss000001
    node/aks-nodepool1-nnnnnnnn-vmss000001 uncordoned
  • Azure CLIからクラスタの削除を実行
    >az group delete --name daisukenishino --yes --no-wait

ASP.NET Coreのエビデンス

(0) 前提

  • Visual Studio 2019 または dotnet core 3.0 が利用できる環境

(1) 事前準備

  • 以下の様に、sql2017.yamlを作成する。
  • 差異
    • 2つのデプロイ・マニフェスト(StorageとRDBMS)が結合され、
    • DBのシークレット作成処理が含まれる。
      ("MyC0m9l&xP@ssw0rd"をBase64化した値を指定している)
  • 内容
    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
    ---
    apiVersion: v1
    kind: Secret
    metadata:
      name: mssql
    type: Opaque
    data:
      SA_PASSWORD: "TXlDMG05bCZ4UEBzc3cwcmQ="
    ---
    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
  • sql2017.yamlの適用
    >kubectl apply -f sql2017.yaml
  • mssql-deploymentのEXTERNAL-IPの確認。
    >kubectl get service --watch
    NAME              TYPE          CLUSTER-IP    EXTERNAL-IP    PORT(S)         AGE
    kubernetes        ClusterIP     10.0.0.1      <none>         443/TCP         4h26m
    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?」削除して再適用
    • ローカルでは10.0.75.1でブリッジ
    • Docker Composeではlinks名を使用する。
    • AKSではService名を使用する。
      >kubectl apply -f sql2017.yaml --force
      storageclass.storage.k8s.io/azure-disk unchanged
      persistentvolumeclaim/mssql-data unchanged
      secret/mssql unchanged
      deployment.apps/mssql-deployment unchanged
      service/mssql-deployment configured
  • mssql-deploymentのEXTERNAL-IPが<none>に変更されたことを確認。
    >kubectl get service --watch
    NAME              TYPE       CLUSTER-IP    EXTERNAL-IP  PORT(S)   AGE
    kubernetes        ClusterIP  10.0.0.1      <none>       443/TCP   4h27m
    mssql-deployment  ClusterIP  10.0.254.191  <none>       1433/TCP  6s

(2) アプリを開発

  • チュートリアルのサンプルが微妙なのでコチラを使用する。
  • ポイント
  • voting-appと同様にRedisを使用する。
    (チュートリアルでは、Redisを使用していない)
  • DBMSは、SQL Serverを使用する。
    (チュートリアルでは、K8s上のDBを直参照するが、)
    • ローカルでは10.0.75.1でブリッジ
    • Docker Composeではlinks名を使用する。
    • AKSではService名を使用する。

(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で発行(コンテナ・レジストリへアップロード)手順
    • プロジェクトを右クリックし発行を選択する。
    • 「既存のAzure Container Registry(ACR)」を選択して、
      以下のダイアログから発行をする。
      コンテナ・イメージの発行
  • エラーが起きるので、以下の開発用の設定をして再実行。
    開発用の設定:レジストリの管理者ユーザの有効化
    >az acr update -n daisukenishinoacr --admin-enabled true
    {...json...}
  • イメージを確認する。
    • ローカル
      >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
  • リモート
    ImageName?
    >az acr repository list --name daisukenishinoacr --output table
    Result
    ---------------
    webapplication1
    Tag
    >az acr repository show-tags --name daisukenishinoacr --repository webapplication1 --output table
    Result
    --------
    latest
  • タグを設定する。
    直ぐに発行しないで、プロファイル作成を
    選択すると初回からこちらを選択可能。
  • 設定
    タグの設定
  • 削除
  • ローカル
    >docker rmi <IMAGE ID> -f
  • リモート
    >az acr repository delete --name daisukenishinoacr --image webapplication1:latest
    This operation will delete the manifest 'sha256:3ebc46eb04906582a80aaa89edde8611eefece5af2518756cf451db74223825e' and all the following images: 'webapplication1:latest'.
    Are you sure you want to continue? (y/n): y
  • 再発行(前述)
  • イメージ確認
  • ローカル
    >docker images
    REPOSITORY                                        TAG             IMAGE ID      CREATED         SIZE
    daisukenishinoacr.azurecr.io:443/webapplication1  yyyymmddhhmmss  a41aed558746  42 seconds ago  354MB
    webapplication1                                   latest          a41aed558746  42 seconds ago  354MB
  • リモート ImageName?
    >az acr repository list --name daisukenishinoacr --output table
    Result
    ---------------
    webapplication1
    Tag
    >az acr repository show-tags --name daisukenishinoacr --repository webapplication1 --output table
    Result
    --------
    yyyymmddhhmmss

(3-2) アプリをデプロイ(K8sへ)

  • 以下の様に、webapplication1.yamlを作成する。
    • 追加分(azure-vote-backを流用)
      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
  • webapplication1.yamlの適用
    >kubectl apply -f webapplication1.yaml
  • webapplication1のEXTERNAL-IPの確認。
    >kubectl get service --watch
  • 開発中にイメージを更新する場合、
  • 再発行(前述)
  • タグを確認し(前述)
    >az acr repository show-tags --name daisukenishinoacr --repository 
    webapplication1 --output table
    Result
    --------
    yyyymmddhhmmss
  • webapplication1.yamlの<Tag>を更新し、
  • 変更前
    image: daisukenishinoacr.azurecr.io/webapplication1:<Tag>
  • 変更後
    image: daisukenishinoacr.azurecr.io/webapplication1:yyyymmddhhmmss
  • 再適用する。
    >kubectl apply -f webapplication1.yaml --force

(4) アプリの構成

  • イングレス コントローラー(AKS独自)の構成
    EXTERNAL-IPをFQDNに変更できる。
  • HTTP アプリケーションルーティング アドオンのインストール
    (Azureポータルから DNS ゾーンが追加されたことを確認できる)
    >az aks enable-addons --resource-group daisukenishino --name daisukenishinoacr --addons http_application_routing
  • 登録されている DNS ゾーン名を取得する。
    >az aks show --resource-group daisukenishino --name daisukenishinoacr --query addonProfiles.httpApplicationRouting.config.HTTPApplicationRoutingZoneName -o table
    Result
    ----------------------------------------
    xxxxxxxxxxxxxxxxxxxx.japaneast.aksapp.io
  • イングレス コントローラーの追加
  • webapplication1.yamlの編集
    • サービスのタイプを変更(LoadBalancer?を削除)し、
    • イングレス コントローラーを追加
  • webapplication1.yamlの適用
    >kubectrl apply -f webapplication1.yaml --force
  • webapplication1のEXTERNAL-IPが<none>に変更されたことを確認。
    >kubectl get svc
  • FQDN名の確認。
    >kubectl get ingress
  • Azureポータルから DNS ゾーンにAレコードが追加されたことを確認できる。
  • アプリケーションの複数台構成
  • Viewで、@Environment.MachineName? を使用して実行中のポッド名を表示
  • 再発行(前述)
  • webapplication1.yamlの編集
    webapplication1のDeploymentを変更する。
    • タグを更新
    • replicas: 2に変更
  • webapplication1.yamlの適用
    >kubectrl apply -f webapplication1.yaml --force
  • ブラウザよりアプリにアクセス。
    F5 で更新してポッド名が変わることを確認。

(5) 複数ノードプールの構成

おいおいヤる予

(6) ネットワークの構成

おいおいヤる予

(7) Gatewayの構成

おいおいヤる予

(8) ラベル、セレクターと名前空間

おいおいヤる予

(9) 自動スケール

おいおいヤる予

参考

Microsoft Docs

チュートリアル

サポート ポリシー

Qiita(ASK を使いこなす)

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


添付ファイル: file2.png 27件 [詳細] file1.png 29件 [詳細]

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2020-03-21 (土) 13:51:12 (8d)