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

相关推荐
有梦想的攻城狮5 小时前
【一起来学kubernetes】29、NFS使用详解
云原生·容器·kubernetes·nfs·网络文件系统
这个懒人6 小时前
Kubernetes深度解析:云原生时代的容器编排引擎
云原生·容器·kubernetes
小安运维日记9 小时前
CKS认证 | Day3 K8s容器运行环境安全加固
运维·网络·安全·云原生·kubernetes·云计算
techdashen9 小时前
Kubernetes比同规格虚拟机性能相差多少?
云原生·容器·kubernetes
Avatar*10 小时前
k8s1.22 kubeadm 部署
云原生·容器·kubernetes
Feng.Lee10 小时前
如何使用K8S快速部署测试环境
测试工具·云原生·容器·kubernetes·可用性测试
Source、12 小时前
Zabbix监控K8s集群
docker·kubernetes·zabbix
识途老码12 小时前
k8s日志管理
云原生·容器·kubernetes
George_huhu13 小时前
云原生系列-K8S实战
云原生·容器·kubernetes
未完成的歌~15 小时前
云安全之k8s未授权漏洞总结
云原生·容器·kubernetes