devops

EKS ALB Controller 생성 후, ALB Ingress 배포하기 본문

DevOps/Kubernetes

EKS ALB Controller 생성 후, ALB Ingress 배포하기

vata500 2023. 5. 17. 21:57
반응형

Ingress 동작 방식

  1. ALB Controller는 API 서버의 Ingress 이벤트를 모니터링한다. 요구 사항을 충족하는 수신 리소스 발견 시, AWS 리소스 생성을 시작한다.
  2. 수신 리소스에 맞춰 AWS에서 ALB(ELB v2)를 생성한다.(이 ALB는 인터넷 연결이 되거나 내부에 존재할 수 있으며 Annotation으로 서브넷 지정 가능)
  3. Target Group은 수신 리소스에서 지정된 고유 k8s 서비스에 대해 AWS에서 생성된다.
  4. 수신 리소스의 Annotation에 설명된 모든 포트에 대해 리스너가 생성된다. 포트는 80과 443이 디폴트며, Annotation에 인증서 첨부도 가능하다.
  5. 수신 리소스에 각 경로에 대한 규칙이 생성된다. 특정 경로에 대한 트래픽이 적절한 k9s 서비스로 라우팅된다.

1) OIDC 프로바이더 생성

AWS IAM에서는 OIDC(OpenID Connect)로 연동 자격 증명을 지원하는 기능을 추가했다. 이 기능으로 자격 증명 공급자를 이용하여 AWS API 호출을 인증하고 유효한 OIDC JWT를 수신한다.

이 토큰을 AWS STS AssumeRoleWithWebIdentity API작업에 전달하고 IAM 임시 역할 자격 증명을 수신한다. 이 자격 으로 AWS 서비스 리소스를 k8s 리소스들이 사용할 수 있게된다.

아래와 같이 eksctl로 IAM OIDC Provider를 생성한다.

eksctl utils associate-iam-oidc-provider \
    --region ${AWS_REGION} \
    --cluster ${ekscluster_name} \
    --approve

생성된 oidc 자격 증명 공급자

 

2) ALB Controller

2-1) ALB Controller의 IAM Policy File

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

2-2) Create IAM Policy

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

2-3) Create Service Account (앞서 생성된 Policy와 Role을 이용)

eksctl create iamserviceaccount \
--cluster=${ekscluster_name} \
--namespace=kube-system \
--name=aws-load-balancer-controller \
--attach-policy-arn=arn:aws:iam::${ACCOUNT_ID}:policy/AWSLoadBalancerControllerIAMPolicy \
--override-existing-serviceaccounts \
--region ${AWS_REGION} \
--approve

k8s에 Service Account 생성 확인

kubectl get serviceaccounts -n kube-system aws-load-balancer-controller -o yaml

 

2-4) Cert Manager 설치

export CERTMGR_VERSION=1.9.1
kubectl apply --validate=false -f https://github.com/jetstack/cert-manager/releases/download/v${CERTMGR_VERSION}/cert-manager.yaml
kubectl -n cert-manager get pods

3개의 cert manger pod가 작동하는 지 확인

2-5) ALB Controller Pod 설치

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

yaml파일에서 cluster-name에 적용할 cluster 이름을 지정, Service Account 섹션은 이미 'aws-load-balancer-controller' SA 를 생성했기 때문에 지워줌

kubectl apply -f v2_4_7_full.yaml
kubectl get po -n kube-system

정상 작동 중인 것을 확인.

3) Ingress Configuration

# ingress.yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: "i8"
  annotations:
    kubernetes.io/ingress.class: alb
    alb.ingress.kubernetes.io/target-type: ip
    alb.ingress.kubernetes.io/scheme: internet-facing
    alb.ingress.kubernetes.io/subnets: subnet-xxxxxxx
spec:
  rules:
   - http:
      paths:
        - path: /
          pathType: Prefix
          backend:
            service:
              name: "nginx"
              port:
                number: 80

위는 Ingress.yaml 예시로 nginx service를 참조하고 있다. 여기서 annotation 설정이 중요하다.

  • alb.ingress.kubernetes.io/target-type: ip (트래픽 모드를 의미)
    • instance type : 수신 트래픽은 ALB에서 시작하여 각 서비스의 NodePort를 통해 Kubernetes 노드에 도달합니다. 이는 수신 리소스에서 참조하는 서비스가 ALB에 도달하기 위해 에서 type:NodePort가 있어야 함을 의미합니다.
    • ip type : 수신 트래픽은 ALB에서 시작하여 Kubernetes Pod에 직접 도달합니다. CNI는 ENI의 Secondary IP 주소를 통해 직접 액세스할 수 있는 POD IP를 지원해야 합니다.
  • alb.ingress.kubernetes.io/scheme: internet-facing (로드밸런서의 인터넷 연결 여부)
  • alb.ingress.kubernetes.io/subnets: subnet-********* (ALB가 라우트할 수 있는 subnet 지정)

Ingress 생성 완료
target-type(트래픽 모드)이 IP기 때문에 target은 Pod의 IP로 설정되어있다.

반응형
Comments