我尝试将 AWS Secrets Manager 与 Amazon Elastic Kubernetes Service (Amazon EKS) 集成,但出现错误。
简短描述
将 AWS Secrets Manager 与 Amazon EKS 集成时,如果容器组(pod)未能进入正在运行状态,就可能出现错误。要解决此问题,请检查 Secrets Store Container Storage Interface (CSI) 驱动程序容器组(pod)中的日志,查看是否存在容器组(pod)无法运行的情况。
解决方法
要显示 Secrets Store CSI 驱动程序容器组(pod),请运行以下命令:
kubectl --namespace=kube-system get pods -l "app=secrets-store-csi-driver"
要显示 Secrets Store CSI 驱动程序容器组(pod)日志,请运行以下命令:
kubectl --namespace=kube-system logs -f -l "app=secrets-store-csi-driver"
以下日志显示各容器组(pod)运行良好:
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
**注意:**执行相同操作的容器组(pod)会显示为重复条目。
如果 volumeMount 中的 SecretProviderClass 与容器组(pod)不在同一个命名空间中,就会出现以下错误:
"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 必须与容器组(pod)存在于同一个命名空间中。
将 Secrets Store CSI 驱动程序部署为进程守护程序集。如果 CSI 驱动程序容器组(pod)未在节点上运行,就会出现以下错误:
"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 驱动程序容器组(pod)在节点上运行的:
kubectl --namespace=kube-system describe pods -l "app=secrets-store-csi-driver" | grep Node-Selectors*
获取与容器组(pod)中 Worker 节点关联的标签:
kubectl get node --selector=kubernetes.io/os=linux
比较上述命令的输出。确保标签与节点选择器值相匹配。
检查 CSI 驱动程序是否已部署到集群,以及所有容器组(pod)是否都处于正在运行状态:
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),可能会收到 FailedMount 警告。其中包括一条消息:grpc: received message larger than max。您可以将驱动程序配置为接受大于 4 MiB 的响应。要接受更大的响应,请在 csi-secrets-store 进程守护程序集中为 Secrets Store Container 指定 --max-call-recv-msg-size=size in bytes。
**注意:**请将 size in bytes 替换为希望驱动程序接受的大小。由于较大的响应会增加 secrets-store 容器的内存资源消耗,因此可能需要提高内存限制。如果问题仍然存在,请按时间顺序查看日志事件,了解是否存在其他故障:
kubectl get events -n kube-system --sort-by='.metadata.creationTimestamp'