「[[マイクロソフト系技術情報 Wiki>http://techinfoofmicrosofttech.osscons.jp/]]」は、「[[Open棟梁Project>https://github.com/OpenTouryoProject/]]」,「[[OSSコンソーシアム .NET開発基盤部会>https://www.osscons.jp/dotNetDevelopmentInfrastructure/]]」によって運営されています。

-戻る
--[[AzureのPaaS]]
--[[Visual Studio Kubernetes Tools]]

* 目次 [#o37c996f]
#contents

*概要 [#s3622952]
Azure の マネージド [[Kubernetes(k8s)>#x4a72daa]]

-Azure Kubernetes Service (AKS) は [[k8s>#x4a72daa]] のノードの利用に対してだけ課金を行う、Azure のサービス

-マスターノードや k8s のバージョン管理、必要なツール類の提供は全て Azure の機能と統合され Microsoft が管理する

*詳細 [#be17a29e]
&color(red){朱書き};はリスタート手順

**[[K8s 基本のアーキテクチャ>https://dotnetdevelopmentinfrastructure.osscons.jp/index.php?Kubernetes#xbc57197]] [#m25f1bee]

**AKS 追加のアーキテクチャ [#p3ca0985]
[[Kubernetesのアーキテクチャ>https://dotnetdevelopmentinfrastructure.osscons.jp/index.php?Kubernetes#xbc57197]]に追加されたアーキテクチャ。

***ノードプール [#yf99ad99]
-Azure Virtual Machine Scale Sets (VMSS)

-AKS基盤の[[制御プレーン>AKSをセキュアに利用するためのテクニカルリファレンス#gcac2445]]側にある。

-[[実行ノード>AKSをセキュアに利用するためのテクニカルリファレンス#gcac2445]]側に払い出すノードのプール。

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

***コンテナ・レジストリ [#p30b0bb1]
AKSの[[コンテナ・レジストリ>Visual Studio Tools for Docker#d0aa0c82]]は、Azure Container Registry (ACR)と言う。

**ネットワーク関連の情報 [#w88b4977]
***[[Azureネットワークの基礎的な情報>Azure#r51c97ed]] [#bbfe67f4]
***[[テクニカルリファレンス(ネットワーク構成)>AKSをセキュアに利用するためのテクニカルリファレンス#h6e5b109]] [#i1cd1a5b]
***[[ACR(コンテナ・レジストリ)をプライベート化する。]] [#qd7391d0]
***[[Azure SQL Databaseをプライベート化する。]] [#d14d6d94]
***[[AKSのアウトバウンドをAzure Firewallで制限する。]] [#b5d292ee]
***[[プライベートAKSクラスタを作成する。]] [#m0c88b4a]
*** ※ [[OA-LANとAzureのVNETの分離]] [#o328ad8f]

**認証・認可関連の情報 [#u2964d2a]
***[[テクニカルリファレンス(認証・認可)>AKSをセキュアに利用するためのテクニカルリファレンス#h7815383]] [#l13a97a6]
***[[Azure サービス プリンシパル]] [#ra796984]
***[[AKSクラスタ作成・操作に必要な権限]] [#hc485bd1]
***[[AzADによる条件付きアクセス機能を構成する。]] [#t071fa52]
***[[AKS Master APIにAzAD認証を統合する。]] [#l1d8ceab]
***[[AKSユーザ・アプリからのリソース・アクセス]] [#qde0f8b9]

**その他の情報 [#d856e3d9]
***基盤保守 [#e755b2b0]
-[[テクニカルリファレンス(基盤保守)>AKSをセキュアに利用するためのテクニカルリファレンス#rd67a39f]]
-[[AKSのバージョン、サポート、基盤保守について。]]

***開発~デプロイ [#ja9f4fdf]
-[[テクニカルリファレンス(開発~デプロイ)>AKSをセキュアに利用するためのテクニカルリファレンス#ye9b2134]]
-[[ACR(コンテナ・レジストリ)をプライベート化する。]]

-[[CI/CD]]
--[[コンテナのチェーン]]
--[[CI/CD パイプライン]]

**参考情報 [#y0a77bc9]

***[[K8sのポイント>AKSをセキュアに利用するためのテクニカルリファレンス#vf319a19]] [#t61a375a]

***[[AKSのポイント>AKSをセキュアに利用するためのテクニカルリファレンス#bf07dd3a]] [#q3d2cb02]

*チュートリアル [#f0c15710]

**前提 [#md0ef3ce]
-[[Docker for Windows]]を使えるようにしておく。

-Azure

--サブスクリプションを利用可能にしておく。

--[[Azure CLI]]
---インストール
---確認
---ログイン

-Kubernetes CLI のインストール
 >az aks install-cli

--&color(red){環境変数の登録};
 >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のエビデンス [#c7683828]

***(1) アプリケーションを準備 [#m0d071ff]
-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) コンテナ・レジストリを作成 [#m5d1d1b1]
コンテナ・レジストリ ≒ Azure Container Registry (ACR)

-&color(red){ログイン};
 >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...}

-&color(red){リソース・グループの作成};
 >az group create --name daisukenishino --location japaneast
 {...json...}

-&color(red){コンテナ・レジストリ(ACR)の作成};
 >az acr create --resource-group daisukenishino --name daisukenishinoacr --sku basic
 {...json...}

--参考
---Azure Container Registry(ACR) SKU~
https://docs.microsoft.com/ja-jp/azure/container-registry/container-registry-skus

-&color(red){コンテナ・レジストリ(ACR)へログイン};
 >az acr login -n daisukenishinoacr
 Login Succeeded

-&color(red){コンテナ・レジストリ(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クラスタを作成 [#l3698aeb]
-[[サービス・プリンシパル>#ra796984]]の作成
 >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 に権限を付与する。

--&color(red){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

--&color(red){[[サービス・プリンシパル>#ra796984]]に 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...}

-&color(red){クラスタの作成};~
作成時、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...}

-&color(red){クラスタへの接続};~
(前提となる、Kubernetes CLIがインストールされていること)
 >az aks get-credentials --resource-group daisukenishino --name daisukenishinoaks
 Merged "daisukenishinoaks" as current context in C:\Users\nishi\.kube\config

-接続確認
--&color(red){ノードを取得};
---一覧(通常)
 >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) アプリケーションを実行 [#l09fa0fe]

-デプロイ・マニフェストを更新

--コンテナ・レジストリ(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

--EXTERNAL-IPが割り当てられたらブラウザからアクセスする。~
http://xxx.xxx.xxx.xxx/

-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) [#f1722533]
-ポッドの一覧
 >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が増えている筈(必要に応じて[[負荷テスト>#u7911b01]]を実施)。
 >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) [#ifab5104]
ポッドが増えた場合、ノードが不足するので、ノードを追加する必要がある。

-ノードの手動スケール

--ノードの追加
 >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) ユーティリティによる負荷テスト [#u7911b01]
-スケーリング状況を監視
 >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) アプリケーションを更新 [#t4f31ed0]
-ローカルでの更新作業

--アプリケーションを更新する。~
azure-vote 内の config_file.cfg のタイトル部分を変更

--Dockerイメージを更新する。
 >docker-compose up --build -d

--Dockerコンテナを実行する。
 >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
 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

--テスト~
http://xxx.xxx.xxx.xxx/

-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) クラスタのアップグレードと削除 [#s1f962be]

-アップグレード

--アップグレード可能バージョンの確認
 >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

--テスト~
http://xxx.xxx.xxx.xxx/

-クラスタの削除

--[[Azure CLI]]から実行
 >az group delete --name daisukenishino --yes --no-wait

--Azureポータルからも確認すると良い。

---MC_から始まる、ResourceGroupが作成されている。
 MC_ResourceGroupName_AKSName_AzureLocationName

---ここには、nodesをホストする vm が含まれるらしい。

---依存関係があるらしく、az group deleteすると一緒に消える。

**SQL Serverのエビデンス [#n100e4bf]

***(0) 前提 [#j7aaecf0]
-[[Azure Data Studioをインストールしておく。>https://docs.microsoft.com/ja-jp/sql/azure-data-studio/download]]

-[[(3) Kubernetesクラスタを作成>#l3698aeb]]までを行い、~
コンテナ・レジストリとKubernetesクラスタを作成しておく。

***(1) ストレージの準備 [#v5360d83]
先ずは、ストレージとして、永続ボリュームを作成する。~
(非永続ボリュームの確認は、[[Qiitaの記事の手順>#z89c63b0]]を確認するだけに留める)

-以下の様に、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のディスク ストレージ]] : 1つのポッドのみがアクセスする場合~
・Azure Files : 複数のポッドからアクセスする場合

---parameter:~
渡すパラメタを指定。~
・kind: Managed~
 [[管理ディスク>Azureのディスク ストレージ#v086e7a2]]~
・storageaccounttype: Premium_LRS~
 [[ストレージのsku>Azureのディスク ストレージ#c73b6f13]]

---その他~
・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 のインストール [#u339f348]
シークレットの作成や 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 の障害復旧の検証 [#c68a16b1]
-mssqlにアクセスしてみる。
--[[Azure Data Studioで接続&ログインする。>https://docs.microsoft.com/ja-jp/sql/azure-data-studio/quickstart-sql-server]]
---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>https://github.com/OpenTouryoProject/OpenTouryo/tree/develop/root/files/resource/Sql/sqlserver]]」を使用して「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のエビデンス [#u25677fb]

***(0) 前提 [#sf0a8e79]
-Visual Studio 2019 または dotnet core 3.0 が利用できる環境

-[[(3) Kubernetesクラスタを作成>#l3698aeb]]までを行い、~
コンテナ・レジストリとKubernetesクラスタを作成しておく。

***(1) 事前準備 [#ca136b60]
-DBを作成するが、内容は「[[SQL Serverのエビデンス>#n100e4bf]]」と同じ。

-以下の様に、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>https://dotnetdevelopmentinfrastructure.osscons.jp/index.php?Docker%E3%82%B3%E3%83%B3%E3%83%9D%E3%83%BC%E3%82%BA]]では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) アプリを開発 [#eca47597]
-チュートリアルのサンプルが微妙なので[[コチラ>Visual Studio Kubernetes Tools#e04f0515]]を使用する。

-ポイント

--[[voting-app>#c7683828]]と同様にRedisを使用する。~
(チュートリアルでは、Redisを使用していない)

--DBMSは、SQL Serverを使用する。~
(チュートリアルでは、K8s上のDBを直参照するが、)
---ローカルでは10.0.75.1でブリッジ
---[[Docker Compose>https://dotnetdevelopmentinfrastructure.osscons.jp/index.php?Docker%E3%82%B3%E3%83%B3%E3%83%9D%E3%83%BC%E3%82%BA]]ではlinks名を使用する。
---AKSではService名を使用する。

-ローカル、Docker Composeでテストしてから、[[AKSへデプロイ>#waa01867]]する。

***(3-1) アプリをデプロイ(ACRへ) [#waa01867]
-以下の接続文字列を変更する。

--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)」を選択して、~
以下のダイアログから発行をする。
#ref(1.png,left,nowrap,コンテナ・イメージの発行,60%)

--&color(red){エラーが起きるので、以下の開発用の設定をして再実行。};~
開発用の設定:レジストリの管理者ユーザの有効化
 >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

-タグを設定する。~
直ぐに発行しないで、プロファイル作成を~
選択すると初回からこちらを選択可能。

--設定
#ref(2.png,left,nowrap,タグの設定,60%)

--削除

---ローカル
 >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へ) [#c43a6232]

-以下の様に、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
 ---

--オリジナル部分~
&lt;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) アプリの構成 [#gf90a69e]
-イングレス コントローラー(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

--ブラウザからアクセス~
http://webapplication1.xxxxxxxxxxxxxxxxxxxx.japaneast.aksapp.io

--Azureポータルから DNS ゾーンにAレコードが追加されたことを確認できる。

-アプリケーションの複数台構成

--Viewで、@Environment.MachineName を使用して実行中のポッド名を表示

--再発行(前述)

--webapplication1.yamlの編集~
webapplication1のDeploymentを変更する。
---タグを更新
---replicas: 2に変更

--webapplication1.yamlの適用
 >kubectrl apply -f webapplication1.yaml --force

--ブラウザよりアプリにアクセス。~
F5 で更新してポッド名が変わることを確認。

***(5) 複数ノードプールの構成 [#vf5857a6]
おいおいヤる予

***(6) ネットワークの構成 [#je22a90b]
おいおいヤる予

***(7) Gatewayの構成 [#j4a5ea16]
おいおいヤる予

***(8) ラベル、セレクターと名前空間 [#e436e00a]
おいおいヤる予

***(9) 自動スケール [#j7a9f25c]
おいおいヤる予

*その他のコンテンツ [#x5e9a9d1]

**[[Azure Kubernetes Service ワークショップ]] [#y3bf9858]

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

*参考 [#g27c1ff6]
-Azure Kubernetes Service 2019 ふりかえり~
https://www.slideshare.net/ToruMakabe/azure-kubernetes-service-2019

**Microsoft Docs [#za5e452c]

***チュートリアル [#cd044dc3]
-Kubernetes on Azure のチュートリアル
--1 - AKS 用にアプリケーションを準備する~
https://docs.microsoft.com/ja-jp/azure/aks/tutorial-kubernetes-prepare-app
--2 - コンテナー レジストリを作成する~
https://docs.microsoft.com/ja-jp/azure/aks/tutorial-kubernetes-prepare-acr
--3 - Kubernetes クラスターを作成する~
https://docs.microsoft.com/ja-jp/azure/aks/tutorial-kubernetes-deploy-cluster
--4 - アプリケーションを実行する~
https://docs.microsoft.com/ja-jp/azure/aks/tutorial-kubernetes-deploy-application
--5 - アプリケーションのスケールを変更する~
https://docs.microsoft.com/ja-jp/azure/aks/tutorial-kubernetes-scale
--6 - アプリケーションを更新する~
https://docs.microsoft.com/ja-jp/azure/aks/tutorial-kubernetes-app-update
--7 - クラスターをアップグレードする~
https://docs.microsoft.com/ja-jp/azure/aks/tutorial-kubernetes-upgrade-cluster

-SQL Server on Linux のチュートリアル
--Azure Kubernetes Services (AKS) を使用して Kubernetes に SQL Server コンテナーを配置する - SQL Server~
https://docs.microsoft.com/ja-jp/sql/linux/tutorial-sql-server-containers-kubernetes?view=sql-server-2017

***サポート ポリシー [#ec9de178]
-Azure Kubernetes Service (AKS) のサポート ポリシー~
https://docs.microsoft.com/ja-jp/azure/aks/support-policies

**Qiita(ASK を使いこなす) [#g22fa8b4]
-Azure Kubernetes Service (AKS) を使いこなす : 目次~
https://qiita.com/kenakamu/items/e155740aa60c85a3d867

***AKS チュートリアルの深堀 [#n150fe66]
上記のMicrosoft Docsのチュートリアルの深堀しているQiita記事(MS社員)。

-Kubernetes と AKS 概要~
https://qiita.com/kenakamu/items/8f43163d1a42aca62fb7
-アプリケーションの準備~
https://qiita.com/kenakamu/items/50193c1b642cb3339b46
-コンテナレジストリを作成する~
https://qiita.com/kenakamu/items/bb876f17e4f6ecaf370b
-AKS クラスターのデプロイ~
https://qiita.com/kenakamu/items/fb8adae1c5ddb906e0f2
-アプリケーションの実行~
https://qiita.com/kenakamu/items/cac80a548b0b43a270fa
-アプリケーションのスケーリング~
https://qiita.com/kenakamu/items/af537527d4d899a8f80e
-アプリケーションの更新~
https://qiita.com/kenakamu/items/f6b2de045b76cc05b809

***SQL Server 2017 を AKS で使う [#z89c63b0]
-ストレージの準備~
https://qiita.com/kenakamu/items/8d584e6da3e93929b1d9
-SQL のインストールと障害復旧の検証~
https://qiita.com/kenakamu/items/a05843d8e5efd13eb009

***AKS で asp.net core アプリケーション [#e695711a]
-事前準備~
https://qiita.com/kenakamu/items/20194ace476d873b2949
-ローカルで開発する~
https://qiita.com/kenakamu/items/f61ed635a77b673e8164
-アプリをデプロイ~
https://qiita.com/kenakamu/items/c1ff282992bfc778000d
-イングレスとアプリ複数ポッド構成~
https://qiita.com/kenakamu/items/19b5eb067c9d40e47b0b
-複数ノードプールの構成~
https://qiita.com/kenakamu/items/aee6748b6d15b8aab34f
-Azure CNI ネットワーク と Application Gateway~
https://qiita.com/kenakamu/items/f4c0fabea8044a6b28cb
-Application Gateway と Application Gateway Ingress Controller~
https://qiita.com/kenakamu/items/6997c894e6cce58f2ea2
-ラベル、セレクターと名前空間~
https://qiita.com/kenakamu/items/7003b6013779f1a5bdb6

-自動スケール
--概要とポッドの水平スケール~
https://qiita.com/kenakamu/items/29acb5c79c6700eed814
--クラスターのスケール~
https://qiita.com/kenakamu/items/a4fe3769605795c23c24
--Azure Container Instance との統合~
https://qiita.com/kenakamu/items/6f3ed4be598d1c2ea8c2

**Azure | SIOS Tech. Lab [#v9c16bbe]
https://tech-lab.sios.jp/archives/category/azure/

-Azure Kubernetes Serviceで最速k8s~
https://tech-lab.sios.jp/archives/18536

-Azure Kubernetes Service + Seleniumでお手軽負荷テスト環境~
https://tech-lab.sios.jp/archives/18591

-Azure Kubernetes Serviceで実現する超低予算~
&(ほぼ)フルマネージド&本格的なWordPress環境~
https://tech-lab.sios.jp/archives/18794

***NGINX [#e2ad4628]
-Azure Kubernetes ServiceでNGINX
--Ingressによる負荷分散~
https://tech-lab.sios.jp/archives/18638
--IngressのSSL証明書更新~
https://tech-lab.sios.jp/archives/18657

***共有ストレージ [#m49421d1]
-Azure Kubernetes Serviceでの共有ストレージ
--(NFS Server on VM編)~
https://tech-lab.sios.jp/archives/18739
--(Azure Files編)~
https://tech-lab.sios.jp/archives/18735
--(Azure NetApp Files編)~
https://tech-lab.sios.jp/archives/18741

***kubectl [#gc579585]
-Kubernetes(kubectl)
--KubernetesでDeploymentのRollback~
https://tech-lab.sios.jp/archives/18550
--KubernetesでDeploymentの色々なアップデート方法~
https://tech-lab.sios.jp/archives/18553
--KubernetesでRollingUpdateするためのPodの安全な終了~
https://tech-lab.sios.jp/archives/18730

**OSSコンソーシアム [#w809fb59]

***Blog [#n95d96ef]
-Docker for Windows上で Docker Composeでテストし、Open PaaSにデプロイできる~
--(1):https://www.osscons.jp/joweexgq6-537/
--(2):https://www.osscons.jp/jo6610sfd-537/

***Wiki [#x4a72daa]
-マイクロソフト系技術情報 Wiki(当該Wiki)
--[[Visual Studio Tools for Docker]]
--[[Visual Studio Kubernetes Tools]]

-.NET 開発基盤部会 Wiki
--[[Kubernetes>https://dotnetdevelopmentinfrastructure.osscons.jp/index.php?Kubernetes]]
---[[Helm Charts>https://dotnetdevelopmentinfrastructure.osscons.jp/index.php?Helm%20Charts]]
---[[Kompose>https://dotnetdevelopmentinfrastructure.osscons.jp/index.php?Kompose]]
---[[Compose on Kubernetes>https://dotnetdevelopmentinfrastructure.osscons.jp/index.php?Compose%20on%20Kubernetes]]

----
Tags: [[:クラウド]], [[:コンテナ]], [[:Azure]], [[:AKS]]

トップ   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS