Kubernetes-Masterclass | Load Balancer & Private Node Group

Load Balancer(ALB, CLB, NBL) & Private Node Group
김주혁's avatar
Aug 20, 2024
Kubernetes-Masterclass | Load Balancer & Private Node Group
 

ALB

1. AWS 엘라스틱 로드 밸런싱 개요

  • 세 가지 유형의 로드 밸런서:
    • 클래식 로드 밸런서 (CLB): TCP, HTTP, HTTPS, SSL 프로토콜을 지원. 레거시 로드 밸런서로 사용 중단 예정.
    • 네트워크 로드 밸런서 (NLB): TCP, UDP, TLS 프로토콜을 지원.
    • 애플리케이션 로드 밸런서 (ALB): HTTP, HTTPS 프로토콜을 지원.
    • Kubernetes에서의 로드 밸런서 Kubernetes에서 서비스 객체를 생성하고 그 유형을 LoadBalancer로 설정하면 AWS에서 기본적으로 클래식 로드 밸런서(CLASSIC Load Balancer)가 생성됩니다.
 

2. 클래식 로드 밸런서 구현

Why do you replace the existing structure? 실제 운영 환경에서는 NodePort 서비스를 사용하지 않는다. 실제 운영 환경에서는 URL을 DNS에 등록하고 그 URL을 통해 액세스한다. 따라서 포트를 80과 443를 사용해야 한다. 31, 231, 12312 등 임의 포트 대신 브라우저 기본 포트를 사용한다.
 
  • Cluster Control Plane으로 Private Node Group 지원
    • Control Plain : Kubernetes와 같은 클러스터 기반 시스템에서 컨트롤 플레인은 클러스터의 중앙 관리 시스템입니다. 여기에는 API 서버, 스케줄러, 컨트롤러 매니저 등이 포함됩니다. 이들은 클러스터의 상태를 모니터링하고, 작업을 할당하며, 자원을 관리합니다.
    • Node Group : 노드 그룹은 여러 노드를 묶어 관리하는 논리적 단위입니다. 각 노드는 실제로 애플리케이션 워크로드(컨테이너)를 실행하는 서버입니다.
    • Private Node Group : 프라이빗 노드 그룹은 인터넷에 직접 노출되지 않고, 프라이빗 네트워크 내에서만 접근 가능한 노드들로 구성된 그룹입니다.
    • Cluster Control Plane으로 Private Node Group 지원한다는 소리는 클러스터의 컨트롤 플레인이 프라이빗 노드 그룹을 지원함으로써, 인터넷에 노출되지 않은 네트워크에서 클러스터를 운영할 수 있 수 있게 한다는 의미입니다. 프라이빗 노드 그룹은 인터넷을 통하지 않고, 프라이빗 네트워크 내에서만 컨트롤 플레인과 통신할 수 있습니다. 이로 인해 민감한 데이터가 외부에 노출되지 않으며, 보안 정책을 보다 엄격하게 적용할 수 있습니다. 클러스터 관리자는 컨트롤 플레인을 통해 이러한 프라이빗 노드 그룹을 제어하고 관리할 수 있습니다. 클러스터의 워크로드를 프라이빗 노드 그룹에 배포하거나, 프라이빗 노드 그룹의 상태를 모니터링하는 등의 작업이 가능합니다.
  • 프라이빗 서브넷에서의 통신:
    • 프라이빗 서브넷에 있는 노드 그룹은 NAT 게이트웨이를 통해 외부와 통신합니다.
    • EKS 클러스터 컨트롤 플레인도 퍼블릭 서브넷에 있으며, 이를 통해 내부 연결을 관리합니다.

3. 전체 아키텍처

  • RDS 데이터베이스:
    • RDS 데이터베이스는 프라이빗 서브넷에 생성되며, ExternalName 서비스 매니페스트를 통해 연결됩니다.
    • 사용자 관리 애플리케이션은 ExternalName 서비스를 통해 RDS DB와 통신합니다.
  • 클래식 로드 밸런서 (CLB):
    • 퍼블릭 서브넷에 사용자 관리 클래식 로드 밸런서 서비스를 생성합니다.
    • 사용자는 CLB DNS URL(CLB Endpoint)을 통해 애플리케이션에 접근하고, CLB는 요청을 다양한 포트로 분산시켜 RDS DB와 연결합니다.
 

CREATE EKS Private Node Group

 
  • eksctl create nodegroup 명령어를 사용하며, -node-private-networking 옵션을 추가
    • 이 옵션은 모든 EKS 노드를 프라이빗 서브넷에서 생성되도록 설정합니다.
  • kubectl get nodes -o wide 명령어를 사용하여 노드의 외부 IP 주소를 확인합니다. 프라이빗 서브넷에 생성된 경우 외부 IP는 '없음'으로 표시됩니다.
  • 프라이빗 서브넷의 경우 아웃바운드 트래픽은 NAT 게이트웨이를 통해 이루어집니다.
  • 프라이빗 서브넷에 위치한 노드 그룹의 kubelet은 NAT 게이트웨이를 통해 EKS 클러스터의 제어 플레인과 통신합니다.
 

CREATE EKS Classic Load Balancers

 

1. 클래식 로드 밸런서 구현 준비

  • MySQL 외부 이름 서비스 배포: RDS 데이터베이스와 통합된 MySQL ExternalName 서비스를 배포합니다.
  • Application Deployment: Application을 배포합니다.

2. 클래식 로드 밸런서 서비스 매니페스트 생성

  • 로드 밸런서 매니페스트 작성: ClassicLoadBalancer.yml 파일을 생성합니다.
    • apiVersion: v1 kind: Service metadata: name: clb-usermgmt-restapp labels: app: usermgmt-restapp spec: type: LoadBalancer # Default - CLB selector: app: usermgmt-restapp ports: - port: 80 targetPort: 8095
       
    • port : 여기서 -port는 클러스터 외부에서 Service로 접근할 때 port입니다. 여기서는 외부 요청이 로드 밸런서로 접근할 때 사용될 포트가 됩니다.
    • targetPort : 여기서 targetPort는 Service가 요청을 전달할 때 실제 파드 내에서 서비스할 포트입니다. 서비스가 실제로 연결할 파드 내의 포트를 지정하는 것으로서 자바로 치면 8080, 노드로 치면 3000번 포트의 개념으로서 포트를 지정할 때 사용됩니다. 즉, Application Listening Port를 의미합니다.
    •  
  • 변경 사항:
    • 노드 포트 제거: 기존 노드 포트 서비스를 로드 밸런서 유형으로 변경합니다.
    • 포트 설정: 기본 포트 80을 설정하여 브라우저에서 8095와 같은 포트를 입력할 필요가 없도록 합니다.
      • 왜 입력할 필요가 없을까? 기본적으로
        • ClusterIP:
          • 용도: 클러스터 내에서만 접근할 수 있는 서비스입니다.
          • 예시: 데이터베이스 서비스처럼 외부에서 접근할 필요 없는 내부 서비스에 사용됩니다.
        • NodePort:
          • 용도: 클러스터의 각 노드에서 특정 포트를 열어 외부에서 접근할 수 있게 해줍니다.
          • 예시: 클러스터 외부에서 접근할 수 있는 웹 애플리케이션에 사용됩니다. 클러스터의 각 노드에서 같은 포트 번호로 접근할 수 있게 됩니다.
        • LoadBalancer:
          • 용도: 클라우드 제공업체가 자동으로 로드 밸런서를 생성하여 외부에서 접근할 수 있도록 합니다.
          • 예시: 클라우드 환경에서 인터넷 사용자가 접근할 수 있는 웹 애플리케이션에 사용됩니다.
        Kubernetes 서비스 타입은 대표적으로 위와 같은데, 만약 Application을 Kubernetes에서 운영하고 있고 이 app에 외부 사용자가 접근해야 한다고 할 때 로드 밸런서 타입의 서비스를 정의하면, 자동으로 로드 밸런서를 생성하고 로드 밸런서는 각 노드에 일일히 포트를 지정해줄 필요 없이 기본 80포트를 통해 들어온 요청을 각 노드와 파드로 분산시켜줍니다. 로드 밸런서가 이 모든 작업을 대신 관리해주시 때문에 별도 포트 관리를 하지 않아도 됩니다. 적절히 외부 요청을 로드 밸런서가 라우팅해주는 것 입니다.
       

3. 로드 밸런서 확인

  • 로드밸런서 상태 확인 전 확인 포인트
    • 매우매우 중요한 사실인데, RDS 보안그룹에 3306포트로 Private Subnet에서 생성한 노드그룹을 연결해야 Application에서 RDS에 접근할 수 있습니다. 강의만 따라가면 놓칠 수 있는 포인트 입니다.
    • RDS 서브넷은 생성할 때의 VPC를 수정할 수 없습니다.
    • Secret 파일의 value는 BASE64로 인코딩된 값입니다.(실제 값이 아님, 실제 값은 따로 기록이나 확인필요합니다.)
  • 서비스 활성화: 로드 밸런서의 상태가 활성화되면 DNS URL을 복사하여 브라우저에 입력합니다.
    • kubectl get svc {dnsURL}/usermgmt/health-status
 

6. 클래식 로드 밸런서 삭제

# Delete all Objects created kubectl delete -f kube-manifests/ # Verify current Kubernetes Objects kubectl get all
 

CREAT Network Load Balancers

 

1. 네트워크 로드 밸런서(NLB)

  • TCP/UDP(OSI 4계층)에서 통신하며, HTTP 트래픽이 필요하지 않습니다.
  • 일반적으로 HTTP가 필요 없는 Application인 SMTP 서버 등에서 TCP 로드 밸런서(NLB)가 사용됩니다.

2. 네트워크 로드 밸런서 매니페스트

  • 주석(annotation) 추가: Kubernetes에게 NLB를 생성하도록 지시하기 위해 매니페스트 파일에 service.beta.kubernetes.io/aws-load-balancer-type: "nlb" 어노테이션을 추가합니다.
    • 기본 생성과 달리 로드 밸런서를 NLB로 생성하려면 위 주석(Annotation)을 추가하는 것으로 충분합니다.
 
Share article

vlogue