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/elb 与 kubernetes.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 负载均衡器之间的关系。如果读者在配置过程中遇到任何问题,欢迎在评论区留言,我会尽力为他解答。

相关推荐
小小龙学IT15 小时前
Kubernetes 深度实践:架构、API 与避坑指南
容器·架构·kubernetes
MrSYJ20 小时前
别人再问你路由表是啥,这篇文章摔它脸上
docker·云原生·kubernetes
Wang's Blog20 小时前
Java框架 SpringCloud 快速入门: Gateway 路由的过滤器配置
java·spring cloud·gateway
吴声子夜歌21 小时前
Nginx应用与运维——Nginx在Kubernetes中的应用(一)
运维·nginx·kubernetes
吴声子夜歌1 天前
Nginx应用与运维——Nginx在Kubernetes中的应用(三)
运维·nginx·kubernetes
sbjdhjd1 天前
云安全 | Docker 容器逃逸复盘(一):从隔离边界到运行时链路,如何确认自己身处容器
网络安全·docker·云原生·容器·kubernetes·云计算·云安全
吴声子夜歌1 天前
Nginx应用与运维——Nginx在Kubernetes中的应用(二)
运维·nginx·kubernetes
寻林写彡2 天前
01| 裸机部署 K8S:从零搭建生产可用集群
云原生·kubernetes
wzq11_6662 天前
Kubernetes集群——Service篇(详细讲解!!!)
云原生·容器·kubernetes
小匠石钧知3 天前
06_在k8s集群中安装MetalLB实现LoadBalancer
云原生·容器·kubernetes·service·loadbalancer·metallb