2024. 8. 28. 17:36ㆍKubernetes/Kubernetes_Service
안녕하세요, 달콤한달팽이입니다.🐌🙂
이번 시간에는 Ingress, 그 중에도 AWS에서 주로 사용되는 ALB Ingress를 배포하는 데
필요한 준비요소와 설치 방법에 대하여 알아보겠습니다.
Ingress를 사용하기 위해선 Ingress Controller, 자격 증명 공급자 등록, IAM 정책 수정 등의 과정이 필요합니다.
때문에 실습에 앞서 각각이 무엇을 의미하는지, 왜 필요한지 우선 파악해 보도록 하겠습니다!
Ingress Controller란?
Ingress Controller란, AWS의 리소스(ELB)와 Kubernetes간의 중개 역할을 수행하는 서비스입니다.
때문에 Ingress Controller가 없이 Ingress를 배포해도, 이는 AWS 콘솔상에서 반영되지 않는 현상이 발생합니다.
이는 클러스터 생성시 자동 생성되지 않아 직접 설치가 필요합니다.
그렇다면, Ingress Controller는 어떠한 특징을 가지는 걸까요?
1) 이벤트 감시 및 수행
ALB Ingress Controller는 API 서버로부터 전달 받는 Ingress 관련 이벤트를 감시하며, 요청 조건에 맞는 AWS 리소스를 생성합니다.
2) ELB 생성
ELB는 Ingress 배포 단위대로 생성되며, 배포 방식에 따라 Internet Facing 혹은 Internal로 생성이 가능합니다.
즉, Ingress를 하나 배포할때마다 ELB가 하나씩 생성됩니다.
3 ~ 5) ELB Target Group, Listener, Rule
ELB에 연결될 Target Group, Listener, Rule 모두 Ingress에서 정의한 대로 생성됩니다.
Target Group은 Kubernetes 서비스 단위로, Listener은 별도 포트를 지정하지 않을 경우 80/443으로 생성됩니다.
하지만 이렇게 Kubernetes의 클러스터가 AWS의 리소스에 영향을 끼치기 위해선 그에 맞는 권한이 필요합니다.
때문에 Kubernetes의 OIDC와, AWS IAM의 자격 증명 공급자를 통해 이를 해결할 수 있습니다.
OIDC와 자격 증명 공급자에 대해 아래에서 조금 더 자세히 살펴보겠습니다.
OIDC란?
OIDC란, 사용자가 EKS 클러스터에 접근 가능하도록 인증을 위한 메커니즘입니다.
EKS 클러스터 생성시 기본으로 제공되며,
OIDC를 사용하여 AWS IAM의 역할과 EKS의 ServiceAccount간 매핑을 설정할 수 있게 합니다.
그럼 이제 본격적으로 ALB Ingress를 생성해보는 시간을 갖도록 하겠습니다.
1) 자격 증명 공급자 추가
Pod란, 컨테이너를 하나 이상 모아놓은 것으로 쿠버네티스 애플리케이션의 최소 단위입니다.
IAM의 "자격 증명 공급자" 탭을 통해서 생성이 가능합니다.
공급자 URL에는 EKS 클러스터에서 제공되는 OpenID Connect 공급자 URL을, 대상에는 sts.amazonaws.com을 기입해주세요!
2) ALB Ingress Controller 정책 설정
ALB Ingress Controller는 AWS ALB를 생성하고, 수정하는 권한이 필요합니다.
때문에 ALB Ingress Controller를 배포하기 전, ALB Ingress Controller에서 사용할 정책을 우선 설정해보도록 하겠습니다.
우선, ALB Ingress Controller를 위한 정책을 다운로드해주세요!
다운로드가 성공적으로 진행되었을 경우 "iam_policy.json" 파일이 다운받아졌을 것입니다.
curl -o iam_policy.json https://raw.githubusercontent.com/kubernetes-sigs/aws-load-balancer-controller/v2.3.1/docs/install/iam_policy.json
이후, 다운로드받은 json 파일을 사용하여 policy를 생성해줍니다.
policy의 이름은 AWSLoadBalancerControllerIAMPolicy 이며, 생성에 성공했을 경우 콘솔에서도 이를 확인할 수 있습니다.
aws iam create-policy \
--policy-name AWSLoadBalancerControllerIAMPolicy \
--policy-document file://iam_policy.json
3) EKS ServiceAccount 생성 및 정책 연결
이제 앞서 생성한 정책을 EKS의 ServiceAccount에 연결시켜 주도록 합시다!
ServiceAccount란, Kubernetes 클러스터 내에서 실행되는 Pod이 API 서버와 상호작용할 수 있도록 권한을 부여하는 자격증명입니다.
이제 아래의 명령어를 사용하여 ServiceAccount를 생성하고, 정책을 연결시켜주도록 합니다.
eksctl create iamserviceaccount \
--cluster={Cluster Name} \
--namespace=kube-system \
--name=aws-load-balancer-controller \
--attach-policy-arn={Policy ARN} \
--override-existing-serviceaccounts \
--approve
4) ALB Ingress Controller 설치
이제 실제로 사용될 ALB Ingress Controller를 설치해보도록 하겠습니다.
ALB Ingress Controller 설치시, EKS Helm 레포지토리가 필요합니다.
만약, Helm이 없을 경우 아래의 방식대로 Helm을 설치해주세요.
(Helm이 이미 있을 경우 건너뛰어도 좋습니다!)
$ curl -fsSL -o get_helm.sh https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-3
$ chmod 700 get_helm.sh
$ ./get_helm.sh
이제 Helm을 통해 ALB Ingress Controller 설치를 위한 레포지토리를 추가해주세요.
helm repo add eks https://aws.github.io/eks-charts
이제 ALB Ingress Controller를 설치해줍니다.
아래의 image.repository는 aws에서 제공하는 레포지토리이며, 리전별로 차이가 있습니다.
$ helm install aws-load-balancer-controller eks/aws-load-balancer-controller \
-n kube-system \
--set clusterName={Cluster Name} \
--set serviceAccount.create=false \
--set serviceAccount.name=aws-load-balancer-controller \
--set image.repository=602401143452.dkr.ecr.ap-northeast-2.amazonaws.com/amazon/aws-load-balancer-controller \
--set region=ap-northeast-2 \
--set vpcId={VPC ID}
이제, ALB Ingress Controller가 정상적으로 설치되었는지 확인해주세요.
$ kubectl get deployment -n kube-system aws-load-balancer-controller
3) Ingress 생성 및 확인
이제 Ingress를 생성해보도록 하겠습니다.
별도의 yaml파일이 없다면, 아래의 yaml 파일을 사용하여 배포해주세요-!
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: public.ecr.aws/l6m2t8p7/docker-2048:latest
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
alb.ingress.kubernetes.io/target-type: ip
spec:
ingressClassName: alb
rules:
- http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: service-2048
port:
number: 80
ingress 목록을 조회하여 정상적으로 ingress가 생성되었는지, ALB의 주소는 제대로 올라오는지 확인해주세요!
(만약 주소가 정상적으로 확인되지 않는다면 다음글을 참고해주세요!)
4) Ingress 정상 배포 확인
콘솔을 통해서 ALB가 생성된 것을 확인할 수 있습니다.
포트 이외에는 별다른 설정을 기입하지 않았기 때문에, 추가 Port 및 Rule은 없는 것을 알 수 있습니다.
이제 마지막으로 ALB의 DNS로 접속해 게임이 정상적으로 배포되었는지 확인해보도록 합시다!
지금까지 EKS 다루기 1 ~3 편을 통해 EKS를 생성하고, 서비스를 ELB를 통해 외부로 노출시키는 방법을 알아보았습니다.
앞선 EKS 다루기 편에서는 이것저것 배포해보며 사용법을 익혀 보았습니다.
감사합니다!
'Kubernetes > Kubernetes_Service' 카테고리의 다른 글
[Kubernetes] 쿠버네티스 볼륨(Volume) - 종류와 특징 (0) | 2024.09.26 |
---|---|
[Kubernetes] 노드 자원 보호하기(Drain, Cordon, Uncordon) (0) | 2024.09.26 |
[Kubernetes] EKS 다루기(2) - Service(ClusterIP, NodePort, LoadBalancer) (1) | 2021.11.22 |
[Kubernetes] EKS 다루기(1) - Pod, Replicaset, Deployment (0) | 2021.11.19 |
[Kubernetes] EKS 생성하기 (0) | 2021.11.18 |