IaaS/퍼블릭클라우드

(AWS) EKS에서 ALB를 생성할 때 유의할점

armyost 2022. 3. 18. 18:18
728x90

필자는 AWS Ingress Controller는 2.4버전을 설치코자 한다. 

 

AWS Ingress Controller 설치

 

우선 EKS 내에서 AWS 로드벨런서 자원을 접근해야 한다. EKS에 대해서 IAM은 OpenIDConnect를 생성하고 생성된 커넥션에 로드벨런서 및 관련 Addon을 컨트롤할 수 있는 IAM Policy를 할당해야 한다. (컨트롤러 설치는 이게 핵심)

 

※ IAM 에서 OIDC 생성 방법 : https://docs.aws.amazon.com/ko_kr/eks/latest/userguide/enable-iam-roles-for-service-accounts.html

 

OIDC를 생성 완료 하면 eksctl을 통해 ServiceAccount를 생성하여 연결시킨다.

$ eksctl create iamserviceaccount \
  --cluster=test1-docker \
  --namespace=kube-system \
  --name=aws-load-balancer-controller \
  --attach-policy-arn=arn:aws:iam::#####:policy/AWSLoadBalancerControllerIAMPolicy \
  --override-existing-serviceaccounts \
  --approve

여기세 IAM Role을 할당하게 되는데, 이 IAM Role 에 다음 IAM Policy가 할당되어야 한다. 

 

※ OIDC와 EKS(정확히 ServiceAccount) 간 커넥션에 적용해야 하는 IAM Policy

1. https://raw.githubusercontent.com/kubernetes-sigs/aws-load-balancer-controller/v2.4.0/docs/install/iam_policy.json

2, https://raw.githubusercontent.com/kubernetes-sigs/aws-load-balancer-controller/v2.4.0/docs/install/iam_policy_v1_to_v2_additional.json

 

 

이건 왜하는지 모르겠는데 하라니까 하자.

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

 

이 후에 Helm을 통해서 ALB_Ingress컨트롤러를 생성하자. 물론 방금 권한을 부여한 ServiceAccount를 할당하는 옵션을 주고..

$ helm repo add eks https://aws.github.io/eks-charts
$ helm upgrade -i aws-load-balancer-controller eks/aws-load-balancer-controller \
--set clusterName=test1-docker \
--set serviceAccount.create=false \
--set serviceAccount.name=aws-load-balancer-controller \
-n kube-system

 

ALB_Ingress컨트롤러가 잘 올라왔는지 확인하다.

 

이제는 Kubernetes Service에 대해 실제로 로드벨런서를 생성해보자.


참고로 Ingress.yaml을 만들때는 아래 Annotation 설명을 꼭 참고하길 바란다. 왜냐하면 ALB_Ingress컨트롤러 버전에 따라 Annotation도 조금씩 바뀌기 때문이다. 

 

※ AWS Ingress Annotation Document 링크 : https://kubernetes-sigs.github.io/aws-load-balancer-controller/v2.4/deploy/subnet_discovery/

 

Subnet Discovery - AWS Load Balancer Controller

Subnet Auto Discovery AWS Load Balancer controller auto discovers network subnets for ALB or NLB by default. ALB requires at least two subnets across Availability Zones, NLB requires one subnet. The subnets must be tagged appropriately for the auto discove

kubernetes-sigs.github.io

 

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: dashboard-ingress
  namespace: kubernetes-dashboard
  annotations:
    kubernetes.io/ingress.class: alb
    alb.ingress.kubernetes.io/target-type: ip
    alb.ingress.kubernetes.io/scheme: internet-facing
    alb.ingress.kubernetes.io/certificate-arn: arn:aws:acm:ap-north###############
    alb.ingress.kubernetes.io/ssl-policy: ELBSecurityPolicy-2016-08
    alb.ingress.kubernetes.io/backend-protocol: HTTPS
    #alb.ingress.kubernetes.io/healthcheck-path: /login
    alb.ingress.kubernetes.io/listen-ports: '[{"HTTPS": 443}]'
    #alb.ingress.kubernetes.io/action.ssl-redirect: '{"Type": "redirect", "RedirectConfig": {"Protocol": "HTTPS", "Port": "443", "StatusCode": "HTTP_301"}}'
  labels:
    app: kubernetes-dashboard  
spec:
  rules:
  - http:
      paths:
      - backend:
          serviceName: kubernetes-dashboard
          servicePort: 443

 

Ingress.yaml을 작성했다면 Deploy해본다. 이때 꼭! ALB_Ingress컨트롤러의 Pod를 Log걸어두고 진행하자. 가시성이 없으면 뭐가 문제인지 모르니

 

Ingress.yaml을 현 상태에서 Deploy하면 ALB_Ingress컨트롤러가 Subnet을 찾을수 없다고 Error가 발생한다.

 

ALB_Ingress컨트롤러가 적합한 퍼블릭 서브넷을 스스로 탐색하고, 로드벨런서를 해당 서브넷이 할당하기 위해서는 서브넷에 태깅을 해주어야한다.(여기서 삽질 엄청함..)  아래 가이드 참고바란다.  

https://docs.aws.amazon.com/ko_kr/eks/latest/userguide/alb-ingress.html

 

Amazon EKS의 애플리케이션 로드 밸런싱 - Amazon EKS

잠재적 보안 위험(Potential security risk): 수신 리소스를 만들거나 수정할 수 있는 RBAC 권한이 있는 모든 Kubernetes 사용자가 동일한 신뢰 경계 내에 있는 경우에만 수신에 대한 수신 그룹을 지정합니

docs.aws.amazon.com

 

이까지 마치면 이제 Ingress도 잘올라오고 서비스도 잘된다.