AWS Secrets Manager を Amazon Elastic Kubernetes Service (Amazon EKS) と統合しようとしていますが、エラーが発生します。
簡単な説明
AWS Secrets Manager を Amazon EKS と統合しているときに、ポッドが Running 状態にならなかった場合、エラーが発生することがあります。この問題を解決するには、Secrets Store Container Storage Interface (CSI) ドライバーポッドのログを調べて、実行されていないポッドがないか確認します。
解決方法
シークレットストア CSI ドライバーポッドを次のように表示します。
kubectl --namespace=kube-system get pods -l "app=secrets-store-csi-driver"
シークレットストア CSI ポッドからのログを表示します。
kubectl --namespace=kube-system logs -f -l "app=secrets-store-csi-driver"
次のログは、各ポッドのパフォーマンスが良好であることを示しています。
I1120 20:21:19.135834 1 secrets-store.go:74] Driver: secrets-store.csi.k8s.io
I1120 20:21:19.135857 1 secrets-store.go:75] Version: v0.2.0, BuildTime: 2021-08-12-18:55
I1120 20:21:19.135868 1 secrets-store.go:76] Provider Volume Path: /etc/kubernetes/secrets-store-csi-providers
I1120 20:21:19.135874 1 secrets-store.go:77] GRPC supported providers will be dynamically created
I1120 20:21:19.135895 1 driver.go:80] "Enabling controller service capability" capability="CREATE_DELETE_VOLUME"
I1120 20:21:19.135912 1 driver.go:90] "Enabling volume access mode" mode="SINGLE_NODE_READER_ONLY"
I1120 20:21:19.135922 1 driver.go:90] "Enabling volume access mode" mode="MULTI_NODE_READER_ONLY"
I1120 20:21:19.135938 1 main.go:172] starting manager
I1120 20:21:19.136210 1 server.go:111] Listening for connections on address: //csi/csi.sock
I1120 20:21:18.956092 1 exporter.go:33] metrics backend: prometheus
注: 同じアクションを実行するポッドは、重複するエントリとして表示されます。
volumeMount の SecretProviderClass がポッドと同じ名前空間に存在しない場合、次のエラーを受け取ります。
* Warning FailedMount 3s (x4 over 6s) kubelet, kind-control-plane MountVolume.SetUp failed for volume "secrets-store-inline" : rpc error: code = Unknown desc = failed to get secretproviderclass default/aws, error: secretproviderclasses.secrets-store.csi.x-k8s.io "aws" not found
SecretProviderClass はポッドと同じ名前空間に存在する必要があります。
シークレットストア CSI ドライバーはデーモンセットとしてデプロイされます。CSI ドライバーポッドがノードで実行されていない場合、次のエラーが表示されます。
* Warning FailedMount 1s (x4 over 4s) kubelet, kind-control-plane MountVolume.SetUp failed for volume "secrets-store-inline" : kubernetes.io/csi: mounter.SetUpAt failed to get CSI client: driver name secrets-store.csi.k8s.io not found in the list of registered CSI drivers
ノードが汚染されている場合は、Secrets Store CSI ドライバーデーモンセットにテイントのトラレーションを追加します。
Secrets Store CSI ドライバーポッドをノードで実行できないようにするノードセレクターがないか確認します。
kubectl --namespace=kube-system describe pods -l "app=secrets-store-csi-driver" | grep Node-Selectors*
ポッド内のワーカーノードに関連付けられているラベルを取得します。
kubectl get node --selector=kubernetes.io/os=linux
前述のコマンドの出力を比較して、ラベルがノードセレクターの値と一致していることを確認します。
CSI ドライバーがクラスターにデプロイされたかどうかを確認します。すべてのポッドは Running 状態である必要があります。
次のコマンドを実行します。
kubectl get pods -l app=secrets-store-csi-driver -n kube-system
kubectl get daemonset csi-secrets-store-secrets-store-csi-driver -n kube-system
出力例:
kubectl get csidriver
NAME ATTACHREQUIRED PODINFOONMOUNT MODES AGE
secrets-store.csi.k8s.io false true Ephemeral 110m
上記の出力は、ドライバーがクラスターにデプロイされたことを示しています。secrets-store.csi.k8s.io が見つからない場合は、ドライバを再インストールしてください。
SecretProviderClass がプルしたファイルが 4 メガバイト (MiB) より大きい場合、grpc: received message larger than max (最大サイズよりも大きいメッセージを受信しました) というメッセージを含む FailedMount 警告が表示されることがあります。4 MiB を超える応答を受け入れるようにドライバーを設定できます。より大きな応答を受け入れるには、csi-secrets-store デーモンセットのシークレットストアコンテナに --max-call-recv-msg-size=size in bytes を指定します。
注: size in bytes は、ドライバーが許容するサイズに置き換えます。
それでも問題が解決しない場合は、ログイベントを時系列で確認し、他に障害が発生していないかどうかを確認します。
kubectl get events -n kube-system --sort-by='.metadata.creationTimestamp'