Skip to content

[Feature Proposal] Apollo with Kubernetes Service Discovery #3054

@nobodyiam

Description

@nobodyiam

Is your feature request related to a problem? Please describe.
Apollo作为非常底层的基础设施,对可用性要求非常高,所以从设计之初就极力降低对外部的依赖,其中就包括通过内置Eureka来实现服务发现:

ServerArchitecture

上图是Apollo的整体架构,可以看到Eureka在其中担当了非常重要的角色。
该架构在非K8S环境下比较自然,运行良好。不过在K8S环境下,由于需要配置eureka.service.url,所以采用了statefulset来部署config service,一方面带来了运维的复杂度,另一方面也脱离了k8s自身的服务发现体系,无法享受生态红利,社区中对此也有一些讨论:#2666#2903

Describe the solution you'd like
当部署在Kubernetes环境中,可以借助于K8S原生的Service、健康检查等来实现服务发现和通信,从而可以一方面简化部署复杂度,另一方面可以享受生态红利,如Istio。

image

如上图所示,Eureka已经从整体架构中消失,取而代之的是Kubernetes的Service。为了减少对Client和Portal的影响,依然保留了Meta Service角色负责Config Service和Admin Service的寻址,区别在于在K8S环境下,返回的并不是单节点的地址,而是对应的服务内部域名,客户端在DNS解析后最终通过clusterIp来访问服务。

Describe alternatives you've considered
上述方案最终通过clusterIp来访问服务,对客户端而言,访问的始终是同一个IP,客户端不再有负载均衡逻辑,灵活度有所降低,不过优点是能够无缝对接生态体系,如Istio。
另一种方案是使用spring-cloud-kubernetes,优点是客户端能够获取到Pod列表从而保留负载均衡逻辑,不过缺点是对一些生态工具的引入会有影响。

Metadata

Metadata

Assignees

No one assigned

    Labels

    discussionCategorizes issue as related to discussion

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions