spring boot cloud kubernetes 配置不适用于多个 pod
Posted
技术标签:
【中文标题】spring boot cloud kubernetes 配置不适用于多个 pod【英文标题】:spring boot cloud kubernetes config not working for multiple pods 【发布时间】:2020-05-05 12:52:58 【问题描述】:我正在使用 spring-cloud-starter-kubernetes-all
依赖项从我的 Spring Boot 微服务中读取配置映射并且它工作正常。
修改配置映射后,我正在使用刷新端点
minikube servie list # to get the servive url
curl http://192.168.99.100:30824/actuator/refresh -d -H "Content-Type: application/json"
它按预期工作,应用程序加载配置映射更改。
问题 如果我的应用程序只有 1 个 pod,但当我使用超过 1 个 pod 时,上述工作正常,但只有 1 个 pod 选择更改并非全部。
在下面的示例中,只有我 pod 选择了更改
[message-producer-5dc4b8b456-tbbjn message-producer] Say Hello to the World12431
[message-producer-5dc4b8b456-qzmgb message-producer] Say Hello to the World
minkube 部署
apiVersion: apps/v1
kind: Deployment
metadata:
name: message-producer
labels:
app: message-producer
spec:
replicas: 2
selector:
matchLabels:
app: message-producer
template:
metadata:
labels:
app: message-producer
spec:
containers:
- name: message-producer
image: sandeepbhardwaj/message-producer
ports:
- containerPort: 8080
---
apiVersion: v1
kind: Service
metadata:
name: message-producer
spec:
selector:
app: message-producer
ports:
- protocol: TCP
port: 80
targetPort: 8080
type: LoadBalancer
configmap.yml
kind: ConfigMap
apiVersion: v1
metadata:
name: message-producer
data:
application.yml: |-
message: Say Hello to the World
bootstrap.yml
spring:
cloud:
kubernetes:
config:
enabled: true
name: message-producer
namespace: default
reload:
enabled: true
mode: EVENT
strategy: REFRESH
period: 3000
配置
@ConfigurationProperties(prefix = "")
@Configuration
@Getter
@Setter
public class MessageConfiguration
private String message = "Default message";
rbac
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
namespace: default # "namespace" can be omitted since ClusterRoles are not namespaced
name: service-reader
rules:
- apiGroups: [""] # "" indicates the core API group
resources: ["services"]
verbs: ["get", "watch", "list"]
---
apiVersion: rbac.authorization.k8s.io/v1
# This cluster role binding allows anyone in the "manager" group to read secrets in any namespace.
kind: ClusterRoleBinding
metadata:
name: service-reader
subjects:
- kind: User
name: default # Name is case sensitive
apiGroup: rbac.authorization.k8s.io
roleRef:
kind: ClusterRole
name: service-reader
apiGroup: rbac.authorization.k8s.io
【问题讨论】:
【参考方案1】:发生这种情况是因为当您点击curl http://192.168.99.100:30824/actuator/refresh -d -H "Content-Type: application/json"
时,kubernetes 会通过循环负载平衡将该请求发送到服务后面的其中一个 pod。
您应该通过设置spring.cloud.kubernetes.reload.enabled=true
来使用property source reload feature。这将在配置映射发生更改时重新加载属性,因此您不需要使用刷新端点。
【讨论】:
但是如果我有很多 pod 正在运行,那么这不是一个好方法。我希望所有 pod 立即选择更改。有什么解决方法吗? 在这种情况下,您可以使用重新加载功能。我已经用链接更新了答案。 配置 bean 上是否有 ConfigurationProperties 或 RefreshScope 注释? 您在 pod 日志中遇到任何错误?服务帐户需要有 RBAC 才能访问 pod 和 configmaps 在 pod 上没有错误,并且在这个 git repo 中也有 configurationProperties github.com/sandeepbhardwaj/spring-boot-kubernetes 代码,用于消息生产者以上是关于spring boot cloud kubernetes 配置不适用于多个 pod的主要内容,如果未能解决你的问题,请参考以下文章
Spring Cloud Spring Boot mybatis分布式微服务云架构使用Intellij中的Spring Initializr来快速构建Spring Boot/Cloud工程
Spring Cloud 对应 Spring Boot 版本
spring-boot 指标与 spring-cloud 指标
Spring Cloud Spring Boot mybatis分布式微服务云架构使用Intellij中的Spring Initializr来快速构建Spring Boot/Cloud工程