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 权限:
表 1. Kubernetes 资源权限
| 依赖项 | 资源 | 
|---|---|
| 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 | 
出于开发目的,你可以向 default 服务账户添加 cluster-reader 权限。在生产系统中,你可能希望提供更细粒度的权限。
以下 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: ""