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

目次

概要

Azure の マネージド Kubernetes(k8s)

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

詳細

朱書きはリスタート手順

K8s 基本のアーキテクチャ

AKS 追加のアーキテクチャ

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

ノードプール

  • Azure Virtual Machine Scale Sets (VMSS)
  • ノードプール内のノードは
    • ノードプールに所属する。
    • 異なる VM で構成できる。

コンテナ・レジストリ

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

ネットワーク関連の情報

Azureネットワークの基礎的な情報

テクニカルリファレンス(ネットワーク構成)

ACR(コンテナ・レジストリ)をプライベート化する。

Azure SQL Databaseをプライベート化する。

AKSのアウトバウンドをAzure Firewallで制限する。

プライベートAKSクラスタを作成する。

OA-LANとAzureのVNETの分離

認証・認可関連の情報

テクニカルリファレンス(認証・認可)

Azure サービス プリンシパル

Azure Managed ID

AKSクラスタ作成・操作に必要な権限

AzADによる条件付きアクセス機能を構成する。

AKS Master APIにAzAD認証を統合する。

AKSユーザ・アプリからのリソース・アクセス

その他の情報

基盤保守

開発~デプロイ

参考情報

K8sのポイント

AKSのポイント

チュートリアル

前提

  • 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
  • 動作確認が完了したらコンテナを終了。
    >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クラスタを作成

  • サービス・プリンシパルの作成
    >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でブリッジ
  • 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) 自動スケール

おいおいヤる予

その他のコンテンツ

Azure Kubernetes Service ワークショップ

AKSをセキュアに利用するためのテクニカルリファレンス

参考

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, :AKS, :IaC


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

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2020-08-09 (日) 12:19:57 (108d)