Перезагрузка Spring Cloud Kubernetes ConfigMap не работает

Я играл с Kubernetes в Minikube. Я смог развернуть пример приложения с весенней загрузкой в ​​Kubernetes.

Я изучаю Kubernetes configMap. Я мог успешно запустить приложение весенней загрузки с помощью весеннего облачного стартера и выбрать ключи свойств из карты конфигурации. До сих пор мне удается.

Проблема, с которой я столкнулся в настоящее время, - это перезагрузка configmap.

Вот моя конфигурационная карта:

ConfigMap.yaml

 apiVersion: v1
kind: ConfigMap
metadata:
  name: minikube-sample
  namespace: default
data:
  app.data.name: name
  application.yml: |-
    app:
      data:
        test: test

bootstrap.yaml

management:
    endpoint:
        health:
            enabled: true
        info:
            enabled: true
        restart:
            enabled: true
spring:
    application:
        name: minikube-sample
    cloud:
        kubernetes:
            config:
                enabled: true
                name: ${spring.application.name}
                namespace: default
            reload:
                enabled: true

HomeController:

package com.minikube.sample.rest.controller;

import com.fasterxml.jackson.databind.ObjectMapper;
import com.minikube.sample.properties.PropertiesConfig;
import lombok.Getter;
import lombok.Setter;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Lookup;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

/**
 * @author Gorantla, Eresh
 * @created 06-12-2018
 */
@RestController
@RequestMapping("/home")
public class HomeResource {

    @Autowired
    PropertiesConfig config;

    @GetMapping("/data")
    public ResponseEntity<ResponseData> getData() {
        ResponseData responseData = new ResponseData();
        responseData.setId(1);
        responseData.setName(config.getName());
        responseData.setPlace("Hyderabad");
        responseData.setValue(config.getTest());
        return new ResponseEntity<>(responseData, HttpStatus.OK);
    }

    @Getter
    @Setter
    public class ResponseData {
        private String name;
        private Integer id;
        private String place;
        private String value;
    }
}

deployment.yaml

apiVersion: apps/v1
kind: Deployment
metadata:
  name: minikube-sample
  namespace: default
spec:
  selector:
      matchLabels:
        app: minikube-sample

  replicas: 1
  template:
    metadata:
      labels:
        app: minikube-sample
    spec:
      containers:
        - name: minikube-sample
          image: minikube-sample:latest
          imagePullPolicy: Never
          ports:
            - containerPort: 8080
          env:
            - name: env.namespace
              value: default
          volumeMounts:
            - name: config
              mountPath: /config
      volumes:
        - name: config
          configMap:
            name: minikube-sample

Я использовал @ConfigurationProperties для перезагрузки свойств.

Зависимости

 <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-kubernetes</artifactId>
            <version>1.1.0.RELEASE</version>
        </dependency>

        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-kubernetes-config</artifactId>
            <version>1.1.0.RELEASE</version>
        </dependency>

Что я сделал? Я просмотрел весеннюю облачную документацию. «Роль просмотра в учетной записи службы необходима для прослушивания изменений карты конфигурации». Затем я создал роль просмотра кластера с помощью следующей команды

C:\Users\eresh.gorantla\apps\minikube-sample\src\main\fabric8 (master -> origin)
λ kubectl create clusterrolebinding minikube-sample --clusterrole=view --serviceaccount=default:minikube --namespace=default
clusterrolebinding.rbac.authorization.k8s.io/minikube-sample created

Но когда я обновляю конфигурационную карту в кубернетах, свойства не перезагружаются на лету. Я подозреваю, что что-то не так в привязке кластера. Пожалуйста, поделитесь своими мыслями. Любая помощь приветствуется.


person Eresh    schedule 17.12.2019    source источник
comment
У вас была ошибка? Какую версию K8s вы используете?   -  person PjoterS    schedule 18.12.2019


Ответы (3)


Для развертывания не настроено serviceAccountName, поэтому используется учетная запись службы default. Однако команда в вопросе - kubectl create clusterrolebinding ... --serviceaccount=default:minikube... - предназначена для учетной записи с именем minikube в пространстве имен default.

Более того, создание clusterrolebinding может быть "слишком большим", когда rolebinding для пространства имен будет работать.

Поскольку Развертывание предназначено для пространства имен default (metadata.namespace: default), это должно создать правильный rolebinding для предоставления разрешения только на чтение учетной записи default:

kubectl create rolebinding default-sa-view \
  --clusterrole=view \
  --serviceaccount=default:default \
  --namespace=default

Для справки см. Использование авторизации RBAC.

person gears    schedule 17.12.2019

Спасибо gears за ваш ответ. Связывания ролей достаточно с представлением роли в пространстве имен, чтобы карта конфигурации была доступна в контейнере.

Решил проблему с обновлением зависимостей. Версия загрузки Spring с 2.1.8.Release и версия spring могут быть kubernetes 1.1.0.Release для меня не сработали. Подозреваю, что добавлено много зависимостей. Я очистил файл pom, и это сработало.

Pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.2.1.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.minikube.sample</groupId>
    <artifactId>kubernetes-configmap-reload</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <packaging>jar</packaging>
    <name>minikube-sample</name>
    <description>Demo project for Spring Cloud Kubernetes</description>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <java.version>1.8</java.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-kubernetes-config</artifactId>
            <version>1.1.0.RELEASE</version>
        </dependency>

        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.18.4</version>
            <scope>provided</scope>
        </dependency>


        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework.security</groupId>
            <artifactId>spring-security-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>


</project>

Вы можете найти ссылку на репозиторий здесь - https://github.com/ereshzealous/kubernetes-configmap-reload

Спасибо, Эреш

person Eresh    schedule 19.12.2019

Чтобы получить доступ к ConfigMaps и получить события обновления:

  1. см. аннотации к классу свойств конфигурации @Configuration(proxyBeanMethods = false) см. также @RefreshScope о классе свойств конфигурации.

    @Configuration(proxyBeanMethods = false)
    @ConfigurationProperties(prefix = "bean")
    @RefreshScope
    public class ClientConfig {
    
     private String message = "Default Message from java code - to be overwritten from config";
    
     public String getMessage() {...
     public void setMessage(String message) {...
    }
    

2 Добавьте разрешения для доступа к ConfigMaps

kubectl create -f perm.yaml -n <NAMESPACE>

где perm.yaml - это:

  kind: Role
  apiVersion: rbac.authorization.k8s.io/v1
  metadata:
    namespace: yldbg
    name: namespace-reader
  rules:
    - apiGroups: ["", "extensions", "apps"]
      resources: ["configmaps", "pods", "services", "endpoints", "secrets"]
      verbs: ["get", "list", "watch"]
  ---
  kind: RoleBinding
  apiVersion: rbac.authorization.k8s.io/v1
  metadata:
    name: namespace-reader-binding
    namespace: yldbg
  subjects:
  - kind: ServiceAccount
    name: default
    apiGroup: ""
  roleRef:
    kind: Role
    name: namespace-reader
    apiGroup: ""
  • После создания разрешений разверните модули и службы.

  • при изменении карты конфигурации вы увидите событие обновления в журналах модуля.

    EventBasedConfigurationChangeDetector - Detected change in config maps
    EventBasedConfigurationChangeDetector - Reloading using strategy: REFRESH
    PropertySourceBootstrapConfiguration - Located property source: [BootstrapPropertySource {name='bootstrapProperties-configmap.client-svc.myns'}]
    SpringApplication - The following profiles are active: kubernetes
    

by yl

person ylev    schedule 21.03.2021
comment
Для меня установка разрешения на доступ к ConfigMaps (в моем случае в пространство имен по умолчанию), как описано в этом ответе, сработала! - person marcor92; 08.05.2021