在k8s中使用Spring Boot重新加载Configmap
事件如何到达Spring Boot?Kubernetes是否知道我们的Spring Boot应用程序?
在Kubernetes中,configmap用于保留应用程序的属性。一旦Spring应用程序由于属性文件中的更改而需要重新启动才能生效。现在,借助fabric8 Kubernetes客户端在云中,不再需要重新启动。我们可以将配置更改反映到Spring Boot live中,而无需停机。
有两种重载模式:轮询和事件。顾名思义,轮询意味着会定期轮询Kubernetes API。事件更有效,因为它在configmap更改时生效。我们将在这篇文章中介绍事件模式的重新加载。
事件如何到达Spring Boot?Kubernetes是否知道我们的Spring Boot应用程序?否。请勿将此事件与Kubernetes事件混淆。
在上方可以看到在Spring Boot和Kubernetes API Server之间使用了Websocket。假设在此示例中使用名称空间“ default”,则此地址中对响应的更改将反映到KubernetesClient https:// {api_server_clusterip} / api / v1 / namespaces / default / configmaps / k8s-live-reload-configmap。如果kube-proxy不允许WebSocket,则HttpClient将对API Server进行轮询。
在Spring端,给出bootstrap.yaml重载模式和configmap名称。我故意禁用了执行器端点,因为大多数示例都包含执行器端点,但是由于fabric8-client在内部刷新Bean,因此不需要执行器端点。但是在pom.xml中,由于fabric8-config依赖于执行器配置类,因此需要执行器依赖性。 看例子
spring:
application:
name: k8s-live-reload-example
cloud:
kubernetes:
reload:
enabled: true
mode: event
config:
sources:
- name: k8s-live-reload-configmap
management:
endpoints:
enabled-by-default: false #actuator endpoints disabled in order to show it is not required to reload config
用@ConfigurationProperties注释的Bean被刷新。
@Configuration
@ConfigurationProperties(prefix = "bean" )
@Data
public class Config {
private String testvalue;
}
运行示例
我们需要构建应用程序映像并将其推送到Docker,而Kubernetes需要查看该映像。我建议使用Minikube 1.16.0。由于DNS和VM(Hyper-V,VirtualBox),以前的版本存在问题。该版本允许将minikube作为docker容器运行。可以从这里下载:https : //github.com/kubernetes/minikube/releases假设您没有落后于代理或VPN(您可能有网络问题),请在安装后使用此命令启动minikube。您必须正在运行docker。
minikube start --driver=docker
这将下载图像并启动minikube。然后安装kubectl:https ://kubernetes.io/docs/tasks/tools/install-kubectl
首先,我们需要角色绑定来查询API服务器。否则KubernetesClient无法访问API服务器。默认为此处的命名空间。
kubectl create rolebinding default-sa-view --clusterrole=view --serviceaccount=default:default --namespace=default
获取示例项目
git clone https://github.com/gungor/springboot-k8s-configmap-reload-example.git
cd springboot-k8s-configmap-reload-example
现在将名为“ k8s-live-reload-configmap”的配置映射添加到kubernetes
kubectl apply -f src/k8s/config-map.yml
在活动的Shell中切换到kubernetes docker守护进程,以使Kubernetes到达应用程序映像。运行以下命令,然后运行输出中的最后一条命令。
minikube docker-env
构建应用程序映像
mvn clean install spring-boot:build-image
部署和服务
kubectl create deployment liveconfig-demo --image=springboot-configmap-livereload-example:0.0.1-SNAPSHOT
kubectl create service clusterip liveconfig-demo --tcp=8080:8080
测试
现在在更改配置和服务之前查看config
kubectl get service liveconfig-demo #copy CLUSTER-IP returned from this command
minikube ssh
curl http://CLUSTER-IP:8080/liveconfigtest
它应该返回oldvalue。现在,通过下面的命令或通过minikube仪表板编辑配置映射
kubectl edit configmap k8s-live-reload-configmap
编辑configmap后,重新检查应用程序
minikube ssh
curl http://CLUSTER-IP:8080/liveconfigtest
它返回新值。