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