AWS EKS集成 Elastic Load Balancer[AWS 海外区]

本文主要介绍AWS EKSAWS Elastic Load Balancing的集成;我们可以通过AWS ELB将运行在EKS中的服务暴露出去,供互联网访问。

AWS ELB提供的负载均衡,高可用,按流量自动弹性和自带的安全性服务(比如基础版的AWS Shield)给为我们的网络服务提供了高质量的保证。虽然我们也可以直接让K8S Service服务直接以public ip的方式来对外服务,但是一般技术和成本等综合来考虑不如ELB。

如下图,AWS ELB充当运行在AWS上的动态API服务的总入口,LB可以将流量分布到后面的多种计算平台,并在多个AWS可用区和计算节点间分配网络流量以提高应用程序可扩展性和可靠性。

安装AWS Load Balancer Controller add-on

我们可以参考Installing the AWS Load Balancer Controller add-on

下载iam_policy.json

bash 复制代码
curl -O https://raw.githubusercontent.com/kubernetes-sigs/aws-load-balancer-controller/v2.5.4/docs/install/iam_policy.json

用下载好的iam_policy.json创建policy

bash 复制代码
aws iam create-policy \
    --policy-name AWSLoadBalancerControllerIAMPolicy \
    --policy-document file://iam_policy.json

截图如下

查看AWS EKS集群的OIDC,其中name需要你替换成你自己实际的EKS Cluster名称

bash 复制代码
oidc_id=$(aws eks describe-cluster --name poc-us-cluster --query "cluster.identity.oidc.issuer" --output text | cut -d '/' -f 5)
aws iam list-open-id-connect-providers | grep $oidc_id | cut -d "/" -f4

截图如下

你也可以直接在AWS控制台上看到EKS集群的OIDC

将下面的内容保存为load-balancer-role-trust-policy.json,其中你需要把aws account、aws region、oidc换为你自己真实的值

yaml 复制代码
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": {
                "Federated": "arn:aws:iam::111122223333:oidc-provider/oidc.eks.region-code.amazonaws.com/id/EXAMPLED539D4633E53DE1B71EXAMPLE"
            },
            "Action": "sts:AssumeRoleWithWebIdentity",
            "Condition": {
                "StringEquals": {
                    "oidc.eks.region-code.amazonaws.com/id/EXAMPLED539D4633E53DE1B71EXAMPLE:aud": "sts.amazonaws.com",
                    "oidc.eks.region-code.amazonaws.com/id/EXAMPLED539D4633E53DE1B71EXAMPLE:sub": "system:serviceaccount:kube-system:aws-load-balancer-controller"
                }
            }
        }
    ]
}

创建AmazonEKSLoadBalancerControllerRole

bash 复制代码
aws iam create-role \
  --role-name AmazonEKSLoadBalancerControllerRole \
  --assume-role-policy-document file://"load-balancer-role-trust-policy.json"

关联AmazonEKSLoadBalancerControllerRoleAWSLoadBalancerControllerIAMPolicy

bash 复制代码
aws iam attach-role-policy \
  --policy-arn arn:aws:iam::843245141269:policy/AWSLoadBalancerControllerIAMPolicy \
  --role-name AmazonEKSLoadBalancerControllerRole

截图如下

为ELB创建service account,将下面的内容保存为aws-load-balancer-controller-service-account.yaml,其中你需要将aws account替换为你自己实际的值。

yaml 复制代码
apiVersion: v1
kind: ServiceAccount
metadata:
  labels:
    app.kubernetes.io/component: controller
    app.kubernetes.io/name: aws-load-balancer-controller
  name: aws-load-balancer-controller
  namespace: kube-system
  annotations:
    eks.amazonaws.com/role-arn: arn:aws:iam::111122223333:role/AmazonEKSLoadBalancerControllerRole

截图如下

这里推荐使用helm进行安装,其中集群名称换为自己实际的集群名称

bash 复制代码
helm repo add eks https://aws.github.io/eks-charts
helm repo update eks
helm install aws-load-balancer-controller eks/aws-load-balancer-controller \
  -n kube-system \
  --set clusterName=my-cluster \
  --set serviceAccount.create=false \
  --set serviceAccount.name=aws-load-balancer-controller 

安装后我们可以进行检查,出现aws-load-balancer-controller 2/2字样就证明安装成功了

bash 复制代码
kubectl get deployment -n kube-system aws-load-balancer-controller

截图如下

功能测试

我们可以按照自己的需求使用AWS ALBAWS NLB。ALB和NLB都隶属于AWS ELB,区别在ALB专注于L7,NLB专注于L4;ALB是我们使用HTTP协议时首选,NLB是我们使用自定义协议、MQTT等非HTTP协议的首选,NLB可以同时满足L4/L7的负载需求但是ALB只能用于L7。

我们可以参考Application load balancing on Amazon EKSNetwork load balancing on Amazon EKS来进行功能测试

比如按照Application load balancing on Amazon EKS,我最终得到了一个2048页游。

关于AWS EKS和AWS ELB的集成的一些建议

我们可以在kubernetes-sigs AWS Load Balancer Controller查看EKS+LB相关的yaml详细设置。

一般我们在写好LB相关的yaml后,应用yaml会自动创建一个LB,这在大多数全新上线的部署场景是非常方便的;但是如果我们已经有了一个LB用于普通的EC2应用或者EKS已经给我创建了一个LB,我们现在想复用现有的LB,那么我们可以考虑TargetGroupBinding,它的原理是我们只需要提前设置好TargetGroup和LB的关系,然后我们只需要在yaml中将自己的服务和TargetGroup绑定即可。

相关推荐
Arva .15 小时前
开发准备之日志 git
spring boot·git·后端
小宁爱Python16 小时前
从零搭建 RAG 智能问答系统1:基于 LlamaIndex 与 Chainlit实现最简单的聊天助手
人工智能·后端·python
苏三说技术16 小时前
高性能场景为什么推荐使用PostgreSQL,而非MySQL?
后端
slim~16 小时前
CLion实现ini 解析器设计与实现
c++·后端·clion
程序员飞哥16 小时前
如何设计多级缓存架构并解决一致性问题?
java·后端·面试
前端小马17 小时前
前后端Long类型ID精度丢失问题
java·前端·javascript·后端
Lisonseekpan17 小时前
Java Caffeine 高性能缓存库详解与使用案例
java·后端·spring·缓存
柳贯一(逆流河版)17 小时前
Spring Boot Actuator+Micrometer:高并发下 JVM 监控体系的轻量化实践
jvm·spring boot·后端
SXJR17 小时前
Spring前置准备(七)——DefaultListableBeanFactory
java·spring boot·后端·spring·源码·spring源码·java开发