Kubernetes 中的安全配置
命名空间
本项目提供的大多数组件都需要知道命名空间。对于 Kubernetes (1.3+),命名空间作为服务账号密钥的一部分提供给 Pod,并由客户端自动检测。对于早期版本,需要将其指定为 Pod 的环境变量。一种快速实现方法如下
env:
- name: "KUBERNETES_NAMESPACE"
valueFrom:
fieldRef:
fieldPath: "metadata.namespace"
服务账号
对于支持集群内更细粒度基于角色的访问的 Kubernetes 分发版,您需要确保运行 spring-cloud-kubernetes
的 Pod 有权访问 Kubernetes API。对于您分配给部署或 Pod 的任何服务账号,您都需要确保它们具有正确的角色。
根据要求,您需要对以下资源具有 get
、list
和 watch
权限
依赖 | 资源 |
---|---|
spring-cloud-starter-kubernetes-fabric8 |
pods, services, endpoints |
spring-cloud-starter-kubernetes-fabric8-config |
configmaps, secrets |
spring-cloud-starter-kubernetes-client |
pods, services, endpoints |
spring-cloud-starter-kubernetes-client-config |
configmaps, secrets |
出于开发目的,您可以将 cluster-reader
权限添加到您的 default
服务账号。在生产系统中,您可能希望提供更细粒度的权限。
以下 Role 和 RoleBinding 是 default
账号的命名空间权限示例
kind: Role
apiVersion: rbac.authorization.k8s.io/v1
metadata:
namespace: YOUR-NAME-SPACE
name: namespace-reader
rules:
- apiGroups: [""]
resources: ["configmaps", "pods", "services", "endpoints", "secrets"]
verbs: ["get", "list", "watch"]
---
kind: RoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:
name: namespace-reader-binding
namespace: YOUR-NAME-SPACE
subjects:
- kind: ServiceAccount
name: default
apiGroup: ""
roleRef:
kind: Role
name: namespace-reader
apiGroup: ""