Kubernetes 内のセキュリティ構成

名前空間

このプロジェクトで提供されるコンポーネントのほとんどは、名前空間を知っている必要があります。Kubernetes (1.3+) の場合、名前空間はサービスアカウントシークレットの一部として pod で利用できるようになり、クライアントによって自動的に検出されます。以前のバージョンの場合は、環境変数として pod に指定する必要があります。これを簡単に行う方法は次のとおりです。

      env:
      - name: "KUBERNETES_NAMESPACE"
        valueFrom:
          fieldRef:
            fieldPath: "metadata.namespace"

サービスアカウント

クラスター内でよりきめ細かいロールベースのアクセスをサポートする Kubernetes のディストリビューションの場合、spring-cloud-kubernetes で実行される pod が Kubernetes API にアクセスできることを確認する必要があります。デプロイまたは pod に割り当てるサービスアカウントについては、それらのアカウントに正しいロールがあることを確認する必要があります。

要件に応じて、次のリソースに対する getlistwatch 権限が必要になります。

表 1: Kubernetes リソースの権限
依存 リソース

spring-cloud-starter-kubernetes-fabric8

pods、サービス、エンドポイント

spring-cloud-starter-kubernetes-fabric8-config

構成マップ、シークレット

spring-cloud-starter-kubernetes-client

pods、サービス、エンドポイント

spring-cloud-starter-kubernetes-client-config

構成マップ、シークレット

開発目的で、cluster-reader アクセス許可を default サービスアカウントに追加できます。本番システムでは、より詳細な権限を提供することが必要になる場合があります。

次のロールと 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: ""