Spring Cloud Kubernetes Config Server
Spring Cloud Kubernetes Config Server 基于 Spring Cloud Config Server,并添加了用于 Kubernetes Config Maps 和 Secrets 的环境仓库。
该组件完全是可选的。然而,它允许您继续利用可能存储在现有环境仓库(Git、SVN、Vault 等)中的配置,与您在 Kubernetes 上运行的应用程序一起使用。
你可以基于 GitHub 上的源代码 构建 Docker 镜像,并将其部署到 Kubernetes 中。
配置
启用 Kubernetes 环境仓库
要启用 Kubernetes 环境仓库,必须在活动配置文件中包含 kubernetes 配置。您也可以激活其他配置文件以使用其他环境仓库实现。
Config Map 和 Secret PropertySources
默认情况下,仅会获取 Config Map 数据。若要同时启用 Secrets,您需要设置 spring.cloud.kubernetes.secrets.enabled=true。您可以通过设置 spring.cloud.kubernetes.config.enabled=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 功能,必须在类路径中包含 spring-vault-core。默认情况下,Spring Cloud Kubernetes 可以生成用于将 Config Server 部署到 Kubernetes 的 Docker 镜像,但不会在类路径中包含 spring-vault-core。如果您需要 spring-vault-core 来启用 Config Server 中的某些功能,可以在运行 Maven 构建时启用 vault Maven 配置文件来构建自己的 Docker 镜像版本。
示例:
$ ../../mvnw clean install -Pvault
Kubernetes 访问控制
Kubernetes Config Server 使用 Kubernetes API 服务器来获取 Config Map 和 Secret 数据。为此,它需要具备 get 和 list Config Map 和 Secrets 的权限(具体取决于您启用/禁用的功能)。
部署 YAML 文件
以下是一个示例部署、服务和权限配置,可用于将基础配置服务器部署到 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