Spring Cloud Kubernetes 配置伺服器

Spring Cloud Kubernetes 配置伺服器基於 Spring Cloud Config Server,併為 Kubernetes 的 Config MapsSecrets 添加了一個環境倉庫

此元件是完全可選的。但是,它可以讓你繼續利用可能儲存在現有環境倉庫(Git、SVN、Vault 等)中的配置,用於你在 Kubernetes 上執行的應用。

Docker Hub 上提供了一個預設映象,可以讓你輕鬆地在 Kubernetes 上部署 Config Server,而無需自己構建程式碼和映象。但是,如果你需要定製 Config Server 的行為或偏好自己構建映象,可以輕鬆地從 GitHub 上的原始碼構建你自己的映象並使用它。

配置

啟用 Kubernetes 環境倉庫

要啟用 Kubernetes 環境倉庫,kubernetes profile 必須包含在活動 profiles 列表中。你也可以啟用其他 profiles 來使用其他的環境倉庫實現。

Config Map 和 Secret PropertySources

預設情況下,只會抓取 Config Map 資料。要同時啟用 Secrets,你需要設定 spring.cloud.kubernetes.secrets.enableApi=true。你可以透過設定 spring.cloud.kubernetes.config.enableApi=false 來停用 Config Map PropertySource

從附加名稱空間抓取 Config Map 和 Secret 資料

預設情況下,Kubernetes 環境倉庫只會從其部署所在的名稱空間抓取 Config Map 和 Secrets。如果你想包含來自其他名稱空間的資料,可以將 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,你需要包含 Config Server 部署所在的名稱空間,以便繼續從該名稱空間抓取 Config Map 和 Secret 資料。

使用 Spring Vault 的高階特性

為了使用 **Spring Cloud Config Server** 的一些更高階的 Spring Vault 特性,必須在 classpath 中包含 spring-vault-core。預設情況下,Spring Cloud Kubernetes 可以生成用於將 Config Server 部署到 Kubernetes 的 Docker 映象,但它不包含 spring-vault-core。如果你需要 spring-vault-core 來啟用 Config Server 中的特定功能,可以在執行 Maven 構建時透過啟用 vault Maven profile 來構建自己的 Docker 映象版本。

示例

$ ../../mvnw clean install -Pvault

Kubernetes 訪問控制

Kubernetes Config Server 使用 Kubernetes API 伺服器來抓取 Config Map 和 Secret 資料。為此,它需要具有 getlist Config Map 和 Secrets 的能力(取決於你啟用或停用了什麼)。

部署 Yaml

下面是一個示例部署、服務和許可權配置,你可以使用它來將一個基本的 Config Server 部署到 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