gpt4 book ai didi

java - Spring Cloud Kubernetes 重新加载时序问题

转载 作者:行者123 更新时间:2023-12-01 18:07:42 33 4
gpt4 key购买 nike

我在尝试为部署到 K8S 的应用程序实现 ConfigMap 属性源实时重新加载时偶然发现了一个非常微妙的问题。

以下是我当前项目中的一些配置片段:

application.yaml

spring:
application:
name: myapp
cloud:
kubernetes:
config:
enabled: true
name: myapp
namespace: myapp
sources:
- namespace: myapp
name: myapp-configmap
reload:
enabled: true
mode: event
strategy: refresh
refresh:
refreshable:
- com.myapp.PropertiesConfig
extra-refreshable:
- javax.sql.DataSource

myapp-deployment.yaml

apiVersion: apps/v1
kind: Deployment
metadata:
labels:
name: myapp
name: myapp
namespace: myapp
spec:
replicas: 1
selector:
matchLabels:
name: myapp-backend
strategy:
rollingUpdate:
maxUnavailable: 0
template:
metadata:
labels:
name: myapp-backend
spec:
serviceAccountName: myapp-config-reader
volumes:
- name: myapp-configmap
configMap:
name: myapp-configmap
containers:
- name: myapp
image: eu.gcr.io/myproject/myapp:latest
volumeMounts:
- name: myapp-configmap
mountPath: /config
ports:
- containerPort: 8080
envFrom:
- configMapRef:
name: myapp-configmap
env:
- name: DATASOURCE_PASSWORD
valueFrom:
secretKeyRef:
name: myapp-db-credentials
key: password

myapp-configmap.yml

apiVersion: v1
kind: ConfigMap
metadata:
name: myapp-configmap
namespace: myapp
data:
SPRING_PROFILES_ACTIVE: dtest
application.yml: |-
reload.message: 1

PropertiesConfig.java

@Data
@Configuration
@ConfigurationProperties(prefix = "reload")
public class PropertiesConfig {

private String message;

}

我在我的 Maven POM 中使用以下依赖项:

<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.2.4.RELEASE</version>
</parent>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-kubernetes-config</artifactId>
<version>1.1.1.RELEASE</version>
</dependency>

我可以成功地将 myapp 部署到我的 K8S 集群。

我有一个计划任务,每 10 秒打印一次 propertiesConfig.getMessage() 。因此,当 myapp 启动时,我在日志中看到一系列“1”。

紧接着,我将 reload.message ConfigMap 的属性更改为“2”。会发生什么?

  • 在不到一秒的时间内,“事件”被触发,k8s 调用我的/actuator/refresh Spring Boot 端点;
  • 我仍然在日志中看到“1”,因为......
  • /config/application.yml(已安装卷)大约需要 10 秒才能更新,然后我可以在其中看到 reload.message=2
  • “刷新”发生在几秒钟前,当时卷尚未更新!

此外,我还尝试了其他组合:模式轮询、策略restart_context等等。但是...我确实想要事件+刷新!这是我们的用例所需的解决方案。

我的问题:

  • 我可以为刷新事件设置某种“延迟”,以便为卷提供同步 ConfigMap 所需的时间吗?
  • 我可以在部署内部配置我的 ConfigMap 而不使用volumeMounts吗? (如果我现在删除配置映射卷,Spring 根本不会从 ConfigMap 中获取属性)

最佳答案

项目中的application.yml文件和configmap中描述的文件不知何故发生冲突。

我通过将项目中的重命名为 bootstrap.yml

解决了这个问题

关于java - Spring Cloud Kubernetes 重新加载时序问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60531083/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com