「[[マイクロソフト系技術情報 Wiki>http://techinfoofmicrosofttech.osscons.jp/]]」は、「[[Open棟梁Project>https://github.com/OpenTouryoProject/]]」,「[[OSSコンソーシアム .NET開発基盤部会>https://www.osscons.jp/dotNetDevelopmentInfrastructure/]]」によって運営されています。 -戻る --[[Azure Kubernetes Service (AKS)]] --[[Azure Subscriptionの管理@エンプラ]] ---[[FgCF (Financial-grade Cloud Fundamentals)]]~ ・[[AppService閉域構成テクニカルリファレンス]]~ ・AKSをセキュアに利用するためのテクニカルリファレンス * 目次 [#ge667ff3] #contents *概要 [#q76f87a9] -[[なんか、公開されていた>#q2387273]]ので聞いてみることにした。 -[[クラウド]]([[Azure]])の利用、[[コンテナ技術]]([[Docker>コンテナ技術#la264095]])を用いた開発、~ [[Open PaaS>AzureのPaaS#u5759581]]についての知識が必要になってくるので、内容は、難しいです。 **[[K8s>Azure Kubernetes Service (AKS)#x4a72daa]]のポイント [#vf319a19] ***採用 [#a3150de4] -[[K8s>#vf319a19]]は難しい。 -以下の目的にて異合しているか? --可搬性 ---[[K8s>#vf319a19]]採用の目的は主に可搬性 ---ただ、可搬性の大部分はコンテナで担保 --マイクロサービス ---アーキテクチャを構成し易い。 ---Ingress - Service - Pod構成 ***基本構成 [#gcac2445] -制御プレーン --Master APIを持っている --Kubernetes CLI(kubectl)から操作する。 --AKSでの変更点は[[コチラ>#n7feb42c]] -実行ノード --VMSS : VM Scale Set~ --Ingress - Service - Pod構成~ ※ Ingress - Serviceの詳細は[[コチラ>AzureのGW / LB的なモノ。#x9b75dd1]]。 ---Pod~ ・Dockerコンテナ~ ・1podに複数コンテナを配置可能 ---Service~ ・L4ロードバランサ~ ・サービス・メッシュを構成 ---Ingress~ ・L7ロードバランサ~ ・必須ではない(オプショナル) --AKSでの変更点は[[コチラ>#u41cdddc]] ***デプロイ方式 [#s7a54baa] -Deploymentでラッピングされている。 -Podを物理ノードに配置する方式 --[[ReplicaSet>https://dotnetdevelopmentinfrastructure.osscons.jp/index.php?Kubernetes#w119c808]]方式~ 通常は、空いている物理ノードに均等に割り当てる。 --[[DemonSet>https://dotnetdevelopmentinfrastructure.osscons.jp/index.php?Kubernetes#e7cc1702]]方式~ すべての、または特定の物理ノードに1つだけ配置する ***名前空間 [#h2084eb7] -*.yamlで名前空間を定義すると、 -Kubernetes CLI(kubectl)から指定が必要になる。 -下位には、[[Service>#gcac2445]]と[[Deployment>#s7a54baa]]がある。 ***kube configファイル [#p6cdc458] -これは、Master APIにアクセスするためのクレデンシャル情報。 -AKSでは「[[az aks get-credentials>Azure Kubernetes Service (AKS)#l3698aeb]]」によって取得する。~ 「--admin」オプションを付与 -- した場合、AKSクラスタ 管理者権限のクレデンシャルを取得 -- しない場合、AKSクラスタ ユーザ権限のクレデンシャルを取得 >※ K8sの権限については、[[コチラ>https://dotnetdevelopmentinfrastructure.osscons.jp/index.php?Kubernetes#zf06c07c]]を参照。 >※ 「--admin」オプションを付与するには、Azure RBACロールの要件がある。 -以下の手順でも登場している。 --[[ダッシュボードによる状態確認>#ie2718ce]] --[[Azure Kubernetes Service (AKS)>Azure Kubernetes Service (AKS)#l3698aeb]] --[[Docker Desktop for Windows>Docker Desktop for Windows#k1b1bc9c]] -kube configファイルの一般的な話は[[コチラ>https://dotnetdevelopmentinfrastructure.osscons.jp/index.php?Kubernetes#ja6b145e]]。 ***ダッシュボード [#df064deb] ダッシュボードを追加して利用可能 **AKSのポイント [#bf07dd3a] AKS : Azure Kubernetes Service ***[[制御プレーン>#gcac2445]] [#n7feb42c] -構築不要 ≒ マネージド -az コマンドで構築可能 -1つのリソース・グループとしてまとめて作成される。 -[[ノードプール>Azure Kubernetes Service (AKS)#yf99ad99]]の機能が拡張されている。 ***[[実行ノード>#gcac2445]] [#u41cdddc] -構築不要 ≒ マネージド -az コマンドで構築可能 -1つのリソース・グループとしてまとめて作成される。 -[[ノードプール>Azure Kubernetes Service (AKS)#yf99ad99]]から実行ノードが割り当てられる。 ***[[ACR>Azure Container Registry]] [#zbb28090] [[ACR : Azure Container Registry>Azure Container Registry]] -ユーザの作成したプライベートなコンテナを登録する。 -コンテナの置き場所(他のXKE / XKSにもコンテナ・レジストリはある) ***MCR [#u4a1c468] MCR : Microsoft Container Registry -AKSの基本動作に必要な[[実行ノード>#gcac2445]]用のコンテナを登録する。 -コンテナの置き場所(他のXKE / XKSにもコンテナ・レジストリはある) ***[[MCR>Microsoft Container Registry]] [#u4a1c468] *詳細 [#j66a273a] **AKS概要 [#v44909e0] ***内容 [#mafc8374] -[[前述のポイント部分>#q76f87a9]]の説明 -基本的に --[[Azure Cloud Shell]]を使用 --[[名前空間>#h2084eb7]]を利用 -[[チュートリアル>Azure Kubernetes Service (AKS)#f0c15710]]のvoting-appのエビデンスとほぼ同レベル。 ***kubectlによる状態確認 [#o995f76c] -一覧取得 kubectl get <リソース種別> --namespace <名前空間> -詳細取得 kubectl describe <リソース種別> <ID> --namespace <名前空間> -対象削除 kubectl delete <リソース種別> <ID> --namespace <名前空間> ***ダッシュボードによる状態確認 [#ie2718ce] -以下のコマンドを使用する。 --cluster-admin ロールに対して k8s ダッシュボードへのアクセス権限を ---付与 kubectl create clusterrolebinding kubernetes-dashboard -n kube-system --clusterrole=cluster-admin --serviceaccount=kube-system:kubernetes-dashboard ---(削除) kubectl delete clusterrolebinding kubernetes-dashboard -n kube-system --ダッシュボードを開く。 az aks browse --name $AKS_CLUSTER_NAME --resource-group $RG_AKS -ダッシュボードが起動したら[[kube configファイル>#p6cdc458]]のトークンを入力する。 -[[プロキシを上げっぱなしにする必要がある>Docker Desktop for Windows#k1b1bc9c]]ので、 --[[Azure Cloud Shell]]を使用するとブラウザ・ウィンドウを専有する。 --CTRL+Cを実行して停止しないと、再度ダッシュボードを起動できなくなるとか...。 -ココのチュートリアルでは、[[名前空間>#h2084eb7]]を使用しているので、~ ダッシュボード左のペインから[[名前空間>#h2084eb7]]を選択して利用する。 -プロキシを停止するときは以下を行う。 --シェルを使用している場合、CTRL+Cを実行して停止する。 --[[Azure Cloud Shell]]のウィンドウを閉じてしまった場合など、 ps -efl | grep 8001 kill <pid> -参考 --Web ダッシュボードで AKS クラスターを管理する | Microsoft Docs~ https://docs.microsoft.com/ja-jp/azure/aks/kubernetes-dashboard ***基本的トラブルシュート [#k8e497b8] -Service が起動しない --External IP (Public IP) が適切に付与できているかを確認 kubectl get services --namespace <名前空間> --サービスの作成が正しく行えたかどうかのログを確認 kubectl describe services <サービス名> --namespace <名前空間> -Pod が正しく動作しているかを確認したい --Pod のログを確認 kubectl logs <Pod名> --namespace nmssample --Pod 上でコマンドを実行 kubectl exec <Pod名> --namespace nmssample ls --ポート・フォワードしてPod内部動作を確認~ 例) localhost:8000 → コンテナ上の ポート 80 kubectl port-forward <Pod名> --namespace nmssample 8000:80 -Pod が正しく動作しているのに Service の L4LB 経由でアプリが呼び出せない --YAML ファイルの selector の記述が正しいかを確認~ ※ selector は記述が間違っていてもエラーを出さない ***ツールやライブラリ [#p63c7102] -[[Helm>https://dotnetdevelopmentinfrastructure.osscons.jp/index.php?Helm%20Charts]]パッケージマネージャ --Pod, Service, Ingress などの構成を一括で行うことができるパッケージマネージャ --[[K8s>#vf319a19]]リソースのインストール / アンインストールを容易化できるのがメリット -[[nginx>https://dotnetdevelopmentinfrastructure.osscons.jp/index.php?nginx]] --OSS の軽量 Web サーバで、リバースプロキシとしてよく利用される --[[K8s>#vf319a19]]では、簡易な Ingress として利用されることが多い -Istio サービス・メッシュ --マイクロサービスの共通処理を担うサービス・メッシュの定番 --業務用のコンテナ + Istio のコンテナで各 Pod を構成して展開する形で利用 -Prometheus --[[K8s>#vf319a19]]監視ツールの定番 --他の監視ツール(クラスタ基盤の監視ツール)と~ 組み合わせて利用されることが多い -Grafana --グラフィカルなダッシュボードの表示ツールの定番 --Prometheus などと組み合わせて利用される -その他 --Useful Tool for k8s managing and monitoring~ https://github.com/yoshioterada/k8s-Azure-Container-Service-AKS--on-Azure/blob/master/Kubernetes-Workshop8.md **構成のポイント [#bdd009e5] ≒プライベート化のポイント~ (動画も3時間半と長く、内容も濃いので、~ [[Azure]]側も理解しながらだと、一気通貫に1週間位かかる) ***物理インフラ構成 [#s3bedcc6] -実際の物理インフラは、 --K8s~ [[K8sのポイント>#vf319a19]] --Azure~ [[AKSのポイント>#bf07dd3a]] >に分かれる。 -フルコンテナ化~ 現時点では難しい。 --特に、DBサーバが難しい --監視サーバは基盤外が良いケースが多い。 -Kubernetes CLI(kubectl)か、[[Azure CLI]]か。 --Kubernetes CLI(kubectl) ---Ingress - Service - Pod構成 ---ダッシュボード --[[Azure CLI]] ---コンテナ・レジストリ ---マネージド・サービス(PaaS)版のDB ---その他~ ・監視サーバ~ ・機密情報保管庫(Key Vault) ***ネットワーク構成 [#h6e5b109] -ネットワーク分離 --[[CNI方式>https://dotnetdevelopmentinfrastructure.osscons.jp/index.php?%E3%82%B3%E3%83%B3%E3%83%86%E3%83%8A%E3%81%AE%E6%A8%99%E6%BA%96%E4%BB%95%E6%A7%98#j757b1a3]]~ ≒PodのIPアドレスの付与の方式 ---kubenet方式~ 仮想IPを使用して、NAT変換する。 ---Azure CNI方式(&color(red){推奨};)~ PodのIPに[[VNET>Azureの仮想ネットワーク]]のIPが使用されるが、~ Azureの仮想ノードやサービスを利用可能。 --内部設置 ---[[VDC>Azure Virtual Data Center]]内部に配置~ 大量のプライベートIPアドレスを使用してしまう。 ---[[VNET>Azureの仮想ネットワーク]]分離(&color(red){推奨};)~ [[Azure Private Link]]でオンプレ接続する。~ ・すると、プライベートIPアドレスを消費しない。~ ・また、テスト面の構築などの場合にも便利。~ ・[[VNET>Azureの仮想ネットワーク]]からオンプレに入れないのでセキュア -[[制御プレーン>#gcac2445]]のプライベート化 --Master APIのプライベート化 ---[[プライベートAKSクラスタ>Azure Kubernetes Service (AKS)#m0c88b4a]]という機能を使用して、~ Master APIを[[VNET>Azureの仮想ネットワーク]]に引き込み、~ [[VNET>Azureの仮想ネットワーク]]からしかアクセスできなくできる。 ---しかし、~ ・[[ノードプール>Azure Kubernetes Service (AKS)#yf99ad99]]を[[VNET>Azureの仮想ネットワーク]]内に配置するという話ではない。~ (ただし、[[デモ>AKSをセキュアに利用する構築デモ]]では既存の[[VNET>Azureの仮想ネットワーク]]に配置している)~ ・また、ARM APIがパブリックなので、~ Master APIだけプライベートではアンバランス。 --既存のアクセス制限機能を使用(&color(red){推奨};) ---ARM API:~ [[AzADによる条件付きアクセス機能を構成する。>Azure Kubernetes Service (AKS)#t071fa52]] ---Master API:~ [[IPアドレスによるアクセス制限機能>プライベートAKSクラスタを作成する。#p72cc023]] -[[ノードプール>Azure Kubernetes Service (AKS)#yf99ad99]]の経路制限 --入力経路の制限 (Ingress Lockdown)~ ・[[制御プレーン>#gcac2445]]からノードプール~ 不要(出力方向で通信するため)~ ・保守端末からノードプール~ ・インターネット:[[Azure Bastion]]~ ・オンプレ:[[Azure Private Link]]~ ・エンドユーザーからアプリケーション~ コチラは長くなるので、[[コチラ>AzureのGW / LB的なモノ。#if7287ad]]を参照。 --出力経路の制限 (Egress Lockdown)~ ・[[プロキシ的なモノ>Azureのプロキシ的なモノ。]]で制限。~ ・[[基本的に、Azure Firewallを利用する。>Azure Kubernetes Service (AKS)#b5d292ee]]~ ・以下のコマンドでデフォゲ(ELB)を作成しない。~ az aks create ... --outbound-type userDefinedRoutiong ・必要な通信は以下。~ ・Master API~ ・セキュリティ更新~ ・[[MCR>#u4a1c468]]:サービス全体が基本的に安全~ ・[[ACR:ユーザ・テナント毎の制限が必要。>Azure Kubernetes Service (AKS)#qd7391d0]]~ ・各種サービス([[Azure SQL Databaseの制限>Azure Kubernetes Service (AKS)#d14d6d94]]など)~ -参考 --[[オンプレ延伸>FgCF (Financial-grade Cloud Fundamentals)#aed3c834]]環境 --[[OA-LANとAzureのVNETの分離]]。 --Service CIDR、Docker Bridge CIDR ---Service CIDR ---Docker Bridge CIDR --DockerとKubernetesのPodのネットワーキングについてまとめました - baron tech blog~ https://foobaron.hatenablog.com/entry/k8s-pod-networking --Microsoft Docs~ Azure Kubernetes Service (AKS) のドキュメント ---概念 - Azure Kubernetes サービス (AKS) におけるネットワーク~ https://docs.microsoft.com/ja-jp/azure/aks/concepts-network ---操作方法ガイド > ネットワークを構成する~ https://docs.microsoft.com/ja-jp/azure/aks/ ***認証・認可 [#h7815383] -インフラ --Azureポータル, Azure CLI (ARM API)の認証・認可 ---既定で、[[Azure Active Directory]]の認証を要する。 ---追加で、[[前述>#h6e5b109]]の、~ ・[[Azure Active Directory]]による条件付きアクセス機能を構成する。~ ・若しくは、IPアドレス制限 / プライベート化を構成する。 --[[制御プレーン>#gcac2445]]の実行アカウント ---[[SPN方式>AKSクラスタ作成・操作に必要な権限#c8ea8683]] ---[[Managed ID方式>AKSクラスタ作成・操作に必要な権限#i3b0bd60]] --コンテナ・レジストリからのイメージ取得権限 ---[[ACR>#zbb28090]]統合 → [[コチラ>AKSクラスタ作成・操作に必要な権限#z3a90ed1]] ---3RDパーティのコンテナ・レジストリ~ https://kubernetes.io/docs/tasks/configure-pod-container/pull-image-private-registry/ -中間(境界線が引き難い) --K8sダッシュボード, Kubernetes CLI(kubectl) ---「[[az aks get-credentials>Azure Kubernetes Service (AKS)#l3698aeb]]」で[[kube configファイル>#p6cdc458]]を取得 ---必要に応じて、以下の持ち出し対策を行う。~ ・[[Azure Active Directory]]認証と統合する。→ [[コチラ>Azure Kubernetes Service (AKS)#l1d8ceab]]~ ・[[前述>#h6e5b109]]のMaster APIのIPアドレス制限 / プライベート化~ ※ IPアドレス制限 / プライベート化で十分という説もある。 -アプリ --[[AKSユーザ・アプリからのリソース・アクセス>Azure Kubernetes Service (AKS)#qde0f8b9]] ---Secret管理 ---[[Managed ID>Azure Managed ID]] ***基盤保守 [#rd67a39f] -AKSの更新 --AKS基盤は自動~ (マネージド・サービス) ---[[制御プレーン>#gcac2445]] ---[[ノードプール(VMSS)>#gcac2445]] --K8sのバージョンアップは手動~ (AKSとK8sのバージョンの関係が重要) -ノードの更新 --[[実行ノード>#gcac2445]](Linuxノード、Windowsノード)に対して行う。 --OSのセキュリティ・アップデート(Ubuntu)は日次で自動更新される。 --Kuredと言うOSSをK8sにインストールすると、再起動をしてくれる。 --[[ノードプール(VMSS)>#gcac2445]]のローリング・アップデート機能はAKSでは非サポート。 -Podの更新 --コンテナ・レジストリ内のイメージ --イメージ内のアプリ ---アプリ自体 ---ライブラリ >※ 詳細は[[コチラ>Azure Kubernetes Service (AKS)#e755b2b0]] ***開発~デプロイ [#ye9b2134] -一般的な DevOps ワークフロー -金融系等では「PoC → 開発 → 本番」環境分離(セキュリティ境界)を考慮 >※ 詳細は[[コチラ>Azure Kubernetes Service (AKS)#ja9f4fdf]] **[[構築デモ>AKSをセキュアに利用する構築デモ]] [#x9c8bdc8] -[[構成のポイント>#bdd009e5]]を再咀嚼しつつ、デモの内容を理解する感じ。 -[[構成のポイント>#bdd009e5]]の理解が薄いと、何してるのか解らなくなるw。 *参考 [#q2387273] **Microsoft Docs [#tbc75de6] -概念 - Azure Kubernetes Service (AKS) におけるセキュリティ~ https://docs.microsoft.com/ja-jp/azure/aks/concepts-security ***ベスト プラクティス [#r9bfd9d5] -Azure Kubernetes Service (AKS) に関するベスト プラクティス~ https://docs.microsoft.com/ja-jp/azure/aks/best-practices --ネットワークとストレージ ---ネットワーク リソースのベスト プラクティス~ https://docs.microsoft.com/ja-jp/azure/aks/operator-best-practices-network ---ストレージとバックアップに関するベスト プラクティス~ https://docs.microsoft.com/ja-jp/azure/aks/operator-best-practices-storage --マルチテナント ---クラスター分離に関するベスト プラクティス~ https://docs.microsoft.com/ja-jp/azure/aks/operator-best-practices-cluster-isolation ---ID 管理のベスト プラクティス~ https://docs.microsoft.com/ja-jp/azure/aks/operator-best-practices-identity --セキュリティ ---クラスター セキュリティに関するベスト プラクティス~ https://docs.microsoft.com/ja-jp/azure/aks/operator-best-practices-cluster-security ---コンテナー イメージ管理のベスト プラクティス~ https://docs.microsoft.com/ja-jp/azure/aks/operator-best-practices-container-image-management --BCP、BCM ---AKS での事業継続とディザスター リカバリーに関するベスト プラクティス~ https://docs.microsoft.com/ja-jp/azure/aks/operator-best-practices-multi-region --開発者向け ---リソース管理のベストプラクティス~ https://docs.microsoft.com/ja-jp/azure/aks/developer-best-practices-resource-management ---ポッド セキュリティのベスト プラクティス~ https://docs.microsoft.com/ja-jp/azure/aks/developer-best-practices-pod-security **nakama [#icc83da1] -https://twitter.com/nakama00/status/1256070593025196032 --https://www.facebook.com/nobuyuki.akama.5/posts/2947887578638196 >※ YouTubeで限定公開とあるケド、Facebookで公開なのって、実質「公開」って事で良いんだよね? ***技術概要 [#q8c070d7] -YouTube~ https://www.youtube.com/watch?v=PrE3c1ZvL4s -video~ https://nakama.blob.core.windows.net/mskk/2020_04_25_AKS_TechnicalReference_v0.14(video1).zip -ppt~ https://nakama.blob.core.windows.net/mskk/2020_04_25_AKS_TechnicalReference_v0.14(ppt).zip ***構築の要点 [#nfcef196] -YouTube~ https://www.youtube.com/watch?v=PL5MtSVzdI4 -video~ https://nakama.blob.core.windows.net/mskk/2020_04_25_AKS_TechnicalReference_v0.14(video2).zip ***リファレンスアーキテクチャ [#b56bd3dc] -YouTube~ https://www.youtube.com/watch?v=-Mawv15LhQc -video~ https://nakama.blob.core.windows.net/mskk/2020_04_25_AKS_TechnicalReference_v0.14(video3).zip ---- Tags: [[:クラウド]], [[:コンテナ]], [[:Azure]], [[:AKS]], [[:IaC]], [[:セキュリティ]], [[:通信技術]], [[:セキュリティ]], [[:認証基盤]]