1일 1커밋🌱
EKS Cluster 생성 + ALB Ingress Controller + CI/CD(2)
2. ALB Ingress Controller
1) eksctl로 EKS 클러스터에 대한 OIDC 자격 증명 공급자 생성
-
클러스터에 대한 기존 IAM OIDC 공급자가 있는지 확인한다. 클러스터의 OIDC 공급자 URL을 본다.
aws eks describe-cluster --name <cluster_name> --query "cluster.identity.oidc.issuer" --output text
출력 예)
https://oidc.eks.us-west-2.amazonaws.com/id/EXAMPLED539D4633E53DE1B716D3041E
계정의 IAM OIDC 공급자를 나열한다. <EXAMPLED539D4633E53DE1B716D3041E> (포함 <>)을 이전 명령에서 반환된 값으로 바꿉니다.
aws iam list-open-id-connect-providers | grep <EXAMPLED539D4633E53DE1B716D3041E>
출력 예)
"Arn": "arn:aws:iam::111122223333:oidc-provider/oidc.eks.us-west-2.amazonaws.com/id/EXAMPLED539D4633E53DE1B716D3041E"
이전 명령에서 출력이 반환되면 클러스터에 대한 공급자가 이미 있는 것이다. 출력이 반환되지 않으면 IAM OIDC 공급자를 생성해야 합니다.
-
다음 명령을 사용하여 클러스터에 대한 IAM OIDC 자격 증명 공급자를 생성한다. <cluster_name>(포함 <>)을 자신의 값으로 바꿉니다.
eksctl utils associate-iam-oidc-provider --cluster <cluster_name> --approve
2) AWS 로드 밸런서 컨트롤러에 대한 IAM 정책 생성
-
생성한 Amazon EKS 정책은 AWS 로드 밸런서 컨트롤러가 사용자를 대신하여 AWS API를 호출할 수 있도록 허용한다.
curl -o iam-policy.json https://raw.githubusercontent.com/kubernetes-sigs/aws-load-balancer-controller/main/docs/install/iam_policy.json
-
작업자 노드 인스턴스 프로파일에 대해 AWSLoadBalancerControllerIAMPolicy라는 이름의 IAM 정책을 생성하려면 다음 명령을 실행한다.
aws iam create-policy \ --policy-name AWSLoadBalancerControllerIAMPolicy \ --policy-document file://iam-policy.json
-
eksctl을 사용하여 AWS 로드 밸런서 컨트롤러에 대해 새 IAM Role을 생성한다.
eksctl create iamserviceaccount \ --cluster EKS-Cluster \ --namespace kube-system \ --name aws-load-balancer-controller \ --attach-policy-arn arn:aws:iam::${ACCOUNT_ID}:policy/AWSLoadBalancerControllerIAMPolicy \ --override-existing-serviceaccounts \ --approve
3) AWS AWSLoadBalancer Controller 생성
-
Public Subnet에 태그 지정
이전 포스팅에서 생성한 Public Subnet 2개에 다음과 같은 태그를 달아준다.
-
인증서 구성을 웹훅에 삽입할 수 있도록 cert-manager를 설치
kubectl apply --validate=false -f https://github.com/jetstack/cert-manager/releases/download/$VERSION/cert-manager.yaml
참고: $VERSION을 배포하려는 cert-manager의 버전(Jetstack GitHub 사이트 참조)으로 바꾼다.
-
AWS GitHub에서 AWS 로드 밸런서 컨트롤러에 대해 다운로드한 매니페스트 파일에서 다음 명령을 실행한다.
curl -o ingress-controller.yaml https://raw.githubusercontent.com/kubernetes-sigs/aws-load-balancer-controller/$VERSION/docs/install/v2_1_0_full.yaml
참고: $VERSION을 배포하려는 AWS 로드 밸런서 컨트롤러의 버전(Kubernetes SIGs GitHub 사이트 참조)으로 바꾼다.
-
클러스터의 cluster-name을 편집한다. 예를 들면 다음과 같다.
spec: containers: - args: - --cluster-name=your-cluster-name # edit the cluster name - --ingress-class=alb
-
위에서 eksctl로 이미 ServiceAccount를 생성했기 때문에 파일의 ServiceAccount 부분을 삭제한다.
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
이 부분을 파일에서 삭제한다.
-
AWS 로드 밸런서 컨트롤러를 배포하려면 다음 명령을 실행한다.
kubectl apply -f ingress-controller.yaml
4) EKS Ingress 생성
-
NodePort, Deployment를 배포한다.
apiVersion: v1 kind: Service metadata: name: ingress-test spec: selector: app: nginx ports: - protocol: TCP port: 80 targetPort: 80 nodePort: 30010 type: NodePort --- apiVersion: apps/v1 kind: Deployment metadata: name: ingress-test labels: app: nginx spec: replicas: 3 selector: matchLabels: app: nginx template: metadata: labels: app: nginx spec: containers: - name: nginx image: nginx ports: - containerPort: 80
여기서 NodePort가 ALB TargetGroup의 역할을 하고 Deployment는 배포되는 애플리케이션 이미지를 지정해주면 된다.
이를 배포하려면 다음 명령을 실행한다.
kubectl apply -f nginx.yaml
-
Ingress를 배포한다.
ALB를 생성하기 위해 Ingress를 배포한다. ingress.yaml은 다음과 같다.
apiVersion: extensions/v1beta1 kind: Ingress metadata: name: "ingress" annotations: kubernetes.io/ingress.class: alb # the value we set in alb-ingress-controller alb.ingress.kubernetes.io/scheme: internet-facing alb.ingress.kubernetes.io/subnets: subnet-04bdd6a509acee4bc,subnet-05bab6ef226b681c6 spec: rules: - http: paths: - path: /* backend: serviceName: "ingress-test" servicePort: 80
이를 배포하려면 다음 명령을 실행한다.
kubectl apply -f ingress.yaml
여기까지 완료하면 다음과 같은 화면이 보인다.
참고
- https://aws.amazon.com/ko/premiumsupport/knowledge-center/eks-alb-ingress-controller-setup/
- https://docs.aws.amazon.com/eks/latest/userguide/enable-iam-roles-for-service-accounts.html
- https://www.eksworkshop.com/beginner/130_exposing-service/ingress_controller_alb/
- https://docs.aws.amazon.com/ko_kr/eks/latest/userguide/alb-ingress.html
댓글남기기