【Istio 控制面】Service / Endpoint / Workload → CDS/EDS:istiod 如何拼出一个 Cluster
内容提要
本文介绍Istio控制面中K8s Service、EndpointSlice和WorkloadEntry如何转换为Envoy的CDS/EDS资源。核心是服务注册聚合层将三种来源统一为model.Service和model.IstioEndpoint,CDS按“Service×端口”生成Cluster,EDS按hostname索引端点。两者通过service_name字符串对齐,WorkloadEntry需特殊开关接入,健康状态无kubelet兜底。
延伸解读
命名对齐是排障关键
CDS 与 EDS 通过 service_name 字符串对齐,而非外键约束。若命名算法不一致,会出现“有 Cluster 无端点”的现象。排障时应先核对 CDS 中的 service_name 与 EDS 响应资源名是否逐字相同,而不是先怀疑网络问题。
WorkloadEntry 的特殊性
WorkloadEntry 接入 EDS 需显式开启 EnableK8SServiceSelectWorkloadEntries 开关,且健康状态无 kubelet 兜底,依赖运维维护。生产常见故障是 WorkloadEntry 残留导致端点过期,这属于输入数据过期,而非生成逻辑 bug。
多来源冲突的规避
多个注册来源对同一 hostname 冲突时,聚合层优先级规则未官方明确排序。多数团队靠约定规避,即避免对同一 hostname 同时使用多种注册方式,而不是依赖工具告警。
Q&A
Istio 中 K8s Service、EndpointSlice 和 WorkloadEntry 是如何转换成 Envoy 的 CDS/EDS 资源的?
在 Istio 控制面中,K8s Service、EndpointSlice 和 WorkloadEntry 首先在服务注册聚合层被统一转换为内部的 model.Service 和 model.IstioEndpoint。CDS 生成器根据 model.Service 按“Service×端口”生成 Cluster,EDS 生成器根据 model.IstioEndpoint 按 hostname 索引生成 ClusterLoadAssignment。CDS/EDS 生成器不直接感知这些来源的差异。
Istio 中 CDS 生成的 Cluster 命名规则是什么?
CDS 生成的 Cluster 命名遵循 direction|port|subset|FQDN 契约,例如 outbound|9080||reviews.default.svc.cluster.local(无 subset 时该字段为空)。默认情况下,每个 Service 的每个端口生成一个 outbound Cluster。
为什么会出现“有 Cluster 无端点”的问题?如何排查?
CDS 与 EDS 通过 service_name 字符串对齐,而不是外键约束。如果命名算法不一致,比如 Cluster 的 service_name 与 EDS 请求的资源名不匹配,就会导致“有 Cluster 无端点”。排查时应先确认 CDS 中的 service_name 字段和 EDS 响应的资源名是否逐字相同。
WorkloadEntry 接入 EDS 有什么特殊要求?
WorkloadEntry 需要通过独立的索引(workloadInstancesIndex)接入,并且必须显式开启特性开关 EnableK8SServiceSelectWorkloadEntries,才会被 collectWorkloadInstanceEndpoints 拉进同一个 Service 的候选端点池。如果关闭该开关,WorkloadEntry 只能通过 ServiceEntry 的 workloadSelector 路径接入。
Istio 如何处理 EndpointSlice 的 100 端点限制和频繁更新?
Kubernetes 默认每个 EndpointSlice 最多包含 100 个端点(可通过 kube-controller-manager 的 --max-endpoints-per-slice 调整,最大 1000)。当端点频繁变化时,istiod 会通过 debounce 机制(PILOT_DEBOUNCE_AFTER 和 PILOT_DEBOUNCE_MAX)合并短时间内的多次变化,减少推送批次。但 debounce 策略是统一的,没有针对 EndpointSlice 粒度单独调参。
多个注册来源对同一 hostname 冲突时,Istio 如何决定最终内容?
当多个注册来源(如 K8s、ServiceEntry)对同一 hostname 提供冲突信息时,聚合层的优先级规则决定最终 Cluster/EDS 的内容,但官方没有明确文档说明排序规则。通常团队通过约定避免对同一 hostname 同时使用多种注册方式,而不是依赖工具告警。