关于amazon-web-services:AWS-eks绑定alb-使用awsloadbalancercontroller提供服务

12次阅读

共计 7209 个字符,预计需要花费 19 分钟才能阅读完成。


作者:SRE 运维博客
博客地址:https://www.cnsre.cn/
文章地址:https://www.cnsre.cn/posts/211217431135/
相干话题:https://www.cnsre.cn/tags/aws/


最近在 AWS 平台创立了 EKS 用于测试环境我的项目,EKS 创立完当前我打算应用 Ingress 控制器 来裸露服务,ingress 前在增加一个 ALB 负载均衡器,这样就能够实现齐全的高可用了。然而在创立好 ingress 却发现无奈调通服务,查看 aws 官网文档 Amazon EKS 上的应用程序负载平衡 发现须要应用 aws-load-balancer-controller.

本文档的指标:

  • 创立 EKS ALB 所须要的角色。
  • 创立 EKS aws-load-balancer-controller
  • 创立 EKS pod 服务
  • 应用 ALB 将 pod 服务裸露进来

AWS Load Balancer Controller 介绍

AWS Load Balancer Controller 的工作原理

AWS Load Balancer Controller 是帮忙治理 Kubernetes 集群的弹性负载均衡器的控制器。

  • 它通过供给应用程序负载均衡器来满足 Kubernetes Ingress 资源。
  • 它通过提供 网络负载均衡器来满足 Kubernetes Service 资源。

下图具体阐明了此控制器创立的 AWS 组件。它还演示了从 ALB 到 Kubernetes 集群的路由入口流量。

[1]:控制器监督来自 API 服务器的入口事件。当它找到满足其要求的入口资源时,它开始创立 AWS 资源。

[2]:在 AWS 中为新的入口资源创立了一个 ALB (ELBv2)。此 ALB 能够面向 Internet 或外部。您还能够应用正文指定它在其中创立的子网。

[3]:在 AWS 中为入口资源中形容的每个独特的 Kubernetes 服务创立指标组。

[4]:为入口资源正文中详述的每个端口创立侦听器。如果未指定端口,则应用正当的默认值 (80443)。证书也能够通过正文附加。

[5]:为入口资源中指定的每个门路创立规定。这可确保将特定门路的流量路由到正确的 Kubernetes 服务。

装置前的筹备

  • EKS 曾经创立结束
  • 筹备 两个 Public 子网
  • 可能创立 IAM 策略 的账户

对于子网的阐明:

依据 EKS 最佳实际。EKS 的 worker node,它们只须要接管来自 alb ingress(通过内网转发)的流量,平安起见就须要把他们放在公有子网。然而它们又须要去公网上拉一些镜像,所以它们自身也须要放问公网的能力,这个时候它们的子网里配置个 nat,拜访外网的时候由 NAT 做一个出向的转发,就能够实现了,然而因为 nat 是单向的,外界是无奈通过 NAT 拜访到 eks 的节点的,所以我就须要将 ALB 放在 public 子网里。最初就是 ALB 放在 public 来承受流量,worker node 在公有子网解决业务。

创立 AWS Load Balancer Controller 的 IAM 策略

关上 策略 点击 创立策略 关上 IAM_Policy.json 复制内容粘贴到 json

点击 下一步: 标签

而后始终下一步 在下图中名称填写 AWSLoadBalancerControllerIAMPolicy 你也能够自定义名称。而后创立策略。

{{< notice info “ 留神:” >}}
如果以官网提供的 IAM_Policy.json 保留有错的话你能够应用一下策略(权限会大一些)
{{< /notice >}}

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "iam:CreateServiceLinkedRole",
                "ec2:DescribeAccountAttributes",
                "ec2:DescribeAddresses",
                "ec2:DescribeAvailabilityZones",
                "ec2:DescribeInternetGateways",
                "ec2:DescribeVpcs",
                "ec2:DescribeSubnets",
                "ec2:DescribeSecurityGroups",
                "ec2:DescribeInstances",
                "ec2:DescribeNetworkInterfaces",
                "ec2:DescribeTags",
                "ec2:GetCoipPoolUsage",
                "ec2:DescribeCoipPools",
                "elasticloadbalancing:DescribeLoadBalancers",
                "elasticloadbalancing:DescribeLoadBalancerAttributes",
                "elasticloadbalancing:DescribeListeners",
                "elasticloadbalancing:DescribeListenerCertificates",
                "elasticloadbalancing:DescribeSSLPolicies",
                "elasticloadbalancing:DescribeRules",
                "elasticloadbalancing:DescribeTargetGroups",
                "elasticloadbalancing:DescribeTargetGroupAttributes",
                "elasticloadbalancing:DescribeTargetHealth",
                "elasticloadbalancing:DescribeTags"
            ],
            "Resource": "*"
        },
        {
            "Effect": "Allow",
            "Action": [
                "cognito-idp:DescribeUserPoolClient",
                "acm:ListCertificates",
                "acm:DescribeCertificate",
                "iam:ListServerCertificates",
                "iam:GetServerCertificate",
                "waf-regional:GetWebACL",
                "waf-regional:GetWebACLForResource",
                "waf-regional:AssociateWebACL",
                "waf-regional:DisassociateWebACL",
                "wafv2:GetWebACL",
                "wafv2:GetWebACLForResource",
                "wafv2:AssociateWebACL",
                "wafv2:DisassociateWebACL",
                "shield:GetSubscriptionState",
                "shield:DescribeProtection",
                "shield:CreateProtection",
                "shield:DeleteProtection"
            ],
            "Resource": "*"
        },
        {
            "Effect": "Allow",
            "Action": [
                "ec2:AuthorizeSecurityGroupIngress",
                "ec2:RevokeSecurityGroupIngress"
            ],
            "Resource": "*"
        },
        {
            "Effect": "Allow",
            "Action": ["ec2:CreateSecurityGroup"],
            "Resource": "*"
        },
        {
            "Effect": "Allow",
            "Action": ["ec2:CreateTags"],
            "Resource": "arn:aws-cn:ec2:*:*:security-group/*",
            "Condition": {
                "StringEquals": {"ec2:CreateAction": "CreateSecurityGroup"},
                "Null": {"aws:RequestTag/elbv2.k8s.aws/cluster": "false"}
            }
        },
        {
            "Effect": "Allow",
            "Action": [
                "ec2:CreateTags",
                "ec2:DeleteTags"
            ],
            "Resource": "arn:aws-cn:ec2:*:*:security-group/*",
            "Condition": {
                "Null": {
                    "aws:RequestTag/elbv2.k8s.aws/cluster": "true",
                    "aws:ResourceTag/elbv2.k8s.aws/cluster": "false"
                }
            }
        },
        {
            "Effect": "Allow",
            "Action": [
                "ec2:AuthorizeSecurityGroupIngress",
                "ec2:RevokeSecurityGroupIngress",
                "ec2:DeleteSecurityGroup"
            ],
            "Resource": "*",
            "Condition": {
                "Null": {"aws:ResourceTag/elbv2.k8s.aws/cluster": "false"}
            }
        },
        {
            "Effect": "Allow",
            "Action": [
                "elasticloadbalancing:CreateLoadBalancer",
                "elasticloadbalancing:CreateTargetGroup"
            ],
            "Resource": "*",
            "Condition": {
                "Null": {"aws:RequestTag/elbv2.k8s.aws/cluster": "false"}
            }
        },
        {
            "Effect": "Allow",
            "Action": [
                "elasticloadbalancing:CreateListener",
                "elasticloadbalancing:DeleteListener",
                "elasticloadbalancing:CreateRule",
                "elasticloadbalancing:DeleteRule"
            ],
            "Resource": "*"
        },
        {
            "Effect": "Allow",
            "Action": [
                "elasticloadbalancing:AddTags",
                "elasticloadbalancing:RemoveTags"
            ],
            "Resource": [
                "arn:aws-cn:elasticloadbalancing:*:*:targetgroup/*/*",
                "arn:aws-cn:elasticloadbalancing:*:*:loadbalancer/net/*/*",
                "arn:aws-cn:elasticloadbalancing:*:*:loadbalancer/app/*/*"
            ],
            "Condition": {
                "Null": {
                    "aws:RequestTag/elbv2.k8s.aws/cluster": "true",
                    "aws:ResourceTag/elbv2.k8s.aws/cluster": "false"
                }
            }
        },
        {
            "Effect": "Allow",
            "Action": [
                "elasticloadbalancing:AddTags",
                "elasticloadbalancing:RemoveTags"
            ],
            "Resource": [
                "arn:aws-cn:elasticloadbalancing:*:*:listener/net/*/*/*",
                "arn:aws-cn:elasticloadbalancing:*:*:listener/app/*/*/*",
                "arn:aws-cn:elasticloadbalancing:*:*:listener-rule/net/*/*/*",
                "arn:aws-cn:elasticloadbalancing:*:*:listener-rule/app/*/*/*"
            ]
        },
        {
            "Effect": "Allow",
            "Action": [
                "elasticloadbalancing:ModifyLoadBalancerAttributes",
                "elasticloadbalancing:SetIpAddressType",
                "elasticloadbalancing:SetSecurityGroups",
                "elasticloadbalancing:SetSubnets",
                "elasticloadbalancing:DeleteLoadBalancer",
                "elasticloadbalancing:ModifyTargetGroup",
                "elasticloadbalancing:ModifyTargetGroupAttributes",
                "elasticloadbalancing:DeleteTargetGroup"
            ],
            "Resource": "*",
            "Condition": {
                "Null": {"aws:ResourceTag/elbv2.k8s.aws/cluster": "false"}
            }
        },
        {
            "Effect": "Allow",
            "Action": [
                "elasticloadbalancing:RegisterTargets",
                "elasticloadbalancing:DeregisterTargets"
            ],
            "Resource": "arn:aws-cn:elasticloadbalancing:*:*:targetgroup/*/*"
        },
        {
            "Effect": "Allow",
            "Action": [
                "elasticloadbalancing:SetWebAcl",
                "elasticloadbalancing:ModifyListener",
                "elasticloadbalancing:AddListenerCertificates",
                "elasticloadbalancing:RemoveListenerCertificates",
                "elasticloadbalancing:ModifyRule"
            ],
            "Resource": "*"
        }
    ]
}

赋予 EKS node 权限

在 角色 中搜寻 nodegrou-NodeInstanceRole 找到你对应的 EKS 集群 如下图

而后点击该角色 – 点击附加策略

在搜寻框内 输出方才创立的策略名称 而后选中,点击最下边的附加策略。

我的策略名称为:AWSLoadBalancerControllerIAMPolicy

在 EKS 中装置 AWS Load Balancer Controller

装置证书管理器

kubectl apply --validate=false -f https://github.com/jetstack/cert-manager/releases/download/v1.5.3/cert-manager.yaml

部署 YAML

下载负载平衡器控制器的标准。

wget https://github.com/kubernetes-sigs/aws-load-balancer-controller/releases/download/v2.3.1/v2_3_1_full.yaml

编辑保留的 yaml 文件,转到部署标准,并将控制器 –cluster-name arg 值设置为您的 EKS 集群名称

apiVersion: apps/v1
kind: Deployment
. . .
name: aws-load-balancer-controller
namespace: kube-system
spec:
    . . .
    template:
        spec:
            containers:
                - args:
                    - --cluster-name=<INSERT_CLUSTER_NAME>

如果您为服务账户应用 IAM 角色,咱们建议您从 yaml 标准中删除 ServiceAccount。如果您从 yaml 标准中删除装置局部,这将保留 eksctl 创立的 iamserviceaccount。

apiVersion: v1
kind: ServiceAccount

利用 yaml 文件

kubectl apply -f v2_3_1_full.yaml

部署示例应用程序

将游戏 2048 部署为示例应用程序,以确认作为入口对象的后果,Amazon 负载均衡器控制器是否会创立 Amazon ALB。

kubectl apply -f https://raw.githubusercontent.com/kubernetes-sigs/aws-load-balancer-controller/v2.2.0/docs/examples/2048/2048_full.yaml

几分钟后,验证是否已应用以下命令创立入口资源。

kubectl get ingress/ingress-2048 -n game-2048

输入:

NAME           CLASS    HOSTS   ADDRESS                                                                       PORTS   AGE
ingress-2048   <none>   *       k8s-game2048-ingress2-xxxxxxxxxx-yyyyyyyyyy.cn-north-1.elb.amazonaws.com.cn   80      3h42m

{{< notice info “ 留神:” >}}
如果在几分钟后尚未创立入口,请运行以下命令以查看负载均衡器控制器日志。这些日志蕴含可帮忙您诊断部署中任何问题的谬误音讯。
{{< /notice >}}

kubectl logs -n kube-system   deployment.apps/aws-load-balancer-controller

关上浏览器并从上一命令输入导航到 ADDRESS URL 以查看示例应用程序。如果您没有看到任何内容,请期待几分钟,并刷新您的浏览器。


作者:SRE 运维博客
博客地址:https://www.cnsre.cn/
文章地址:https://www.cnsre.cn/posts/211217431135/
相干话题:https://www.cnsre.cn/tags/aws/


正文完
 0