Spring Cloud Kubernetes 構成サーバー

Spring Cloud Kubernetes Config Server は Spring Cloud Config サーバーに基づいており、Kubernetes 構成マップ (英語) およびシークレット (英語) 環境リポジトリを追加します。

これは完全にオプションのコンポーネントです。ただし、既存の環境リポジトリ (Git、SVN、Vault など) に保存されている構成を、Kubernetes 上で実行しているアプリケーションで引き続き利用できます。

デフォルトのイメージは Docker Hub (英語) にあります。これにより、コードやイメージを自分で構築しなくても、Kubernetes にデプロイされた構成サーバーを簡単に取得できます。ただし、構成サーバーの動作をカスタマイズする必要がある場合、またはイメージを自分で構築したい場合は、GitHub のソースコード (英語) から独自のイメージを簡単に構築し、それを使用できます。

構成

Kubernetes 環境リポジトリの有効化

Kubernetes 環境リポジトリを有効にするには、アクティブなプロファイルのリストに kubernetes プロファイルが含まれている必要があります。他のプロファイルをアクティブにして、他の環境リポジトリ実装を使用することもできます。

構成マップとシークレット PropertySources

デフォルトでは、Config Map データのみがフェッチされます。Secret も有効にするには、spring.cloud.kubernetes.secrets.enableApi=true を設定する必要があります。spring.cloud.kubernetes.config.enableApi=false を設定することで、Config Map PropertySource を無効にできます。

追加の名前空間からの構成マップとシークレットデータの取得

デフォルトでは、Kubernetes 環境リポジトリは、それがデプロイされている名前空間から構成マップとシークレットのみを取得します。他の名前空間からのデータを含める場合は、spring.cloud.kubernetes.configserver.config-map-namespaces および / または spring.cloud.kubernetes.configserver.secrets-namespaces を名前空間値のカンマ区切りリストに設定できます。

spring.cloud.kubernetes.configserver.config-map-namespaces および / または spring.cloud.kubernetes.configserver.secrets-namespaces を設定する場合、その名前空間から構成マップおよびシークレットデータを引き続き取得するには、構成サーバーがデプロイされている名前空間を含める必要があります。

Kubernetes のアクセス制御

Kubernetes Config Server は、Kubernetes API サーバーを使用して、Config Map と Secret データを取得します。これを行うには、get および list 構成マップとシークレット (有効化 / 無効化の内容に応じて) を実行する機能が必要です。

デプロイヤムル

以下は、基本的な構成サーバーを Kubernetes にデプロイするために使用できるサンプルデプロイ、サービスおよび権限構成です。

---
apiVersion: v1
kind: List
items:
  - apiVersion: v1
    kind: Service
    metadata:
      labels:
        app: spring-cloud-kubernetes-configserver
      name: spring-cloud-kubernetes-configserver
    spec:
      ports:
        - name: http
          port: 8888
          targetPort: 8888
      selector:
        app: spring-cloud-kubernetes-configserver
      type: ClusterIP
  - apiVersion: v1
    kind: ServiceAccount
    metadata:
      labels:
        app: spring-cloud-kubernetes-configserver
      name: spring-cloud-kubernetes-configserver
  - apiVersion: rbac.authorization.k8s.io/v1
    kind: RoleBinding
    metadata:
      labels:
        app: spring-cloud-kubernetes-configserver
      name: spring-cloud-kubernetes-configserver:view
    roleRef:
      kind: Role
      apiGroup: rbac.authorization.k8s.io
      name: namespace-reader
    subjects:
      - kind: ServiceAccount
        name: spring-cloud-kubernetes-configserver
  - apiVersion: rbac.authorization.k8s.io/v1
    kind: Role
    metadata:
      namespace: default
      name: namespace-reader
    rules:
      - apiGroups: ["", "extensions", "apps"]
        resources: ["configmaps", "secrets"]
        verbs: ["get", "list"]
  - apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: spring-cloud-kubernetes-configserver-deployment
    spec:
      selector:
        matchLabels:
          app: spring-cloud-kubernetes-configserver
      template:
        metadata:
          labels:
            app: spring-cloud-kubernetes-configserver
        spec:
          serviceAccount: spring-cloud-kubernetes-configserver
          containers:
          - name: spring-cloud-kubernetes-configserver
            image: springcloud/spring-cloud-kubernetes-configserver
            imagePullPolicy: IfNotPresent
            env:
                - name: SPRING_PROFILES_INCLUDE
                  value: "kubernetes"
            readinessProbe:
              httpGet:
                port: 8888
                path: /actuator/health/readiness
            livenessProbe:
              httpGet:
                port: 8888
                path: /actuator/health/liveness
            ports:
            - containerPort: 8888