Spring Cloud Kubernetes - Spring 启动时未读取配置映射
Spring Cloud Kubernetes - Spring boot not reading config map
我有一个 spring 启动网络应用程序,它只打印一个 属性 在 Kubernetes 的 ConfigMap 中传递的
这是我的主class:
@SpringBootApplication
@EnableDiscoveryClient
@RestController
public class DemoApplication {
private MyConfig config;
private DiscoveryClient discoveryClient;
@Autowired
public DemoApplication(MyConfig config, DiscoveryClient discoveryClient) {
this.config = config;
this.discoveryClient = discoveryClient;
}
@RequestMapping("/")
public String info() {
return config.getMessage();
}
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
}
@RequestMapping("/services")
public String services() {
StringBuilder b = new StringBuilder();
discoveryClient.getServices().forEach((s) -> b.append(s).append(" , "));
return b.toString();
}
}
而 MyConfig
class 是:
@Configuration
@ConfigurationProperties(prefix = "bean")
public class MyConfig {
private String message = "a message that can be changed live";
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
}
基本上,通过调用根资源,我总是得到:
a message that can be changed live
然后调用 /services 我实际上得到了 Kubernetes 服务列表。
我正在创建内容为 kubectl create -f configmap-demo.yml
的 ConfigMap:
apiVersion: v1
kind: ConfigMap
metadata:
name: demo
data:
bean.message: This is an info from k8
部署 kubecetl create -f deploy-demo.yml
内容为:
apiVersion: apps/v1
kind: Deployment
metadata:
name: demo
labels:
app: demo
spec:
replicas: 1
selector:
matchLabels:
app: demo
template:
metadata:
labels:
app: demo
spec:
# this service account was created according to
# https://kubernetes.io/docs/reference/access-authn-authz/rbac/#service-account-permissions
# point 5 - Grant super-user access to all service accounts cluster-wide (strongly discouraged)
serviceAccountName: i18n-spring-k8
containers:
- name: demo
image: aribeiro/sck-demo
imagePullPolicy: Never
env:
- name: JAVA_OPTS
value:
ports:
- containerPort: 8080
volumes:
- name: demo
configMap:
name: demo
问题是在访问根资源时 /
我总是得到默认的硬编码值,而不是 Kubernetes 的 ConfigMap 中定义的值。
示例项目也包含 yaml 文件和 Docker 文件,可在 https://drive.google.com/open?id=107IcwnYIbVpmwVgdgi8Dhx4nHEFAVxV8 获得。
还检查了启动 DEBUG 日志,我没有看到任何错误或线索为什么它不应该工作。
Spring Cloud Kubernetes documentation 不完整。它缺少包含此依赖项以启用从 ConfigMap 加载应用程序属性的指令:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-kubernetes-config</artifactId>
</dependency>
你很接近:
1) 对 ConfigMap 的定义略有不同,因此它包含一个属性文件。例如:
apiVersion: v1
kind: ConfigMap
metadata:
name: demo
data:
demo.properties: |
bean.message: This is an info from k8
2) 将 ConfigMap 挂载为卷:
...
spec:
containers:
- name: demo
...
volumeMounts:
- name: config
mountPath: /demo/config
volumes:
- name: config
configMap:
name: demo
因此,ConfigMap 中定义的 demo.properties
文件将 "appear" 在 运行 容器内的 /demo/config
目录中。
3) 添加@PropertySource
注解到MyConfig
class:
@Configuration
@PropertySource("file:/demo/config/demo.properties")
@ConfigurationProperties(prefix = "bean")
public class MyConfig {
...
}
我有一个 spring 启动网络应用程序,它只打印一个 属性 在 Kubernetes 的 ConfigMap 中传递的
这是我的主class:
@SpringBootApplication
@EnableDiscoveryClient
@RestController
public class DemoApplication {
private MyConfig config;
private DiscoveryClient discoveryClient;
@Autowired
public DemoApplication(MyConfig config, DiscoveryClient discoveryClient) {
this.config = config;
this.discoveryClient = discoveryClient;
}
@RequestMapping("/")
public String info() {
return config.getMessage();
}
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
}
@RequestMapping("/services")
public String services() {
StringBuilder b = new StringBuilder();
discoveryClient.getServices().forEach((s) -> b.append(s).append(" , "));
return b.toString();
}
}
而 MyConfig
class 是:
@Configuration
@ConfigurationProperties(prefix = "bean")
public class MyConfig {
private String message = "a message that can be changed live";
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
}
基本上,通过调用根资源,我总是得到:
a message that can be changed live
然后调用 /services 我实际上得到了 Kubernetes 服务列表。
我正在创建内容为 kubectl create -f configmap-demo.yml
的 ConfigMap:
apiVersion: v1
kind: ConfigMap
metadata:
name: demo
data:
bean.message: This is an info from k8
部署 kubecetl create -f deploy-demo.yml
内容为:
apiVersion: apps/v1
kind: Deployment
metadata:
name: demo
labels:
app: demo
spec:
replicas: 1
selector:
matchLabels:
app: demo
template:
metadata:
labels:
app: demo
spec:
# this service account was created according to
# https://kubernetes.io/docs/reference/access-authn-authz/rbac/#service-account-permissions
# point 5 - Grant super-user access to all service accounts cluster-wide (strongly discouraged)
serviceAccountName: i18n-spring-k8
containers:
- name: demo
image: aribeiro/sck-demo
imagePullPolicy: Never
env:
- name: JAVA_OPTS
value:
ports:
- containerPort: 8080
volumes:
- name: demo
configMap:
name: demo
问题是在访问根资源时 /
我总是得到默认的硬编码值,而不是 Kubernetes 的 ConfigMap 中定义的值。
示例项目也包含 yaml 文件和 Docker 文件,可在 https://drive.google.com/open?id=107IcwnYIbVpmwVgdgi8Dhx4nHEFAVxV8 获得。
还检查了启动 DEBUG 日志,我没有看到任何错误或线索为什么它不应该工作。
Spring Cloud Kubernetes documentation 不完整。它缺少包含此依赖项以启用从 ConfigMap 加载应用程序属性的指令:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-kubernetes-config</artifactId>
</dependency>
你很接近:
1) 对 ConfigMap 的定义略有不同,因此它包含一个属性文件。例如:
apiVersion: v1
kind: ConfigMap
metadata:
name: demo
data:
demo.properties: |
bean.message: This is an info from k8
2) 将 ConfigMap 挂载为卷:
...
spec:
containers:
- name: demo
...
volumeMounts:
- name: config
mountPath: /demo/config
volumes:
- name: config
configMap:
name: demo
因此,ConfigMap 中定义的 demo.properties
文件将 "appear" 在 运行 容器内的 /demo/config
目录中。
3) 添加@PropertySource
注解到MyConfig
class:
@Configuration
@PropertySource("file:/demo/config/demo.properties")
@ConfigurationProperties(prefix = "bean")
public class MyConfig {
...
}