尤里卡和Kubernetes

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".

解决有关Eureka HA配置的进一步问题

每个k8s服务不应该有多个Eureka的pod /副本(请记住,pod是短暂的,您需要eureka服务注册表的可参考IP地址/域名).要实现高可用性(HA),请在每个服务中使用一个pod来启动更多k8s服务.

  • 尤里卡服务1 - >一个吊舱
  • Eureka Service 2 - >另一个单一的pod
  • ..
  • ..
  • Eureka Service n - >另一个单一的pod

所以,现在你已经拥有了每个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:

  • 尤里卡-0.eureka
  • 尤里卡-1.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)