[EKS] 3Tier 구성 - ALB Controller 설치

이정훈·2023년 7월 10일
0

EKS

목록 보기
4/9
post-thumbnail

AWS Load Balancer Controller 추가 기능 설치 - Amazon EKS

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

Workshop Studio

  • 설치전 전반적인 구조를 이해하자!
    - IAM 정책과 역할을 생성한다
    - K8s Cluster에서 사용할 서비스 계정을 생성하고, 역할을 연동한다
    - 클러스터 간 통신에 사용할 인증서를 위해 cert-manager.yaml
    - 컨트롤러 설치

1. IAM 정책 생성

  • 사용자를 대신해 AWS API를 호출할 수 있는 AWS LoadBalancer Controller의 IAM 정책을 다운로드한다
# 일반적인 Region
curl -O https://raw.githubusercontent.com/kubernetes-sigs/aws-load-balancer-controller/v2.4.7/docs/install/iam_policy.json
    
# 미국 동부 또는 미국 서부 Region
curl -O https://raw.githubusercontent.com/kubernetes-sigs/aws-load-balancer-controller/v2.4.7/docs/install/iam_policy_us-gov.json
  • 정책 JSON 파일로 IAM 정책을 생성한다
    (미국 동부 또는 서부에 해당하는 경우는 iam_policy.json 대신 iam_policy_us-gov.json으로 변경)
aws iam create-policy \
	--policy-name AWSLoadBalancerControllerIAMPolicy \
	--policy-document file://iam_policy.json

2. IAM 역할 생성

  • 클러스터의 OIDC 제공 업체 ID를 검색하고 변수에 저장한다
oidc_id=$(aws eks describe-cluster --name my-cluster --query "cluster.identity.oidc.issuer" --output text | cut -d '/' -f 5)
  • 클러스터 ID를 가진 IAM OIDC 제공 업체가 계정에 존재하는지 확인한다
  • 만약 아래 명령어를 입력했을 때 출력 되는 결과물이 있다면, 이미 IAM OIDC 제공 업체가 존재하는 것
aws iam list-open-id-connect-providers | grep $oidc_id | cut -d "/" -f4
  • 나는 없다! 그래서 제공업체를 등록하자!

  • OIDC 제공 업체가 존재할 경우 위 명령어 실행 시 긴 코드가 출력 되는데, 다음 설정에 필요하니 복사해두거나, 따로 적어 놓도록 한다

  • EKS Cluster로 이동해서 클러스터의 OpenID Connect 공급자 URL을 복사한다

  • IAM 콘솔로 이동해서 왼쪽 메뉴 액세스 관리 - 자격 증명 공급자로 이동
  • 공급자 추가 - OpenID Connect 선택 후 공급자 URL에 복사한 OpenID Connect 공급자 URL 입력
  • 대상 주소에 sts.amazonaws.com 입력 후 공급자 추가

  • 추가 된 것을 확인할 수 있다.

  • 위 명령어를 입력하면 아래와 같이 나온다!

  • 자이제 아래 명령어를 CLI 콘솔에 입력해주자

  • 이 부분 중요! 입력을 하더라도 추가가 되었는지 확인해야 한다!
    "oidc.eks..amazonaws.com/id/<OIDC_ID>:aud": "sts.amazonaws.com",
    "oidc.eks..amazonaws.com/id/<OIDC_ID>:sub": "system:serviceaccount:kube-system:aws-load-balancer-controller"

  • 이게 잘 추가가 되었는지 확인해야한다! 만약 리전별 클러스터를 구성한다면..

# <AWS Account ID>에는 AWS 계정의 ID 12글자의 숫자를 입력해준다
# <region-code>에는 EKS 클러스터가 위치한 리전의 코드를 입력한다
# <OIDC_ID>에는 아까 복사해놓은 oidc 코드를 입력해준다
cat > load-balancer-role-trust-policy.json << EOF
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": {
                "Federated": "arn:aws:iam::<AWS Account ID>:oidc-provider/oidc.eks.<region-code>.amazonaws.com/id/<OIDC_ID>"
            },
            "Action": "sts:AssumeRoleWithWebIdentity",
            "Condition": {
                "StringEquals": {
                    "oidc.eks.<region-code>.amazonaws.com/id/<OIDC_ID>:aud": "sts.amazonaws.com",
                    "oidc.eks.<region-code>.amazonaws.com/id/<OIDC_ID>:sub": "system:serviceaccount:kube-system:aws-load-balancer-controller"
                }
            }
        }
    ]
}
EOF

# IAM 역할을 생성한다
aws iam create-role \
  --role-name AmazonEKSLoadBalancerControllerRole \
  --assume-role-policy-document file://"load-balancer-role-trust-policy.json"

# 필요한 Amazon EKS 관리형 IAM 정책을 IAM 역할에 연결한다
# <AWS Account ID>에는 AWS 계정의 ID 12글자의 숫자를 입력해준다
aws iam attach-role-policy \
  --policy-arn arn:aws:iam::<AWS Account ID>:policy/AWSLoadBalancerControllerIAMPolicy \
  --role-name AmazonEKSLoadBalancerControllerRole

# <AWS Account ID>에는 AWS 계정의 ID 12글자의 숫자를 입력해준다
# EKS Cluster가 미국 동부 또는 미국 서부 리전에 있는 경우 arn:aws: -> arn:aws-us-gov:
cat >aws-load-balancer-controller-service-account.yaml <<EOF
apiVersion: v1
kind: ServiceAccount
metadata:
  labels:
    app.kubernetes.io/component: controller
    app.kubernetes.io/name: aws-load-balancer-controller
  name: aws-load-balancer-controller
  namespace: kube-system
  annotations:
    eks.amazonaws.com/role-arn: arn:aws:iam::<AWS Account ID>:role/AmazonEKSLoadBalancerControllerRole
EOF

# Cluster에 Kubernetes 서비스 계정을 생성한다
kubectl apply -f aws-load-balancer-controller-service-account.yaml
  • 추가 정책 생성 후 역할에 연결
# IAM 정책 파일 다운로드
curl -O https://raw.githubusercontent.com/kubernetes-sigs/aws-load-balancer-controller/v2.4.7/docs/install/iam_policy_v1_to_v2_additional.json

# Cluster가 미국 동부 또는 미국 서부 Region인 경우에만 아래 내용 실행
sed -i.bak -e 's|arn:aws:|arn:aws-us-gov:|' iam_policy_v1_to_v2_additional.json

# 아래 IAM 정책을 생성하는 명령을 실행하고 반환된 ARN 메모

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

# 위의 단계에서 생성한 IAM 역할에 연결
# <role-name> 부분을 위에서 생성한 Role(AmazonEKSLoadBalancerControllerRole)로 변경
aws iam attach-role-policy \
  --role-name <role-name> \
  --policy-arn arn:aws:iam::<AWS Account ID>:policy/AWSLoadBalancerControllerAdditionalIAMPolicy

3. AWS Load Balancer Controller 설치

# SSL/TLS 인증을 위한 cert-manager 구성 파일 다운
kubectl apply \
    --validate=false \
    -f https://github.com/jetstack/cert-manager/releases/download/v1.5.4/cert-manager.yaml

# 컨트롤러 구성 다운
curl -Lo v2_4_7_full.yaml https://github.com/kubernetes-sigs/aws-load-balancer-controller/releases/download/v2.4.7/v2_4_7_full.yaml

# ServiceAccount 섹션 제거
# 이 섹션을 제거하지 않으면 이전 단계에서 서비스 계정에 작성한 필수 주석이 덮어씌워진다
sed -i.bak -e '561,569d' ./v2_4_7_full.yaml

# <my-cluster> 필드를 eks cluster의 이름으로 변경
sed -i.bak -e 's|your-cluster-name|<my-cluster>|' ./v2_4_7_full.yaml

# Controller 파일 적용
kubectl apply -f v2_4_7_full.yaml

# IngressClass, IngressClassParams 매니페스트 다운
curl -Lo v2_4_7_ingclass.yaml https://github.com/kubernetes-sigs/aws-load-balancer-controller/releases/download/v2.4.7/v2_4_7_ingclass.yaml

# 적용
kubectl apply -f v2_4_7_ingclass.yaml
  • 작동 확인
kubectl get deployment -n kube-system aws-load-balancer-controller

profile
싱숭생숭늉

0개의 댓글