本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
上的网络负载均衡Amazon EKS
在创建类型为 Service
的 Kubernetes LoadBalancer
时,会预置 AWS 网络负载均衡器 (NLB) 或 传统负载均衡器 (CLB),用于对网络流量进行负载均衡。要了解有关两种类型的负载均衡器之间差异的更多信息,请参阅
网站上的
网络流量在 OSI 模型的 L4 处实现负载均衡。要在 L7 处对应用程序流量进行负载均衡,您需要部署一个 Kubernetes Ingress
,它预配置一个 AWS 应用程序负载均衡器。有关更多信息,请参阅上的应用程序负载均衡Amazon EKS。要了解有关两种类型的负载均衡之间的区别的更多信息,请参阅 网站上的
在 Amazon EKS 中,您可以对到 NLB(实例或 IP 目标)或 CLB(实例目标)的网络流量进行负载均衡。有关 NLB 目标类型的更多信息,请参阅 中的
Prerequisites
您必须先满足以下要求,然后才能将网络流量负载均衡到应用程序。
-
拥有现有集群。如果您没有现有集群,请参阅Amazon EKS 入门。如果要将负载均衡到 IP 目标,则集群必须是 1.18 或更高版本。要更新现有集群,请参阅更新集群。
-
如果要将负载均衡到 IP 目标,则必须在集群上预配置 AWS 负载均衡器控制器。有关更多信息,请参阅AWS 负载均衡器控制器。
-
必须按照以下方式为公有子网添加标签,以便 Kubernetes 知道仅将这些子网用于外部负载均衡器,而不是在每个可用区中选择一个公有子网(按子网 ID 的字母表顺序选择)。如果您在 March 26, 2020之后使用
eksctl
或 Amazon EKS AWS CloudFormation 模板创建 VPC,则在创建子网时会为子网添加适当的标签。有关 Amazon EKS AWS CloudFormation VPC 模板的更多信息,请参阅为 Amazon EKS 集群创建 VPC。键 值 kubernetes.io/role/elb
1
-
必须按照以下方式为私有子网添加标签,以便 Kubernetes 知道它可以将这些子网用于内部负载均衡器。如果您在 March 26, 2020之后使用
eksctl
或 Amazon EKS AWS CloudFormation 模板创建 VPC,则在创建子网时会为子网添加适当的标签。有关 Amazon EKS AWS CloudFormation VPC 模板的更多信息,请参阅为 Amazon EKS 集群创建 VPC。键 值 kubernetes.io/role/internal-elb
1
Considerations
-
在具有以下平台版本的 Amazon EKS 集群上,负载均衡器支持 UDP 协议的使用。有关更多信息,请参阅Amazon EKS 平台版本。
Amazon EKS version 平台版本 1.18 1. 1.17 2. 1.16 3. 1.15 4. -
您只能将 NLB IP 目标与 Amazon EKS VPC CNI 插件结合使用。您可以将 NLB 实例目标与 Amazon EKS VPC CNI 插件或可替换的兼容 CNI 插件结合使用。
-
您只能将 IP 目标与 NLB 一起使用。您不能将 IP 目标与 CLBs 一起使用。
-
负载均衡器的配置由添加到服务清单中的注释控制。如果要在创建负载均衡器时(或之后)向负载均衡器添加标签,请在服务规范中添加以下注释。有关更多信息,请参阅 Kubernetes 文档中的其他 ELB 注释
。 service.beta.kubernetes.io/aws-load-balancer-additional-resource-tags
-
如果您使用的是 Amazon EKS 1.16 或更高版本,则可以通过添加以下注释来向 分配弹性 IP 地址网络负载均衡器。将
<example-values>
(包括<>
)替换为您的弹性 IP 地址的分配 IDs。分配 IDs 的数量必须与用于负载均衡器的子网数匹配。service.beta.kubernetes.io/aws-load-balancer-eip-allocations: eipalloc-<xxxxxxxxxxxxxxxxx>,eipalloc-<yyyyyyyyyyyyyyyyy>
-
对于您在 1.16 或更高版本的集群上创建的每个 NLB,Amazon EKS 会向节点的安全组客户端流量添加一个入站规则,并针对 VPC 中的每个负载均衡器子网添加一个规则以进行运行状况检查。在 1.15 集群上,将为分配给 VPC 的每个 CIDR 块添加一个规则。如果
LoadBalancer
尝试创建的规则超出安全组允许的最大规则数配额,Amazon EKS 类型的服务部署可能会失败。有关更多信息,请参阅 的 配额中的Amazon VPC安全组Amazon VPC 用户指南。请考虑以下选项来最大程度地降低超过安全组的最大规则数的几率。-
请求增加每个安全组规则的配额。有关更多信息,请参阅 中的请求提高配额Service Quotas 用户指南。
-
使用 负载均衡器 – IP 目标 而不是实例目标。对于 IP 目标,可能为相同的目标端口共享规则。可以使用注释手动指定负载均衡器子网。有关更多信息,请参阅 上的
注释GitHub。 -
使用入口,而不是
LoadBalancer
类型的服务来将流量发送到您的服务。AWS (ALB) 需要的规则少于 应用程序负载均衡器。NLBs 也可以跨多个入口共享一个 ALB。有关更多信息,请参阅上的应用程序负载均衡Amazon EKS。 -
将集群部署到多个账户。
-
负载均衡器 – 实例目标
具有实例目标的 NLB 或 CLBs 由 Kubernetes 树内负载均衡控制器创建。树内控制器随 Kubernetes 提供,因此您无需将其部署到集群。您可以将
NLB 实例目标与部署到节点的 Pod 一起使用,但不能与 Fargate 一起使用。要跨部署到 Fargate 的 Pod 实现网络流量的负载均衡,您必须使用 IP 目标。默认情况下,当您部署类型为 传统负载均衡器 的 Kubernetes 服务时,将创建外部(公有)LoadBalancer
。 要部署 网络负载均衡器,请将以下注释应用于您的服务:
service.beta.kubernetes.io/aws-load-balancer-type: nlb
在创建服务后,请勿编辑此注释。如果您需要修改它,请删除服务对象,然后使用此注释的所需值再次创建它。
要将负载均衡器部署到私有子网,您的服务规范必须具有以下注释:
service.beta.kubernetes.io/aws-load-balancer-internal: "true"
对于内部负载均衡器,Amazon EKS 集群必须配置为使用 VPC 中的至少一个私有子网。Kubernetes 会检查子网的路由表来确定它们是公有还是私有。公有子网有使用 Internet 网关直接连接到 Internet 的路由,但私有子网没有。
有关指定负载均衡器的示例服务清单,请参阅 Kubernetes 文档中的类型 LoadBalancer
负载均衡器 – IP 目标
NLBs 具有 IP 目标的 CLBs 由 AWS 负载均衡器控制器创建(您不能将 与 IP 目标结合使用)。您可以将 NLB IP 目标与部署到 Amazon
EC2 节点或 Fargate 的 Pod 一起使用。您的 Kubernetes 服务必须创建为类型 LoadBalancer
。 有关更多信息,请参阅 Kubernetes 文档中的类型 LoadBalancer
要创建使用 IP 目标的负载均衡器,请将以下注释添加到服务清单并部署您的服务。
service.beta.kubernetes.io/aws-load-balancer-type: nlb-ip
在创建服务后,请勿编辑此注释。如果您需要修改它,请删除服务对象,然后使用此注释的所需值再次创建它。您只能将 NLB IP 目标与至少运行 Amazon EKS 版本 1.18 的集群结合使用。要升级当前版本,请参阅更新集群。
部署示例应用程序
-
部署示例应用程序。
-
将以下内容保存到计算机上的
yaml
文件中。apiVersion: apps/v1 kind: Deployment metadata: name: sample-app spec: replicas: 3 selector: matchLabels: app: nginx template: metadata: labels: app: nginx spec: containers: - name: nginx image: public.ecr.aws/z9d2n7e1/nginx:1.19.5 ports: - name: http containerPort: 80
-
将清单应用于集群。
kubectl apply -f <file-name-you-specified>.yaml
-
-
使用注释创建
LoadBalancer
类型的服务,以创建具有 IP 目标的 NLB。-
将以下内容保存到计算机上的
yaml
文件中。apiVersion: v1 kind: Service metadata: name: sample-service annotations: service.beta.kubernetes.io/aws-load-balancer-type: nlb-ip spec: ports: - port: 80 targetPort: 80 protocol: TCP type: LoadBalancer selector: app: nginx
-
将清单应用于集群。
kubectl apply -f <file-name-you-specified>.yaml
-
-
验证是否已部署服务。
kubectl get svc sample-service
输出
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE sample-service LoadBalancer 10.100.240.137 k8s-default-samplese-xxxxxxxxxx-xxxxxxxxxxxxxxxx.elb.us-west-2.amazonaws.com 80:32400/TCP 16h
-
打开 Amazon EC2 AWS 管理控制台
。在左侧面板中选择 Target Groups (目标组)(在 Load Balancing 下)。在 Name (名称) 列中,选择与上一步输出的 EXTERNAL-IP
列中的名称匹配的目标组的名称。例如,如果输出与上面的输出相同,则可以选择名为k8s-default-samplese-xxxxxxxxxx
的目标组。Target type (目标类型) 为 ,因为已在示例服务部署清单中指定该类型。IP
-
选择 Target group,然后选择 Targets 选项卡。在 Registered targets (注册目标) 下,您应看到上一步中部署的三个副本的三个 IP 地址。请耐心等待,直到所有目标的状态为正常,然后再继续。可能需要几分钟时间,然后所有目标才为
healthy
。 在更改为unhealthy
之前,目标可能具有healthy
状态。 -
使用上一步中返回的值将流量发送到替换示例值的服务。
EXTERNAL-IP
curl <k8s-default-samplese-xxxxxxxxxx-xxxxxxxxxxxxxxxx.elb.us-west-2.amazonaws.com>
输出
<!DOCTYPE html> <html> <head> <title>Welcome to nginx!</title> ...
-
当您使用完示例部署和服务后,请将其删除。
kubectl delete service sample-service kubectl delete deployment sample-app