Amazon EKS에서 ALB 인그레스를 생성하고 ALB 인그레스를 AWS WAF와 연결하려면 어떻게 해야 하나요?

최종 업데이트 날짜: 2021년 6월 28일

Amazon Elastic Kubernetes Service(Amazon EKS)에서 AWS Load Balancer Controller를 사용하여 Application Load Balancer(ALB)를 생성하려고 합니다. 그런 다음 ALB 인그레스를 AWS WAF와 연결하려고 합니다.

간략한 설명

AWS Load Balancer Controller는 kubernetes.io/ingress.class: alb 주석을 사용하여 수신 객체가 생성될 때 Application Load Balancer를 생성합니다. 인그레스 리소스는 HTTP 또는 HTTPS 트래픽을 Amazon EKS 클러스터 내의 다른 포드로 라우팅하도록 Application Load Balancer를 구성합니다. AWS WAF를 사용하여 Application Load Balancer로 전달되는 HTTP 또는 HTTPS 요청을 모니터링할 수 있습니다.

해결 방법

AWS Load Balancer Controller에 대한 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 Controller에 대한 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 Controller가 사용자를 대신하여 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 Controller에 대한 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

AWS ALB Ingress Controller for Kubernetes 제거

AWS Load Balancer Controller는 AWS ALB Ingress Controller for Kubernetes의 기능을 대체합니다.

AWS Load Balancer Controller가 설치되어 있는지 확인합니다.

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

AWS Load Balancer Controller가 설치되지 않은 경우 다음과 같은 결과가 나타납니다.

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

Helm 3.0.0을 사용하여 AWS Load Balancer Controller 설치 섹션으로 건너뜁니다.

-또는-

AWS Load Balancer Controller가 설치되어 있으면 다음과 같은 결과가 나타납니다.

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

다음 단계를 완료합니다.

1.    AWS Load Balancer Controller 제거:

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 Controller에 AWS ALB Ingress Controller for Kubernetes가 생성한 리소스에 대한 액세스 권한을 부여합니다.

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)] 탭을 선택합니다. 역할 이름은 [물리적 ID(Physical ID)] 열에 있습니다. AWS 관리 콘솔을 사용하여 역할을 생성한 경우 사용자가 명명한 것이 역할 이름입니다. 예: AmazonEKSLoadBalancerControllerRole.

Helm 3.0.0을 사용하여 AWS Load Balancer Controller 설치

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 Controller를 설치합니다.

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 Controller가 설치되어 있는지 확인합니다.

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

5.    다음 주석을 사용하여 클러스터에 Kubernetes 인그레스 리소스를 만듭니다.

annotations:
    kubernetes.io/ingress.class: alb

참고: AWS Load Balancer Controller는 로드 밸런서를 생성합니다. 인그레스 리소스는 HTTP 또는 HTTPS 트래픽을 클러스터 내의 다른 포드로 라우팅하도록 Application Load Balancer를 구성합니다.

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.    탐색 표시줄에서 리전을 선택합니다. Amazon EKS 클러스터에 대해 선택한 리전과 동일한 리전을 선택해야 합니다.

3.    탐색 창의 [로드 밸런싱(LOAD BALANCING)] 섹션에서 [로드 밸런서(Load Balancers)]를 선택합니다.

4.    Application Load Balancer의 주소를 검증하여 인그레스 객체가 Application Load Balancer 리소스를 생성했는지 확인합니다.

웹 ACL 생성

웹 ACL을 생성할 때 Amazon EKS 클러스터에 사용 중인 리전과 동일한 리전을 선택하고 다음을 수행합니다.

1.    웹 ACL을 Application Load Balancer와 연결합니다.

2.    리소스 유형으로 Application Load Balancer를 선택합니다.

3.    웹 ACL에 대한 Amazon CloudWatch 지표 이름을 추가합니다.

4.    웹 ACL에 원하는 조건과 규칙을 추가합니다.

5.    AWS WAF 콘솔에서 AWS WAF ID를 복사하거나 AWS WAF 웹 ACL JSON 파일을 다운로드합니다.

JSON에서 AWS WAF 웹 ACL의 출력 예:

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

ALB 인그레스에 AWS WAF 웹 ACL 주석 추가

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: {}

이 문서가 도움이 되었나요?


결제 또는 기술 지원이 필요하세요?