LoginSignup
5
4

More than 3 years have passed since last update.

Azure Key Vault で AKS の secret を管理する

Posted at

Kubernetes の secret リソースの保管先として、Azure Key Vault を使用してみたので手順を残しておきます。

前提

事前準備として、AKS 上に Kubernetes クラスタを作成しておきます。

$ kubectl get node
NAME                     STATUS   ROLES   AGE   VERSION
aks-default-09796230-0   Ready    agent   23h   v1.12.8
aks-default-09796230-1   Ready    agent   23h   v1.12.8

手順

  1. Azure Key Vault にデータを追加
  2. Key Vault FlexVolume を有効化
  3. secret を使用する Pod をデプロイ

1. Azure Key Vault にデータを追加

Azure ポータル上で操作します。
https://docs.microsoft.com/en-us/azure/key-vault/quick-create-portal

Key vaultsリソースを検索し、左上の「追加」をクリック。

image.png

必要項目を入力して Key Vault を作成。
名前はユニークなものにしないといけないようです。

image.png

作成が完了したらデータを登録します。
左の項目の中からSecretsを選択し、「作成」をクリック。

image.png

以下の内容で secret を作成します。

  • Name:test
  • Value:secretdata

image.png

このデータを Pod 上にマウントします。

2. Key Vault FlexVolume を有効化

GitHub の README に沿ってコマンド操作していきます。
https://github.com/Azure/kubernetes-keyvault-flexvol

Key Vault FlexVolume をインストール

作成済みの Kubernetes クラスタに Key Vault FlexVolume をデプロイします。

$ kubectl create -f https://raw.githubusercontent.com/Azure/kubernetes-keyvault-flexvol/master/deployment/kv-flexvol-installer.yaml

作成が完了すると、クラスタ上の各ノードに Pod が配置されます。

$ kubectl get po -n kv
NAME                        READY   STATUS    RESTARTS   AGE
keyvault-flexvolume-nsn6s   1/1     Running   0          23h
keyvault-flexvolume-xh64w   1/1     Running   0          23h

サービスプリンシパルを設定

サービスプリンシパルの情報を、secret としてクラスタに追加します。

※サービスプリンシパルの追加については以下のリンクを参照
https://docs.microsoft.com/en-us/cli/azure/create-an-azure-service-principal-azure-cli

$ kubectl create secret generic kvcreds --from-literal clientid=<CLIENTID> --from-literal clientsecret=<CLIENTSECRET> --type=azure/kv

Key Vault にアクセスするため、サービスプリンシパルにロールの割り当てを行います。
<principalid><YOUR SPN CLIENT ID>は、上の<CLIENTID>と同じ値で大丈夫でした。
<resourcegroup><keyvaultname>には Key Vault 作成時の値を入力します。

az role assignment create --role Reader --assignee <principalid> --scope /subscriptions/<subscriptionid>/resourcegroups/<resourcegroup>/providers/Microsoft.KeyVault/vaults/<keyvaultname>

az keyvault set-policy -n $KV_NAME --key-permissions get --spn <YOUR SPN CLIENT ID>
az keyvault set-policy -n $KV_NAME --secret-permissions get --spn <YOUR SPN CLIENT ID>
az keyvault set-policy -n $KV_NAME --certificate-permissions get --spn <YOUR SPN CLIENT ID>

3. secret を使用する Pod をデプロイ

GitHub のサンプルコードを修正してマニフェストを作成します。

test-pod.yaml
apiVersion: v1
kind: Pod
metadata:
  name: nginx-flex-kv
spec:
  containers:
  - name: nginx-flex-kv
    image: nginx
    volumeMounts:
    - name: test
      mountPath: /kvmnt
      readOnly: true
  volumes:
  - name: test
    flexVolume:
      driver: "azure/kv"
      secretRef:
        name: kvcreds
      options:
        usepodidentity: "false"
        keyvaultname: "testkeyvault-aks"
        keyvaultobjectnames: test
        keyvaultobjecttypes: secret
        resourcegroup: "testresourcegroup"
        subscriptionid: ""
        tenantid: ""

subscriptionidtenantidを環境に合わせて設定します。
tenantidはリンクを参考に取得してください。
https://stackoverflow.com/questions/26384034/how-to-get-the-azure-account-tenant-id

マニフェストを使用して Pod をデプロイします。

$ kubectl apply -f test-pod.yaml

$ kubectl get po
NAME                                                  READY   STATUS    RESTARTS   AGE
nginx-flex-kv                                         1/1     Running   0         5h25m

secret を確認

Pod 上で secret を取得してみます。
マウント先は/kvmnt/testになります。

$ kubectl exec -it nginx-flex-kv cat /kvmnt/test
secretdata

おまけ

マウント先のファイル名は、flexVolume のオプションにkeyvaultobjectaliases:をつけることで変更できます。

test-pod.yaml(一部)
    flexVolume:

      options:
        keyvaultobjectnames: test
        keyvaultobjectaliases: "secret.json"

上のようにエイリアスを設定すると、secret.jsonファイルにマウントされます。

$ kubectl exec -it nginx-flex-kv cat /kvmnt/secret.json
secretdata
5
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
4