And*_*ter 28 spring-boot kubernetes microservices netflix-eureka spring-cloud-netflix
我正在整理一个概念证明,以帮助使用Spring Boot/Netflix OSS和Kubernetes一起识别陷阱.这也是为了证明Prometheus和Graphana等相关技术.
我有一个Eureka服务设置,在我的Kubernetes clouster中没有任何问题.这被命名为discovery,并在使用K8添加到K8时被命名为"discovery-1551420162-iyz2c"
kubectl run discovery --image=xyz/discovery-microservice --replicas=1 --port=8761
对于我的配置服务器,我正在尝试使用基于逻辑URL的Eureka,所以在我的bootstrap.yml中
server:
port: 8889
eureka:
instance:
hostname: configserver
client:
registerWithEureka: true
fetchRegistry: true
serviceUrl:
defaultZone: http://discovery:8761/eureka/
spring:
cloud:
config:
server:
git:
uri: https://github.com/xyz/microservice-config
Run Code Online (Sandbox Code Playgroud)
我正在开始使用它
kubectl run configserver --image=xyz/config-microservice --replicas=1 --port=8889
Run Code Online (Sandbox Code Playgroud)
该服务最终运行命名为configserver-3481062421-tmv4d.然后我在配置服务器日志中看到异常,因为它试图找到eureka实例而不能.
我有相同的设置使用docker-compose本地链接,它启动各种容器没有任何问题.
discovery:
image: xyz/discovery-microservice
ports:
- "8761:8761"
configserver:
image: xyz/config-microservice
ports:
- "8888:8888"
links:
- discovery
Run Code Online (Sandbox Code Playgroud)
我怎么能设置像eureka.client.serviceUri这样的东西,这样我的微服务可以在不知道K8集群内的固定IP地址的情况下定位他们的同行?
so-*_*ude 24
我怎样才能设置像eureka.client.serviceUri这样的东西?
您必须在eureka pod/deployments之上提供Kubernetes 服务,然后为您提供可参考的IP地址和端口号.然后使用该可参考地址查找Eureka服务,而不是"8761".
每个k8s服务不应该有多个Eureka的pod /副本(请记住,pod是短暂的,您需要eureka服务注册表的可参考IP地址/域名).要实现高可用性(HA),请在每个服务中使用一个pod来启动更多k8s服务.
所以,现在你已经拥有了每个Eureka的IP /域名(k8s服务的IP)...现在它可以互相注册.
觉得这有点矫枉过正? 如果您的所有服务都在相同的kubernetes名称空间中,那么您可以实现eureka提供的所有服务(除了客户端负载平衡之外的所有服务),尽管k8s服务+ KubeDNS附加组件.阅读Christian Posta的这篇文章
不是每一个群服务的,你可以利用StatefulSets作为斯特凡Ocke指出.
与部署类似,StatefulSet管理基于相同容器规范的Pod.与部署不同,StatefulSet为其每个Pod维护一个粘性标识.这些pod是根据相同的规范创建的,但不可互换:每个pod都有一个持久的标识符,它在任何重新安排时都会保留.
Ste*_*cke 12
关于Kubernetes 中Eureka的HA配置:您可以(同时)为此使用StatefulSet,而不是为每个实例创建服务.StatefulSet为您创建的每个实例保证稳定的网络标识.例如,部署可能类似于以下yaml(StatefulSet +无头服务).根据StatefulSets 的DNS命名规则(假设命名空间是"默认"),这里有两个Eureka实例:
eureka-0.eureka.default.svc.cluster.local和
尤里卡-1.eureka.default.svc.cluster.local
只要您的pod位于同一名称空间中,它们就可以到达Eureka:
注意:示例中使用的docker镜像来自https://github.com/stefanocke/eureka.您可能想要选择或构建自己的.
---
apiVersion: v1
kind: Service
metadata:
name: eureka
labels:
app: eureka
spec:
ports:
- port: 8761
name: eureka
clusterIP: None
selector:
app: eureka
---
apiVersion: apps/v1beta2
kind: StatefulSet
metadata:
name: eureka
spec:
serviceName: "eureka"
replicas: 2
selector:
matchLabels:
app: eureka
template:
metadata:
labels:
app: eureka
spec:
containers:
- name: eureka
image: stoc/eureka
ports:
- containerPort: 8761
env:
- name: MY_POD_NAME
valueFrom:
fieldRef:
fieldPath: metadata.name
# Due to camelcase issues with "defaultZone" and "preferIpAddress", _JAVA_OPTIONS is used here
- name: _JAVA_OPTIONS
value: -Deureka.instance.preferIpAddress=false -Deureka.client.serviceUrl.defaultZone=http://eureka-0.eureka:8761/eureka/,http://eureka-1.eureka:8761/eureka/
- name: EUREKA_CLIENT_REGISTERWITHEUREKA
value: "true"
- name: EUREKA_CLIENT_FETCHREGISTRY
value: "true"
# The hostnames must match with the the eureka serviceUrls, otherwise the replicas are reported as unavailable in the eureka dashboard
- name: EUREKA_INSTANCE_HOSTNAME
value: ${MY_POD_NAME}.eureka
# No need to start the pods in order. We just need the stable network identity
podManagementPolicy: "Parallel"
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
20942 次 |
| 最近记录: |