More Related Content Similar to Demystifying Identities for Azure Kubernetes Service (20) More from Toru Makabe (20) Demystifying Identities for Azure Kubernetes Service12. AKSにおけるIDの種類
5種類ある
az aks create …
kubectl get … 1
2
4
5
1. AKSクラスター管理者向け(*)
2. AKSクラスターユーザー向け
3. Kubernetesサービスアカウント
4. AKSマスターコンポーネント向け
5. AKSノード、アプリケーション向け
AKS
マスター
AKSノードリソース
AKS関連サービス
主にこの2つでサービス
プリンシパルが使われ
ている
(*)クラスター作成をアプリ(Terraformなど)で実施する場合
に、サービスプリンシパルを使うこともある
3
16. az aks create ¥
--service-principal <appId> ¥
--client-secret <password>
21. az aks create ¥
--service-principal <appId> ¥
--client-secret <password>
サービスプリンシパルに紐づく
Azure AD アプリケーションの
クライアントID
サービスプリンシパルに紐づく
Azure AD アプリケーションの
クライアントシークレット
AKSマスターからAzure ADに対する認証に
必要な情報なので
23. az aks create […] ¥
--service-principal <appId> ¥
--client-secret <password>
サービスプリンシパル作成をAKS作成コマンドにお任せして
割り当てられるロールを確かめてみよう
25. $ az ad sp create-for-rbac […] ¥
--skip-assignment
$ az aks create […] ¥
--service-principal <appId> ¥
--client-secret <password>
ではロールを割り当てずにサービスプリンシパルを作り
それをAKS作成時に指定してみよう
28. 既存リソースをAKSで使う場合に注意
別途ロールを割り当てる必要がある
kubectl apply –f
azure-disk-
pod.yaml AKS
マスター
AKSノードリソースグループ ディスクのある既存リソースグループ
参考: 他の Azure リソースへのアクセスを委任する
サービスプリンシパルに
対し、このディスクを操
作できるロールを割り当
てる必要がある
Microsoft.Compute/disks/read
Microsoft.Compute/disks/write
AKSノードリソースグループの外に
ある既存ディスクをボリュームと
してマウントしたい
ディスクの他ではネットワークやAzure Container
Registry(ACR)、Key Vaultは既存の別リソースグルー
プを使うケースが多い
36. az aks create […] ¥
--attach-acr <ACR Name or ID>
AKS作成時に、サービスプリンシパルへACRPullロールを
割り当てられます
参考: Azure Kubernetes Service から Azure Container Registry の認証を受ける
44. az aks create ¥
--enable-managed-identity
--attach-acr <my ACR Name>
マネージドIDを有効化したクラスター作ってみましょう
(ノードでの動きも見たいのでACRをアタッチします)
53. 例: Azure Monitor for Containers アドオン
ノード上のエージェントから各種監視データを書き込む権限が必要
参考: コンテナーに対する Azure Monitor の概要
54. az aks enable-addons […] ¥
-a monitoring ¥
--workspace-resource-id <Azure Monitor
Workspace Resource ID>
アドオンを有効化してみましょう
62. ロール割り当てのためにIDを取得したい
AKSノード(kubelet) 向けマネージドID
$ az aks show -g rg-aks-sp-eval -n myaks-sp-eval-mi --query “identityProfile”
{
“kubeletidentity”: {
“clientId”: “xxx”,
“objectId”: “yyy”,
"resourceId": "/subscriptions/mysubsctiptionid/resourcegroups/MC_rg-aks-sp-eval_myaks-sp-
eval-mi_japaneast/providers/Microsoft.ManagedIdentity/userAssignedIdentities/myaks-sp-eval-
mi-agentpool"
}
}
ロール割り当てには
objectId を
63. (ご参考) Terraform Attribute
azurerm_kubernetes_cluster
resource "azurerm_key_vault_access_policy" "aks" {
key_vault_id = azurerm_key_vault.sample.id
tenant_id = data.azurerm_client_config.current.tenant_id
object_id =
azurerm_kubernetes_cluster.sample.kubelet_identity.0.object_id
secret_permissions = [
"get",
]
}
AKSマスター(コント
ロールプレーン)
AKSノード(kubelet) AKSノードに割り当てたkubeletマネージドIDに
Key Vaultのシークレット取得権限を付与する例
66. apiVersion: secrets-store.csi.x-k8s.io/v1alpha1
kind: SecretProviderClass
metadata:
name: azure-tls
namespace: ingress-test
spec:
parameters:
usePodIdentity: "false"
useVMManagedIdentity: "true"
userAssignedIdentityID: “CLIENT_ID_OF_MY_MANAGED_ID_FOR_KUBELET"
keyvaultName: “MY_KEYVAULT_NAME"
[snip]
こう指定します
自動作成されるkubeletマネージドIDに、Key Vaultのロー
ルを割り当てて使う例
Azure ADに対する認証を行うIDなので、マネージドIDの
クライアントIDを指定する
なお、Key Vault向けにマネージドIDを新規作成してもOK
そのほうが権限分離の観点では望ましいが、ID作成や維持
に関する負担とのバランスを考慮し判断する