如何在 Amazon EKS 中创建 ALB 入口并将 ALB 入口与 AWS WAF 关联?

上次更新时间:2021 年 6 月 28 日

我想使用 Amazon Elastic Kubernetes Service (Amazon EKS) 中的 AWS Load Balancer 控制器创建 Application Load Balancer (ALB)。然后,我想将 ALB 入口与 AWS WAF 关联起来。

简短描述

当使用 kubernetes.io/ingress.class: alb 注释创建入口对象时,AWS Load Balancer 控制器会创建 Application Load Balancer。入口资源将 Application Load Balancer 配置为将 HTTP 或 HTTPS 流量路由到 Amazon EKS 集群中的不同 Pod。您可以使用 AWS WAF 监控转发到 Application Load Balancer 的 HTTP 或 HTTPS 请求。

解决方法

为 AWS Load Balancer 控制器创建 OIDC 提供商和 IAM 角色

1.    创建 AWS Identity and Access Management (IAM) OIDC 提供商,并将 OIDC 提供商与您的集群关联:

eksctl utils associate-iam-oidc-provider --region region-code --cluster your-cluster-name --approve

2.    为 AWS Load Balancer 控制器下载 IAM 策略:

curl -o iam_policy.json https://raw.githubusercontent.com/kubernetes-sigs/aws-load-balancer-controller/v2.2.0/docs/install/iam_policy.json

注意:IAM 策略允许 AWS Load Balancer 控制器代表您调用 AWS API。

3.    使用从第 2 步下载的策略创建 IAM 策略:

aws iam create-policy --policy-name AWSLoadBalancerControllerIAMPolicy --policy-document file://iam_policy.json

注意:复制在第 3 步中返回的策略 Amazon 资源名称 (ARN) 的名称。

4.    为 AWS Load Balancer 控制器创建 IAM 角色,并将该角色附加到在第 2 步中创建的服务账户:

eksctl create iamserviceaccount --cluster=your-cluster --namespace=kube-system --name=aws-load-balancer-controller --attach-policy-arn=arn:aws:iam::YOUR_AWS_ACCOUNT_ID:policy/AWSLoadBalancerControllerIAMPolicy --override-existing-serviceaccounts --approve

卸载用于 Kubernetes 的 AWS ALB 入口控制器

AWS Load Balancer 控制器取代了 Kubernetes 的 AWS ALB 入口控制器的功能。

检查是否已安装 AWS Load Balancer 控制器:

kubectl get deployment -n kube-system alb-ingress-controller

如果未安装 AWS Load Balancer 控制器,您将收到以下输出:

Error from server (NotFound): deployments.apps "alb-ingress-controller" not found

跳到使用 Helm 3.0.0 安装 AWS Load Balancer 控制器部分。

-或者-

如果已安装 AWS Load Balancer 控制器,您将收到以下输出:

NAME                   READY UP-TO-DATE AVAILABLE AGE
alb-ingress-controller 1/1   1          1         122d

完成以下步骤:

1.    删除 AWS Load Balancer 控制器:

kubectl delete -f https://raw.githubusercontent.com/kubernetes-sigs/aws-alb-ingress-controller/v1.1.8/docs/examples/alb-ingress-controller.yaml
kubectl delete -f https://raw.githubusercontent.com/kubernetes-sigs/aws-alb-ingress-controller/v1.1.8/docs/examples/rbac-role.yaml

现在,请完成以下步骤,以将 IAM 策略添加到您的 IAM 角色。IAM 策略允许 AWS Load Balancer 控制器访问 Kubernetes 的 AWS ALB 入口控制器创建的资源。

1.    下载 IAM 策略:

curl -o iam_policy_v1_to_v2_additional.json https://raw.githubusercontent.com/kubernetes-sigs/aws-load-balancer-controller/v2.2.0/docs/install/iam_policy_v1_to_v2_additional.json

2.    创建 IAM 策略并记下返回的 ARN:

aws iam create-policy --policy-name AWSLoadBalancerControllerAdditionalIAMPolicy --policy-document file://iam_policy_v1_to_v2_additional.json

3.    将 IAM 策略附加到您之前创建的 IAM 角色:

aws iam attach-role-policy --role-name eksctl-your-role name  --policy-arn arn:aws:iam::111122223333:policy/AWSLoadBalancerControllerAdditionalIAMPolicy

注意:如果您使用 eksctl 创建角色,则使用 AWS CloudFormation 控制台查找该角色。选择 eksctl-your-cluster-name-addon-iamserviceaccount-kube-system-aws-load-balancer-controller 堆栈。然后,选择 Resources(资源)选项卡。角色名称位于 Physical ID(物理 ID)列中。如果您使用 AWS 管理控制台创建角色,则角色名称是您命名的任何名称。例如:AmazonEKSLoadBalancerControllerRole

使用 Helm 3.0.0 安装 AWS Load Balancer 控制器

1.    安装 TargetGroupBinding 自定义资源定义:

kubectl apply -k "github.com/aws/eks-charts/stable/aws-load-balancer-controller//crds?ref=master"

2.    添加 eks-charts 存储库:

helm repo add eks https://aws.github.io/eks-charts

3.    使用与集群的 AWS 区域对应的命令安装 AWS Load Balancer 控制器:

helm upgrade -i aws-load-balancer-controller eks/aws-load-balancer-controller --set clusterName=your-cluster-name --set serviceAccount.create=false --set serviceAccount.name=aws-load-balancer-controller -n kube-system

注意:如果您要在用于 Fargate 的 Amazon EKS 上部署,则必须在命令中添加以下标记:

* --set region=your-region-code
* --set vpcId=your-vpc-xxxxxxxx

4.    验证已安装了 AWS Load Balancer 控制器:

kubectl get deployment -n kube-system aws-load-balancer-controller

5.    使用以下注释在集群上创建 Kubernetes 入口资源:

annotations:
    kubernetes.io/ingress.class: alb

注意:AWS Load Balancer 控制器创建负载均衡器。入口资源将 Application Load Balancer 配置为将 HTTP 或 HTTPs 流量路由到集群中的不同 Pod。

6.    添加 internal(内部)或 internet-facing(面向互联网)注释,以指定您希望入口在何处创建负载均衡器:

alb.ingress.kubernetes.io/scheme: internal

-或者-

alb.ingress.kubernetes.io/scheme: internet-facing

注意:选择 internal (内部) 可创建内部负载平衡器,选择 internet-facing (面向互联网) 可创建面向公众的负载均衡器。

部署示例应用程序

1.    部署示例应用程序,以验证 ALB 入口控制器是否因入口对象而创建了 Application Load Balancer:

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

2.    验证入口资源是否已创建并与 Application Load Balancer 关联:

kubectl get ingress ingress-2048 -n game-2048

示例输出:

NAME           HOSTS   ADDRESS                                                                 PORTS      AGE
ingress-2048   *       example-2048game-2048ingr-xxxxxxx.region-code.elb.amazonaws.com         80          2h

验证 Application Load Balancer 地址

1.    打开 Amazon Elastic Compute Cloud (Amazon EC2) 控制台

2.    在导航栏上,选择 Region(区域)。请务必选择您为 Amazon EKS 集群选择的相同区域。

3.    在导航窗格中的 LOAD BALANCING(负载均衡)部分,选择 Load Balancers(负载均衡器)。

4.    验证 Application Load Balancer 的地址,以查看入口对象是否已创建 Application Load Balancer 资源。

创建 Web ACL

创建 Web ACL 时,请选择您用于 Amazon EKS 集群的相同区域,并执行以下操作:

1.    关联 Web ACL 与 Application Load Balancer。

2.    选择 Application Load Balancer 作为资源类型。

3.    为您的 Web ACL 添加 Amazon CloudWatch 指标名称。

4.    向 Web ACL 添加任何所需的条件和规则。

5.    从 AWS WAF 控制台复制 AWS WAF ID,或下载 AWS WAF Web ACL JSON 文件。

JSON 中的 AWS WAF Web ACL 的示例输出:

{
  "Name": "",
  "Id": "ea199076-xxx-xxxx-xxxx-xxxxxxxxxxx",
  "ARN": "",
  "DefaultAction": {
    "Allow": {}
  },
  "Description": "",
  "Rules": [],
  "VisibilityConfig": {
    "SampledRequestsEnabled": ,
    "CloudWatchMetricsEnabled": ,
    "MetricName": ""
  },
  "Capacity": ,
  "ManagedByFirewallManager": 
}

将 AWS WAF Web ACL 注释添加到 ALB 入口

1.    编辑 ALB 入口,然后使用您之前复制的 AWS WAF ID 添加 alb.ingress.kubernetes.io/waf-acl-id: 注释:

kubectl edit ingress/ingress-2048 -n game-2048

入口清单的示例输出:

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  annotations:
    alb.ingress.kubernetes.io/waf-acl-id:  ea199076-xxx-xxxx-xxxx-xxxxxxxxxxx
    alb.ingress.kubernetes.io/scheme: internet-facing
    kubernetes.io/ingress.class: alb
  labels:
    app: 2048-ingress
  name: ingress-2048
  namespace: game-2048
spec:
  rules:
  - http:
      paths:
      - backend:
          serviceName: service-2048
          servicePort: 80
        path: /*
status:
  loadBalancer: {}

这篇文章对您有帮助吗?


您是否需要账单或技术支持?