Spring Boot在K8s中使用ConfigMap外部化配置权限报错如何解决
问题原因
报错是因为Pod使用的webapp-production命名空间下默认default服务账号,没有配置对应命名空间内ConfigMap资源的访问权限,属于标准的Kubernetes RBAC权限缺失问题,按以下步骤配置即可修复:
操作步骤
- 第一步:创建专用服务账号(生产环境不建议直接使用default账号,避免权限溢出)
apiVersion: v1 kind: ServiceAccount metadata: name: webapp-sa namespace: webapp-production
将上述内容保存为webapp-sa.yaml后执行kubectl apply -f webapp-sa.yaml完成创建。
- 第二步:创建角色,授予ConfigMap资源的基础读取权限
Spring Cloud Kubernetes启动时需要对ConfigMap执行get、list、watch三类操作,角色配置如下:
apiVersion: rbac.authorization.k8s.io/v1 kind: Role metadata: namespace: webapp-production name: configmap-reader rules: - apiGroups: [""] resources: ["configmaps"] verbs: ["get", "list", "watch"]
保存为configmap-reader-role.yaml后执行kubectl apply -f configmap-reader-role.yaml。
- 第三步:绑定角色与服务账号
通过RoleBinding将刚才创建的读取权限授予webapp-sa账号:
apiVersion: rbac.authorization.k8s.io/v1 kind: RoleBinding metadata: name: webapp-configmap-binding namespace: webapp-production subjects: - kind: ServiceAccount name: webapp-sa namespace: webapp-production roleRef: kind: Role name: configmap-reader apiGroup: rbac.authorization.k8s.io
保存为configmap-reader-binding.yaml后执行kubectl apply -f configmap-reader-binding.yaml。
- 第四步:修改应用部署配置,指定使用新的服务账号
在Spring Boot应用对应的Deployment的Pod spec段添加serviceAccountName字段,指定使用刚创建的webapp-sa:
spec: serviceAccountName: webapp-sa containers: - name: webapp image: 你的应用镜像地址 # 其余原有容器配置保持不变
重新发布应用后权限报错就会消失。
额外注意点
你当前通过--from-file=config.yaml创建的ConfigMap,存储配置的key默认是config.yaml,Spring Cloud Kubernetes默认只会读取key为application.properties/application.yaml、或者和应用名同名key下的配置,就算权限配置正确也会读不到值。两种修复方式选其一即可:
- 创建ConfigMap时显式指定key:执行命令改成
kubectl create configmap webapp --namespace webapp-production --from-file=application.yaml=config.yaml - 在应用配置中指定读取的ConfigMap data key:添加配置
spring.cloud.kubernetes.config.sources[0].data-key=config.yaml
内容的提问来源于stack exchange,提问作者Joaquín L. Robles
相关产品推荐
相关产品推荐

