이 페이지에서는 AWS 애플리케이션 부하 분산기(ALB)를 설정하는 방법을 보여줍니다.
AWS용 GKE가 지원하는 다른 유형의 부하 분산기에 대한 자세한 내용은 부하 분산기 개요를 참조하세요.
시작하기 전에
AWS용 GKE로 ALB를 만들기 전에 다음을 수행해야 합니다.
- AWS용 GKE 클러스터를 만들고
kubectl
로 액세스를 구성합니다. - AWS에 클러스터의 OIDC 제공업체를 등록합니다.
개요
클러스터에 첫 번째 ALB 만들기에는 다음 단계가 포함됩니다.
- VPC 내에서 ALB를 프로비저닝하려는 서브넷을 식별하고 태그 또는 주석을 지정합니다.
- ALB 컨트롤러에 AWS 리소스 액세스 권한을 제공하는 AWS 역할을 만듭니다.
- 오픈소스
aws-load-balancer-controller
를 설치합니다. - ALB 구성을 만들고 배포합니다.
후속 ALB를 만들려면 다른 ALB 구성만 만들고 배포해야 합니다.
애플리케이션 부하 분산기 만들기
ALB에 대해 서브넷 태그 지정
ALB를 만들기 전에 AWS에 실행할 서브넷을 지정해야 합니다. 일반적인 방법은 자동 검색 프로세스에 제공되는 대로 이를 식별하는 태그를 서브넷에 지정하는 것입니다. 또는 실행할 서브넷을 명시적으로 나열하는 주석을 인그레스 객체에 추가할 수 있습니다.
자동 검색에 제공되는 대로 선택한 서브넷에 태그를 지정하려면 서비스 부하 분산기 서브넷 태그 지정을 참조하세요.
인그레스 객체에 서브넷 목록을 주석으로 추가하려면 alb.ingress.kubernetes.io/subnets
라는 주석을 Kubernetes 인그레스 객체에 추가합니다. 주석 값을 서브넷 ID 또는 서브넷 이름이 쉼표로 구분된 목록으로 설정합니다(예: subnet-012345678abcdef,subnet-
abcdef123456789,subnet-123456789abcdef
).
AWS IAM 권한 만들기
AWS 부하 분산기 컨트롤러에 대한 IAM 정책을 다운로드합니다. 이 정책은 부하 분산기 컨트롤러가 작동하는 데 필요한 권한을 열거합니다. GitHub에서 정책을 검토할 수 있습니다. 이 명령어는 iam_policy.json
이라는 파일에 정책을 저장합니다.
curl -Lo iam_policy.json \
https://raw.githubusercontent.com/kubernetes-sigs/aws-load-balancer-controller/v2.4.4/docs/install/iam_policy.json
이 파일을 사용하여
AWSLoadBalancerControllerIAMPolicy
라는 IAM 정책을 만듭니다.aws iam create-policy \ --policy-name AWSLoadBalancerControllerIAMPolicy \ --policy-document file://iam_policy.json
부하 분산기에 대한 액세스 권한 부여
AWS IAM 역할 만들기의 안내에 따라 컨트롤러의 서비스 계정에 대해 AWS IAM 역할을 만듭니다. 안내에서 다음 항목을 바꿉니다.
AWS_POLICY_ARN
: 이전 단계에서 만든 AWSLoadBalancerControllerIAPolicy의 ARN입니다.KSA_NAME
:"aws-load-balancer-controller"
K8S_NAMESPACE
:"kube-system"
AWS_ROLE_NAME
:"AWSLBControllerRole"
정책의 ARN을 검색하려면 다음 명령어를 실행합니다.
aws iam list-policies \
--query 'Policies[?PolicyName==`AWSLoadBalancerControllerIAMPolicy`].Arn' \
--output text
AWS 부하 분산기 컨트롤러 설치
이 단계를 완료하려면 다음 값을 추출하고 저장합니다. 나중에 이 값이 필요합니다.
다음 명령어를 실행하여 클러스터의 UID를 찾습니다.
gcloud container aws clusters describe CLUSTER_NAME \ --location GOOGLE_CLOUD_LOCATION \ --format "value(uid)"
다음 명령어를 실행하여 클러스터의 VPC ID를 찾습니다.
gcloud container aws clusters describe CLUSTER_NAME \ --location GOOGLE_CLOUD_LOCATION \ --format "value(networking.vpcId)"
다음 명령어를 실행하여
AWSLBControllerRole
이라는 역할의 ARN을 찾습니다.aws iam get-role --role-name AWSLBControllerRole --query Role.Arn --output text
다음 명령어를 실행하여 클러스터의 AWS 리전을 찾습니다.
gcloud container aws clusters describe CLUSTER_NAME \ --location GOOGLE_CLOUD_LOCATION \ --format "value(awsRegion)"
다음과 같이 바꿉니다.
GOOGLE_CLOUD_LOCATION
을 클러스터와 연결된 Google 리전의 이름으로 바꿉니다.CLUSTER_NAME
을 클러스터 이름으로 바꿉니다.
다음 명령어를 사용하여
cert-manager
를 설치합니다.kubectl apply \ --validate=false \ -f https://github.com/jetstack/cert-manager/releases/download/v1.10.0/cert-manager.yaml
aws-load-balancer-controller
에 대해 매니페스트를 다운로드하고 다음 명령어를 사용하여 로컬 파일v2_4_4_full.yaml
에 저장합니다.curl -Lo v2_4_4_full.yaml https://github.com/kubernetes-sigs/aws-load-balancer-controller/releases/download/v2.4.4/v2_4_4_full.yaml
v2_4_4_full.yaml
파일을 수정하고kind: Deployment
를 검색합니다.Deployment
객체를 수정된 버전으로 바꿉니다.kind: Deployment metadata: labels: app.kubernetes.io/component: controller app.kubernetes.io/name: aws-load-balancer-controller name: aws-load-balancer-controller namespace: kube-system spec: replicas: 1 selector: matchLabels: app.kubernetes.io/component: controller app.kubernetes.io/name: aws-load-balancer-controller template: metadata: labels: app.kubernetes.io/component: controller app.kubernetes.io/name: aws-load-balancer-controller spec: containers: - args: - --cluster-name=CLUSTER_UID - --aws-region=AWS_REGION - --aws-vpc-id=AWS_VPC_ID - --ingress-class=alb - --disable-restricted-sg-rules=true image: amazon/aws-alb-ingress-controller:v2.4.4 env: - name: AWS_ROLE_ARN value: AWS_ROLE_ARN - name: AWS_WEB_IDENTITY_TOKEN_FILE value: /var/run/secrets/aws-load-balancer-controller/serviceaccount/token livenessProbe: failureThreshold: 2 httpGet: path: /healthz port: 61779 scheme: HTTP initialDelaySeconds: 30 timeoutSeconds: 10 name: controller ports: - containerPort: 9443 name: webhook-server protocol: TCP resources: limits: cpu: 200m memory: 500Mi requests: cpu: 100m memory: 200Mi securityContext: allowPrivilegeEscalation: false readOnlyRootFilesystem: true runAsNonRoot: true volumeMounts: - mountPath: /tmp/k8s-webhook-server/serving-certs name: cert readOnly: true - mountPath: /var/run/secrets/aws-load-balancer-controller/serviceaccount name: aws-iam-token readOnly: true priorityClassName: system-cluster-critical securityContext: fsGroup: 1337 serviceAccountName: aws-load-balancer-controller terminationGracePeriodSeconds: 10 volumes: - name: cert secret: defaultMode: 420 secretName: aws-load-balancer-webhook-tls - name: aws-iam-token projected: defaultMode: 420 sources: - serviceAccountToken: audience: sts.amazonaws.com expirationSeconds: 86400 path: token ---
다음을 바꿉니다.
CLUSTER_UID
: 클러스터의 UID입니다. 예를 들면bbc7d232-21f6-4bb1-90dd-4b064cf8ccf8
입니다.AWS_VPC_ID
: AWS VPC의 ID입니다. 예를 들면vpc-1234567890abc
입니다.AWS_ROLE_ARN
:AWSLBControllerRole
이라는 역할의 ARN입니다.AWS_REGION
: 클러스터의 AWS 리전입니다. 예를 들면us-east-1
입니다.
다음 명령어를 사용하여 수정된 매니페스트를 클러스터에 적용합니다.
kubectl apply -f v2_4_4_full.yaml
다음 명령어를 사용하여 부하 분산기 컨트롤러가 실행 중인지 확인합니다.
kubectl get deployment -n kube-system aws-load-balancer-controller
출력은 다음과 비슷하게 표시되며, 이는
aws-load-balancer-controller
배포를 사용할 수 있음을 보여줍니다.NAME READY UP-TO-DATE AVAILABLE AGE aws-load-balancer-controller 1/1 1 1 51s
ALB 예시 만들기
이 섹션에서는 2048 게임의 리메이크로 작동하는 예시 ALB를 만드는 방법을 보여줍니다.
다음 YAML 구성을
2048.yaml
이라는 파일에 복사합니다. 구성은 Kubernetes 네임스페이스, 서비스, 배포를 만듭니다. 배포가 인그레스 ALB를 통해 노출됩니다.apiVersion: v1 kind: Namespace metadata: name: game-2048 --- apiVersion: apps/v1 kind: Deployment metadata: namespace: game-2048 name: deployment-2048 spec: selector: matchLabels: app.kubernetes.io/name: app-2048 replicas: 5 template: metadata: labels: app.kubernetes.io/name: app-2048 spec: containers: - image: alexwhen/docker-2048 imagePullPolicy: Always name: app-2048 ports: - containerPort: 80 --- apiVersion: v1 kind: Service metadata: namespace: game-2048 name: service-2048 spec: ports: - port: 80 targetPort: 80 protocol: TCP type: NodePort selector: app.kubernetes.io/name: app-2048 --- apiVersion: networking.k8s.io/v1 kind: Ingress metadata: namespace: game-2048 name: ingress-2048 annotations: alb.ingress.kubernetes.io/scheme: internet-facing spec: ingressClassName: alb rules: - http: paths: - path: / pathType: Prefix backend: service: name: service-2048 port: number: 80
다음 명령어를 사용하여 클러스터에 구성을 적용합니다.
kubectl apply -f 2048.yaml
다음 명령어를 사용하여 인그레스 리소스 상태를 확인합니다.
kubectl get ingress -n game-2048 ingress-2048
명령어 결과는 다음과 같습니다.
ADDRESS
열에는 인그레스 리소스의 엔드포인트가 포함됩니다.NAME CLASS HOSTS ADDRESS PORTS AGE ingress-2048 <none> * k8s-game2048-ingress2-e2c347319a-1195690687.us-west-2.elb.amazonaws.com 80 2m19s ```
브라우저에서 ALB 엔드포인트로 이동합니다(예:
http://k8s-game2048-ingress2-e2c347319a-1195690687.us-west-2.elb.amazonaws.com
). 2048 게임이 표시되고 ALB 부하 분산기가 성공적으로 배포되고 구성되었음을 나타냅니다.
삭제
이전 단계에서 만든 샘플 ALB 및 배포를 삭제하고 다음 명령어로 매니페스트를 삭제합니다.
kubectl delete -f 2048.yaml
다음 단계
- 인그레스 주석 알아보기
- AWS 부하 분산기 컨트롤러 문서 알아보기