Notice
Recent Posts
Recent Comments
Link
devops
EKS ALB Controller 생성 후, ALB Ingress 배포하기 본문
반응형
Ingress 동작 방식
- ALB Controller는 API 서버의 Ingress 이벤트를 모니터링한다. 요구 사항을 충족하는 수신 리소스 발견 시, AWS 리소스 생성을 시작한다.
- 수신 리소스에 맞춰 AWS에서 ALB(ELB v2)를 생성한다.(이 ALB는 인터넷 연결이 되거나 내부에 존재할 수 있으며 Annotation으로 서브넷 지정 가능)
- Target Group은 수신 리소스에서 지정된 고유 k8s 서비스에 대해 AWS에서 생성된다.
- 수신 리소스의 Annotation에 설명된 모든 포트에 대해 리스너가 생성된다. 포트는 80과 443이 디폴트며, Annotation에 인증서 첨부도 가능하다.
- 수신 리소스에 각 경로에 대한 규칙이 생성된다. 특정 경로에 대한 트래픽이 적절한 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
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 지정)
반응형
'DevOps > Kubernetes' 카테고리의 다른 글
EKS 스케일링의 강자 Karpenter (0) | 2023.06.27 |
---|---|
EKS Ingress 생성 시 failed to retrieve credentials, sts:AssumeRoleWithWebIdentity 오류 해결하기 (0) | 2023.05.17 |
EKS Kubeconfig 다중 클러스터 적용하기 (0) | 2023.03.07 |
Kubernetes App, Control Plane, Worker Node의 Failure 대처 명령어 (0) | 2023.01.01 |
파드의 멀티 컨테이너, 디자인 패턴(Design Pattern) 정리 (0) | 2022.12.18 |
Comments