Kubernetes:EKS 中 Istio Ingress Gateway 负载均衡器配置及常见问题解析

引言

在云原生时代,Kubernetes 已经成为容器编排的事实标准。AWS EKS (Elastic Kubernetes Service) 作为一项完全托管的 Kubernetes 服务,简化了在 AWS 上运行 Kubernetes 的复杂性。Istio 作为服务网格领域的佼佼者,为微服务提供了流量管理、安全性和可观察性等关键能力。

将 Istio Ingress Gateway 部署到 EKS 集群中,可以为集群内的服务提供统一的入口,并实现负载均衡、SSL 终止、路由规则等高级功能。然而,在配置 Istio Ingress Gateway 的负载均衡器时,经常会遇到 EXTERNAL-IP 处于 pending 状态的问题。这里将深入探讨这个问题的原因,并提供详细的解决方案,帮助你更好地理解 EKS、Istio 以及 AWS 负载均衡器之间的关系。

Istio Ingress Gateway 与负载均衡器

Istio Ingress Gateway 本质上是一个 Envoy 代理,部署为一个 Kubernetes Deployment。它通过 Kubernetes Service 对象暴露出来,以便接收外部流量。当我们将 Service 的类型设置为 LoadBalancer 时,Kubernetes 会尝试在底层基础设施中创建一个负载均衡器,将流量转发到 Istio Ingress Gateway 的 Pod。

在 AWS EKS 环境中,这意味着 Kubernetes 会与 AWS API 交互,尝试为你创建一个 Classic Load Balancer (CLB) 或 Network Load Balancer (NLB)。这个负载均衡器将负责接收来自客户端的流量,并将其转发到 Istio Ingress Gateway 的 Pod。

EXTERNAL-IP Pending 的常见原因

当 Istio Ingress Gateway 的 Service 的 EXTERNAL-IP 处于 pending 状态时,通常意味着 Kubernetes 无法成功创建 AWS 负载均衡器。常见原因包括:

  1. AWS 资源配额限制: 你的 AWS 账户可能在当前区域的负载均衡器数量达到了配额上限。
  2. 子网配置问题: EKS 集群的 worker 节点所在的子网配置不正确,导致无法创建负载均衡器。
  3. IAM 权限不足: EKS 集群的 worker 节点所使用的 IAM 角色缺少创建负载均衡器所需的权限。
  4. Service Annotation 错误: Istio Ingress Gateway 的 Service 定义中可能存在错误的 Annotation。

子网配置:关键所在

在这些原因中,子网配置问题是最常见也是最容易被忽视的。EKS 需要通过特定的 Kubernetes 标签来识别哪些子网可以用于创建负载均衡器。

公有子网与私有子网

  • 公有子网: 如果你希望负载均衡器可以从公网访问,那么 worker 节点必须位于公有子网中,并且这些子网的路由表需要配置指向 Internet Gateway (IGW) 的路由。
  • 私有子网: 如果你希望负载均衡器只能在 VPC 内部访问,那么 worker 节点可以位于私有子网中。但是,为了让 Kubernetes 能够与 AWS API 通信以创建负载均衡器,私有子网需要配置 NAT Gateway 或 NAT 实例。

子网标签:Kubernetes 与 AWS 的桥梁

EKS 使用以下 Kubernetes 标签来识别子网:

  • 公有子网:

    复制代码
    kubernetes.io/role/elb: 1
  • 私有子网:

    复制代码
    kubernetes.io/role/internal-elb: 1
  • 共享子网(公有和私有子网都有):

    复制代码
    kubernetes.io/cluster/<cluster-name>: shared

    <cluster-name> 替换为你的 EKS 集群名称。

kubernetes.io/role/elbkubernetes.io/role/internal-elb

  • kubernetes.io/role/elb=1:表示该子网可以用于创建面向公网的负载均衡器 (External Load Balancer)。
  • kubernetes.io/role/internal-elb=1:表示该子网可以用于创建仅在 VPC 内部访问的负载均衡器 (Internal Load Balancer)。

kubernetes.io/cluster/<cluster-name>=shared

这个标签表示该子网是你的 EKS 集群的一部分,并且可以被 Kubernetes 使用。无论是公有子网还是私有子网,都需要添加这个标签。

案例分析:解决 EXTERNAL-IP Pending 问题

如图,我们遇到了一个典型的 EXTERNAL-IP Pending 问题。错误信息如下:

复制代码
FailedBuildModel due to unable to resolve at least one subnet (0 match VPC and tags: [kubernetes.io/role/internal-elb])

这个错误表明 Kubernetes 在尝试创建内部负载均衡器时,找不到任何具有 kubernetes.io/role/internal-elb=1 标签的子网。

解决方案:

  1. 确定你的 EKS 集群使用的私有子网的 ID。
  2. 为这些子网添加以下标签:
    • kubernetes.io/role/internal-elb: 1
    • kubernetes.io/cluster/<cluster-name>: shared

通过为子网添加正确的标签,Kubernetes 就能够找到合适的子网来创建内部负载均衡器,从而解决 EXTERNAL-IP Pending 的问题。

总结

在 EKS 中配置 Istio Ingress Gateway 的负载均衡器时,子网配置是至关重要的一步。理解公有子网、私有子网以及 Kubernetes 子网标签的含义和作用,可以帮助我们避免常见的 EXTERNAL-IP Pending 问题。

希望本文能够帮助大家更好地理解 EKS、Istio 以及 AWS 负载均衡器之间的关系。如果读者在配置过程中遇到任何问题,欢迎在评论区留言,我会尽力为他解答。

相关推荐
liweiweili12611 小时前
K8S中关于容器对外提供服务网络类型
容器·kubernetes
小白不想白a11 小时前
【ansible/K8s】K8s的自动化部署源码分享
kubernetes·自动化·ansible
云道轩12 小时前
初次尝试在kubernetes 1.31 上安装 人工智能模型运行平台 llm-d
人工智能·kubernetes·llm-d
缘的猿12 小时前
Kubernetes 安全管理:认证、授权与准入控制全面解析
java·安全·kubernetes
龙茶清欢12 小时前
在 Spring Cloud Gateway 中实现跨域(CORS)的两种主要方式
java·spring boot·spring cloud·微服务·gateway
幻灭行度15 小时前
CKAD-CN 考试知识点分享(16) 修改 container 名称
kubernetes
走上未曾设想的道路15 小时前
k8s集群与gitlab registry连接
容器·kubernetes·gitlab
虚伪的空想家19 小时前
K8S部署的ELK分片问题解决,报错:unexpected error while indexing monitoring document
运维·elk·云原生·容器·kubernetes·报错·eck
laolitou_10241 天前
CentOS7安装部署K8s
云原生·容器·kubernetes
Q飞了1 天前
k8s里三种探针的使用场景
云原生·容器·kubernetes