Amazon EKS 上的网络负载均衡
网络流量在 OSI 模型的 L4
上实现负载均衡。若要对 L7
上的应用程序流量进行负载均衡,请部署 Kubernetes ingress
,它会预置 Amazon 应用程序负载均衡器。有关更多信息,请参阅Amazon EKS 上的应用程序负载均衡。要了解更多有关两种负载均衡类型之间差异的信息,请参阅 Amazon 网站上的 Elastic Load Balancing 功能
创建类型为 LoadBalancer
的 Kubernetes Service
时,Amazon 云提供程序负载均衡器控制器默认创建 Amazon 经典负载均衡器,但也可以创建 Amazon 网络负载均衡器。此控制器将来仅接收关键错误修复。有关如何使用 Amazon 云提供程序负载均衡器的更多信息,请参阅 Kubernetes 文档中的 Amazon 云提供程序负载均衡器控制器
我们建议您使用版本 2.5.4
或更高版本的 Amazon Load Balancer Controller,而不是 Amazon 云提供程序负载均衡器控制器。Amazon Load Balancer Controller 创建 Amazon 网络负载均衡器,但不创建 Amazon 经典负载均衡器。本主题的其余部分介绍如何使用 Amazon 负载均衡器控制器。
Amazon 网络负载均衡器可以对部署到 Amazon EC2 IP 和实例目标或 Amazon Fargate IP 目标的 Pods 的网络流量进行负载均衡。有关更多信息,请参阅 GitHub 上的 Amazon负载均衡器控制器
先决条件
必须满足以下要求,才能使用 Amazon Load Balancer Controller 对网络流量进行负载均衡。
-
拥有现有集群。如果没有现有集群,请参阅 开始使用 Amazon EKS。如果您需要更新现有集群的版本,请参阅 更新 Amazon EKS 集群 Kubernetes 版本。
-
在集群上部署 Amazon Load Balancer Controller。有关更多信息,请参阅安装 Amazon Load Balancer Controller 附加组件。建议升级到版本
2.5.4
或更高版本。 -
至少有一个子网。如果在一个可用区中发现多个标记子网,则该控制器会按子网 ID 的字典顺序选择第一个子网。子网必须具有至少 8 个可用 IP 地址。
-
如果使用
2.1.1
或更早版本的 Amazon Load Balancer Controller,则必须按如下方式标记子网。如果使用版本2.1.2
或更高版本,则此标签是可选的。如果您在同一 VPC 中运行多个集群,或者 VPC 中有多个 Amazon 服务共享子网,并且希望对每个集群中预置负载均衡器的位置时效性更多控制,则可能需要标记子网。如果您明确指定子网 ID 作为服务对象上的注释,则 Kubernetes 和 Amazon Load Balancer Controller 会直接使用这些子网来创建负载均衡器。如果您选择使用此方法来预置负载均衡器,则不需要子网标记,您可以跳过以下私有和公有子网标记要求。将
替换为您的集群名称。my-cluster
-
密钥 –
kubernetes.io/cluster/
my-cluster
-
值 –
shared
或owned
-
-
除非您明确指定子网 ID 作为服务或入口对象上的注释,否则您的公有子网和私有子网必须满足以下要求。如果通过明确指定子网 ID 作为服务或入口对象上的注释来预置负载均衡器,则 Kubernetes 和 Amazon Load Balancer Controller 会直接使用这些子网来创建负载均衡器,并且不需要以下标签。
-
私有子网:必须采用以下格式标记。这样,Kubernetes 和 Amazon 负载均衡器控制器就会知道子网可用于内部负载均衡器。如果您在 2020 年 3 月 26 日之后使用
eksctl
或 Amazon EKS Amazon Amazon CloudFormation 模板创建 VPC,则在创建子网时会对子网进行适当标记。有关 Amazon EKS Amazon Amazon CloudFormation VPC 模板的更多信息,请参阅 为 Amazon EKS 集群创建 VPC。-
密钥 –
kubernetes.io/role/internal-elb
-
值 –
1
-
-
公有子网:必须采用以下格式标记。这样,Kubernetes 就会知道仅将这些子网用于外部负载均衡器,而不是在每个可用区中选择公有子网(按子网 ID 的词典式顺序选择)。如果您在 2020 年 3 月 26 日之后使用
eksctl
或 Amazon EKS Amazon CloudFormation 模板创建 VPC,则在创建子网时会对子网进行适当标记。有关 Amazon EKS Amazon CloudFormation VPC 模板的更多信息,请参阅 为 Amazon EKS 集群创建 VPC。-
密钥 –
kubernetes.io/role/elb
-
值 –
1
-
如果未显式添加子网角色标记,则 Kubernetes 服务控制器将检查您的集群 VPC 子网的路由表,以确定子网是私有子网还是公有子网。我们建议您不要依赖此行为,而是明确地添加私有或公有角色标记。Amazon Load Balancer Controller 不会检查路由表,并且需要存在私有和公有标签才能成功地自动发现。
-
注意事项
-
负载均衡器的配置由添加到服务清单中的注释控制。使用 Amazon Load Balancer Controller 和使用 Amazon 云提供程序负载均衡器控制器的服务注释不同。部署服务前,请务必检查 Amazon Load Balancer Controller 的注释
。 -
使用 Amazon VPC CNI plugin for Kubernetes 时,Amazon Load Balancer Controller 可以对 Amazon EC2 IP 或实例目标和 Fargate IP 目标进行负载均衡。使用备选的兼容 CNI 插件时,控制器只能对实例目标进行负载均衡。有关 Network Load Balancer 目标类型的更多信息,请参阅 Network Load Balancer 用户指南中的目标类型
-
如果要在创建负载均衡器时或之后将标记添加到负载均衡器,请在服务规范中添加以下注释。有关更多信息,请参阅 Amazon Load Balancer Controller 文档中的 Amazon 资源标签
。 service.beta.kubernetes.io/aws-load-balancer-additional-resource-tags
-
您可以通过添加以下注释,从而将弹性 IP 地址分配到 Network Load Balancer。请将
替换为弹性 IP 地址的example values
Allocation IDs
。Allocation IDs
的数量必须与用于负载均衡器的子网数量相匹配。有关更多信息,请参阅 Amazon Load Balancer Controller文档。 service.beta.kubernetes.io/aws-load-balancer-eip-allocations: eipalloc-
xxxxxxxxxxxxxxxxx
,eipalloc-yyyyyyyyyyyyyyyyy
-
对于您创建的每个网络负载均衡器,Amazon EKS 会向节点的安全组添加一个用于客户端流量的入站规则,并为 VPC 中的每个负载均衡器子网添加一个用于运行状况检查的规则。如果 Amazon EKS 尝试创建的规则超过安全组允许的最大规则数配额,则部署
LoadBalancer
类型的服务可能会失败。有关更多信息,请参阅 Amazon VPC 用户指南的 Amazon VPC 配额中的安全组。请考虑以下选项,以最大限度地减少超过安全组最大规则数的可能性:-
请求增加每个安全组配额的规则数。有关更多信息,请参阅 Service Quotas 用户指南中的请求增加配额。
-
使用 IP 目标,而不是实例目标。对于 IP 目标,可以为相同目标端口共享规则。可以使用注释手动指定负载均衡器子网。有关更多信息,请参阅 GitHub 上的注释
。 -
使用入口(而不是
LoadBalancer
类型的服务)将流量发送到您的服务。Amazon Application Load Balancer 需要的规则数比 Network Load Balancer 少。您可以跨多个入口共享 ALB。有关更多信息,请参阅Amazon EKS 上的应用程序负载均衡。您无法跨多个服务共享 Network Load Balancer。 -
将您的集群部署到多个账户。
-
-
如果您的 Pods 在 Amazon EKS 集群中的 Windows 上运行,则采用负载均衡器的单个服务最多可支持 1024 个后端 Pods。每个 Pod 都有自己的唯一 IP 地址。
-
我们建议您仅使用 Amazon Load Balancer Controller 创建新的网络负载均衡器。尝试替换使用 Amazon 云提供程序负载均衡器控制器创建的现有 Network Load Balancer,将产生多个可能导致应用程序停机的 Network Load Balancer。
创建网络负载均衡器
您可以使用 IP 或实例目标创建网络负载均衡器。
(可选)部署示例应用程序
先决条件
-
集群 VPC 中至少有一个公有或私有子网。
-
在集群上部署 Amazon Load Balancer Controller。有关更多信息,请参阅安装 Amazon Load Balancer Controller 附加组件。建议升级到版本
2.5.4
或更高版本。
部署示例应用程序
-
如果部署到 Fargate,请确保您的 VPC 中有一个可用的私有子网,然后创建 Fargate 配置文件。如果您不部署到 Fargate,请跳过此步骤。您可以通过运行以下命令来创建配置文件,也可以在 Amazon Web Services Management Console 中,使用该命令中
name
和namespace
的相同值创建配置文件。将
替换为您自己的值。example values
eksctl create fargateprofile \ --cluster
\my-cluster
\ --regionregion-code
\ --namenlb-sample-app
--namespace nlb-sample-app
-
部署示例应用程序。
-
为应用程序创建命名空间。
kubectl create namespace
nlb-sample-app
-
将以下内容保存到计算机上名为
文件的文件中。sample-deployment
.yamlapiVersion: apps/v1 kind: Deployment metadata: name:
nlb-sample-app
namespace:nlb-sample-app
spec: replicas:3
selector: matchLabels: app:nginx
template: metadata: labels: app:nginx
spec: containers: - name:nginx
image:public.ecr.aws/nginx/nginx:1.23
ports: - name:tcp
containerPort:80
-
将清单应用于集群。
kubectl apply -f
sample-deployment
.yaml
-
-
创建具有面向互联网的网络负载均衡器的服务,以便将负载均衡到 IP 目标。
-
将以下内容保存到计算机上名为
文件的文件中。如果部署到 Fargate 节点,请删除sample-service
.yamlservice.beta.kubernetes.io/aws-load-balancer-scheme: internet-facing
行。apiVersion: v1 kind: Service metadata: name:
nlb-sample-service
namespace:nlb-sample-app
annotations: service.beta.kubernetes.io/aws-load-balancer-type: external service.beta.kubernetes.io/aws-load-balancer-nlb-target-type: ip service.beta.kubernetes.io/aws-load-balancer-scheme: internet-facing spec: ports: - port:80
targetPort:80
protocol:TCP
type: LoadBalancer selector: app:nginx
-
将清单应用于集群。
kubectl apply -f
sample-service
.yaml
-
-
确认是否已部署相应服务。
kubectl get svc
nlb-sample-service
-nnlb-sample-app
示例输出如下。
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
sample-service
LoadBalancer10.100.240.137
k8s-nlbsampl
-nlbsampl
-xxxxxxxxxx
-xxxxxxxxxxxxxxxx
.elb.region-code
.amazonaws.com.cn80
:32400
/TCP
16h注意
和10.100.240.137
-xxxxxxxxxx
xxxxxxxxxxxxxxxx
的值与示例输出不同(这些值将是您的负载均衡器独有的),并且cn-north-1
可能因集群所在的 Amazon Web Services 区域 而有所不同。 -
打开 Amazon EC2 Amazon Web Services Management Console
。在左侧导航窗格中,选择 Target Groups(目标组)(位于 Load Balancing(负载均衡)下)。在 Name(名称)列中,选择目标组的名称,其中 Load balancer(负载均衡器)列的值与上一步输出的 EXTERNAL-IP
列中的一部分名称相匹配。例如,如果您的输出与之前的输出相同,则应选择名为k8s-default-samplese-
的目标组。Target type(目标类型)为xxxxxxxxxx
IP
,因为在示例服务清单中指定。 -
选择 Target group(目标组),然后选择 Targets(目标)选项卡。在 Registered targets(已注册目标)中,您应该可看到上一步中部署的三个副本的三个 IP 地址。在所有目标的状态均为 healthy(正常)之前,请耐心等待,然后再继续。可能需要几分钟时间所有目标的状态才能达到
healthy
。在更改为healthy
状态之前,目标可能是unhealthy
状态。 -
将流量发送到服务,将
和xxxxxxxxxx-xxxxxxxxxxxxxxxx
替换为在上一步输出中为cn-north-1
EXTERNAL-IP
返回的值。如果您已部署到私有子网,则需要从 VPC 中的设备(例如堡垒主机)查看页面。有关更多信息,请参阅 Linux 上的 Amazon 堡垒机主机。 curl k8s-default-samplese-
xxxxxxxxxx-xxxxxxxxxxxxxxxx
.elb.region-code
.amazonaws.com.cn示例输出如下。
<!DOCTYPE html> <html> <head> <title>Welcome to nginx!</title> [...]
-
完成示例部署、服务和命名空间后,将其移除。
kubectl delete namespace
nlb-sample-app