作者: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 是帮助管理 Kubernetes 集群的弹性负载均衡器的控制器。
下图详细说明了此控制器创建的 AWS 组件。它还演示了从 ALB 到 Kubernetes 集群的路由入口流量。
[1]:控制器监视来自 API 服务器的入口事件。当它找到满足其要求的入口资源时,它开始创建 AWS 资源。
[2]:在 AWS 中为新的入口资源创建了一个 ALB (ELBv2)。此 ALB 可以面向 Internet 或内部。您还可以使用注释指定它在其中创建的子网。
[3]:在 AWS 中为入口资源中描述的每个独特的 Kubernetes 服务创建目标组。
[4]:为入口资源注释中详述的每个端口创建侦听器。如果未指定端口,则使用合理的默认值 (80
或443
)。证书也可以通过注释附加。
[5]:为入口资源中指定的每个路径创建规则。这可确保将特定路径的流量路由到正确的 Kubernetes 服务。
关于子网的说明:
根据EKS 最佳实践。EKS 的 worker node,它们只需要接收来自 alb ingress(通过内网转发)的流量,安全起见就需要把他们放在私有子网。但是它们又需要去公网上拉一些镜像,所以它们本身也需要放问公网的能力,这个时候它们的子网里配置个 nat,访问外网的时候由 NAT 做一个出向的转发,就可以实现了,但是因为 nat 是单向的,外界是无法通过NAT访问到eks的节点的,所以我就需要将ALB 放在 public 子网里。最后就是 ALB 放在 public 来接受流量,worker node 在私有子网处理业务。
打开 策略 点击 创建策略
打开 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": "*" } ] }
在 角色 中搜索 nodegrou-NodeInstanceRole
找到你对应的 EKS 集群 如下图
然后点击该角色-- 点击附加策略
在搜索框内 输入刚才创建的策略名称 然后选中,点击最下边的附加策略。
我的策略名称为:AWSLoadBalancerControllerIAMPolicy
kubectl apply --validate=false -f https://github.com/jetstack/cert-manager/releases/download/v1.5.3/cert-manager.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/