在k8s中使用Spring Boot重新加载Configmap

在k8s中使用Spring Boot重新加载Configmap

事件如何到达Spring Boot?Kubernetes是否知道我们的Spring Boot应用程序?

技术开发 编程 技术框架 技术发展

 

在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事件混淆。

image.png


在上方可以看到在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

它返回新值。

技术开发 编程 技术框架 技术发展