春天云Kubernetes重装计时问题。

问题描述 投票:0回答:1

我偶然发现一个非常微妙的问题,试图为我部署在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

我的应用-配置图.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中使用了以下的依赖关系,我可以成功地将myapp部署到我的K8S集群。

<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集群上。

我有一个预定的任务在打印 propertiesConfig.getMessage() 每10秒。因此,当我的应用程序启动时,我在日志中看到一连串的 "1"。

紧接着,我将我的reload.message ConfigMap的属性改为 "2"。发生了什么?

  • 在不到一秒的时间里,"事件 "被触发,k8s调用了我的actuatorrefresh Spring Boot端点。
  • 我仍然在日志中看到 "1",因为...。
  • configapplication.yml (挂载卷)需要大约10秒的时间来更新,然后我可以在那里看到reload.message=2。
  • '刷新'就发生在几秒钟前,当时音量还没有更新!我尝试了其他组合:模式轮询、策略重启_上下文等。

此外,我还尝试了其他组合:模式轮询,策略重启_上下文,等等。但是... 我肯定要事件+刷新! 这是我们用例所需的解决方案。

我的问题是:我可以设置某种 "延迟 "吗?

  • 我可以为刷新事件设置某种延迟吗? 以便给卷提供同步配置图所需的时间?
  • 我可以在部署中配置ConfigMaps而不使用volumeMounts吗?(如果我现在删除Config Map卷,Spring根本无法从ConfigMap中获取属性)
java spring kubernetes spring-cloud spring-cloud-config
1个回答
0
投票

项目中的application.yml文件和configmap中描述的文件有冲突,不知为何。

我把项目中的那个文件改名为 bootstrap.yml

© www.soinside.com 2019 - 2024. All rights reserved.