EKS Workshop 해보기 - Fundamentals

2023. 10. 29. 08:52Dev/EKS

728x90
반응형

https://www.eksworkshop.com/ 을 직접 해보고 알고 있는 지식들을 더해 블로그로 작성합니다.

Introduction에서는 eksctl과 terraform 두 방법을 사용해서 eks를 프로비저닝합니다.

그리고 eks에 샘플 애플리케이션을 배포하고 msa가 kubernetes에서 잘 작동하는것을 보여줍니다.

 

Fundamentals에서는 EKS에서 가장 기본적이고 중요한 기능들을 실습합니다.

  • Expose the sample application so we can access it over the public Internet
  • Configure the worker nodes within the managed node group that power the EKS cluster
  • Enable and re-deploy an application using Fargate
  • Configure EBS, EFS and FSxN for stateful applications

 

Exposing applications

샘플 애플리케이션을 퍼블릭 인터넷을 통해 접근할 수 있도록 외부 노출합니다.

그리고 이를 위해 가장 먼저 AWS Load Balancer Controller를 설명합니다.

AWS 로드밸런서 컨트롤러는 Kubernetes 클러스터에서 Elastic Load Balancer를 관리할 수 있게 해줍니다.

위 문장을 이해하기 위해서는 ControllerElastic Load Balancing를 알아야 합니다.

쿠버네티스에서 컨트롤러는 클러스터의 상태를 감시하고 원하는 상태로 만드려고 시도합니다.

ELB는 AWS의 서비스로 네트워크 트래픽을 분산하여 애플리케이션 확장성에 도움을 줍니다.

Elastic Load Balancing 서비스는 애플리케이션 요구 사항에 따라 Application Load Balancer, Gateway Load Balancer, Network Load Balancer를 선택해서 사용합니다.

 

AWS Load Balancer Controller can provision the following resources:

  • An AWS Application Load Balancer when you create a Kubernetes Ingress.
  • An AWS Network Load Balancer when you create a Kubernetes Service of type LoadBalancer.

애플리케이션 로드 밸런서는 OSI 모델의 L7에서 작동하며, 인그레스 규칙을 사용하여 쿠버네티스 서비스를 노출할 수 있고 외부 트래픽을 지원한다. 네트워크 로드 밸런서는 OSI 모델의 L4에서 작동하며, Kubernetes 서비스를 활용하여 파드를 애플리케이션 네트워크 서비스로 노출할 수 있도록 해줍니다.

 

Load Balancer

쿠버네티스는 서비스를 사용하여 클러스터 외부에 파드를 노출합니다. AWS에서 서비스를 사용하는 가장 인기 있는 방법 중 하나는 LoadBalancer 유형입니다. 서비스 이름, 포트, 레이블 선택기를 선언하는 간단한 YAML 파일을 사용하면 클라우드 컨트롤러가 자동으로 로드 밸런서를 프로비저닝합니다.

 

apiVersion: v1
kind: Service
metadata:
  name: search-svc # the name of our service
spec:
  type: LoadBalancer
  selector:
    app: SearchApp # pods are deployed with the label app=SearchApp
  ports:
    - port: 80

위 파일은 eks에서 classic load balancer를 생성합니다.

apiVersion: v1
kind: Service
metadata:
  name: ui-nlb
  annotations:
    service.beta.kubernetes.io/aws-load-balancer-type: external 
    service.beta.kubernetes.io/aws-load-balancer-scheme: internet-facing
    service.beta.kubernetes.io/aws-load-balancer-nlb-target-type: instance
  namespace: ui
spec:
  type: LoadBalancer
  ports:
    - port: 80
      targetPort: 8080
      name: http
  selector:
    app.kubernetes.io/name: ui
    app.kubernetes.io/instance: ui
    app.kubernetes.io/component: service

AWS Load Balancer Controller가 설치되어 있다면 위 코드는 NLB를 생성합니다.

 

Ingress

Kubernetes 인그레스는 클러스터에서 실행 중인 Kubernetes 서비스에 대한 외부 또는 내부 HTTP(S) 액세스를 관리할 수 있는 API 리소스입니다. Amazon Elastic Load Balancing 애플리케이션 로드 밸런서(ALB)는 애플리케이션 레이어(레이어 7)에서 들어오는 트래픽을 한 리전의 Amazon EC2 인스턴스 등 여러 대상에 걸쳐 로드 밸런싱하는 인기 있는 AWS 서비스입니다. ALB는 호스트 또는 경로 기반 라우팅, TLS(전송 계층 보안) 종료, 웹 소켓, HTTP/2, AWS WAF(웹 애플리케이션 방화벽) 통합, 통합 액세스 로그, 상태 확인 등 다양한 기능을 지원합니다.

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: ui
  namespace: ui
  annotations:
    alb.ingress.kubernetes.io/scheme: internet-facing
    alb.ingress.kubernetes.io/target-type: ip
    alb.ingress.kubernetes.io/healthcheck-path: /actuator/health/liveness
spec:
  ingressClassName: alb
  rules:
  - http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: ui
            port:
              number: 80

 

 

Storage

Storage on EKS는 두 개의 AWS 스토리지 서비스를 EKS 클러스터와 통합하는 방법에 대한 개략적인 개요를 제공합니다.

구현을 시작하기 전에, 아래는 우리가 활용하고 EKS와 통합할 두 가지 AWS 스토리지 서비스에 대한 요약입니다:

Amazon Elastic Block Store(EC2만 지원): 모든 규모의 처리량과 트랜잭션 집약적 워크로드 모두를 위해 설계된 전용 스토리지 볼륨에 EC2 인스턴스 및 컨테이너에서 직접 액세스할 수 있는 블록 스토리지 서비스입니다.

EBS를 사용하기 위해서는 아래 3가지 개념을 알아야합니다.

  • Kubernetes StatefulSets
  • EBS CSI Driver
  • StatefulSet with EBS Volume

실제로 사용하다보면 노드가 종료되고 새로 뜨고 하는 과정에서 AZ가 달라지면서 EBS에 문제가 생기는 경우가 있습니다.

Amazon Elastic File System(Fargate 및 EC2 지원): 빅데이터 분석, 웹 서비스 및 콘텐츠 관리, 애플리케이션 개발 및 테스트, 미디어 및 엔터테인먼트 워크플로우, 데이터베이스 백업, 컨테이너 스토리지에 적합한 완전히 관리되고 확장 가능한 탄력적인 파일 시스템입니다. EFS는 여러 가용 영역(AZ)에 걸쳐 데이터를 이중화하여 저장하며, 실행 중인 AZ에 관계없이 Kubernetes 포드에서 짧은 지연 시간 액세스를 제공합니다.

 


NetApp ONTAP용 Amazon FSx(EC2만 지원): NetApp의 인기 있는 ONTAP 파일 시스템을 기반으로 구축된 완전 관리형 공유 스토리지. FSx for NetApp ONTAP은 여러 가용 영역(AZ)에 걸쳐 데이터를 중복 저장하고 실행 중인 AZ에 관계없이 Kubernetes 포드에서 짧은 지연 시간 액세스를 제공합니다.

FSx for Lustre는 이 워크샵에는 없지만 다음 버전에서는 추가될 내용이라고 합니다.
FSx for Lustre(EC2만 지원): 머신 러닝, 고성능 컴퓨팅, 비디오 처리, 재무 모델링, 전자 설계 자동화, 분석과 같은 워크로드에 최적화된 완전 관리형 고성능 파일 시스템입니다. Lustre용 FSx를 사용하면 S3 데이터 리포지토리에 연결된 고성능 파일 시스템을 빠르게 생성하고 파일로 S3 개체에 투명하게 액세스할 수 있습니다.

 

 

Managed Node Groups

시작하기 실습에서 샘플 애플리케이션을 EKS에 배포하고 실행 중인 파드를 확인했습니다. 하지만 이 파드들은 어디에서 실행되고 있을까요?

EKS 클러스터에는 파드가 스케줄링되는 하나 이상의 EC2 노드가 포함되어 있습니다. EKS 노드는 AWS 계정에서 실행되며 클러스터 API 서버 엔드포인트를 통해 클러스터의 컨트롤 플레인에 연결됩니다. 하나 이상의 노드를 노드 그룹에 배포한다. 노드 그룹은 EC2 자동 확장 그룹에 배포된 하나 이상의 EC2 인스턴스입니다.

EKS 노드는 표준 Amazon EC2 인스턴스입니다. EC2 가격을 기준으로 요금이 청구됩니다. 자세한 내용은 Amazon EC2 가격 책정을 참조하세요.

Amazon EKS 관리형 노드 그룹은 Amazon EKS 클러스터를 위한 노드의 프로비저닝 및 수명 주기 관리를 자동화합니다. 이를 통해 새로운 AMI 또는 Kubernetes 버전 배포를 위한 롤링 업데이트와 같은 운영 활동이 크게 간소화됩니다.

이 단계에서는 Node 추가, Affinity, Taint, Spot Instance 등에 대해 배웁니다.

EKS를 사용하게되면 인스턴스 타입이나 가용 영역등의 문제로 특정 노드에 파드를 할당할 필요가 생깁니다.

Node Labels, Node Selector, Affinity등을 사용해서 기능을 구현할 수 있습니다.

 

https://kubernetes.io/docs/concepts/scheduling-eviction/assign-pod-node

 

 

Fargate

이전 모듈에서는 EKS 클러스터에서 파드를 실행하기 위해 EC2 컴퓨팅 인스턴스를 프로비저닝하는 방법과 관리형 노드 그룹이 운영 부담을 줄이는 데 어떻게 도움이 되는지 살펴보았습니다. 그러나 이 모델에서는 여전히 기본 인프라의 가용성, 용량 및 유지 관리에 대한 책임은 사용자가 져야 합니다.

AWS Fargate는 컨테이너에 적합한 크기의 온디맨드 컴퓨팅 용량을 제공하는 기술입니다. AWS Fargate를 사용하면 컨테이너를 실행하기 위해 가상 머신 그룹을 직접 프로비저닝, 구성 또는 확장할 필요가 없습니다. 또한 서버 유형을 선택하거나, 노드 그룹을 확장할 시기를 결정하거나, 클러스터 패킹을 최적화할 필요도 없습니다. 파게이트에서 어떤 파드를 시작할지, 파게이트 프로파일로 어떻게 실행할지 제어할 수 있습니다. 파게이트 프로파일은 Amazon EKS 클러스터의 일부로 정의됩니다.



Amazon EKS는 Kubernetes가 제공하는 확장 가능한 업스트림 모델을 사용하여 AWS에서 구축한 컨트롤러를 사용하여 Kubernetes와 AWS Fargate를 통합합니다. 이러한 컨트롤러는 Amazon EKS 관리형 Kubernetes 컨트롤 플레인의 일부로 실행되며 네이티브 Kubernetes 파드를 Fargate로 스케줄링하는 역할을 담당합니다. 파게이트 컨트롤러에는 기본 쿠버네티스 스케줄러와 함께 실행되는 새로운 스케줄러와 함께 여러 가지 변경 및 유효성 검사 어드미션 컨트롤러가 포함되어 있다. 파게이트에서 실행하기 위한 기준을 충족하는 파드를 시작하면 클러스터에서 실행 중인 파게이트 컨트롤러가 파드를 인식하고, 업데이트하고, 파게이트에 스케줄링한다.

파게이트의 이점은 다음과 같다:

AWS Fargate를 사용하면 애플리케이션에 집중할 수 있습니다. 애플리케이션 콘텐츠, 네트워킹, 스토리지 및 확장 요구 사항을 정의할 수 있습니다. 프로비저닝, 패치, 클러스터 용량 관리 또는 인프라 관리가 필요하지 않습니다.
AWS Fargate는 마이크로서비스 아키텍처 애플리케이션, 배치 처리, 머신 러닝 애플리케이션, 온프레미스 애플리케이션을 클라우드로 마이그레이션하는 등 일반적인 컨테이너 사용 사례를 모두 지원합니다.
격리 모델과 보안을 위해 AWS Fargate를 선택하세요. 또한 EC2 인스턴스를 프로비저닝하거나 관리할 필요 없이 컨테이너를 시작하려면 Fargate를 선택해야 합니다. EC2 인스턴스를 보다 강력하게 제어하거나 더 광범위한 사용자 정의 옵션이 필요한 경우, Fargate 없이 ECS 또는 EKS를 사용하세요.

 

 

 

https://aws.amazon.com/ko/blogs/containers/exposing-kubernetes-applications-part-1-service-and-ingress-resources/

https://aws.amazon.com/ko/blogs/containers/exposing-kubernetes-applications-part-2-aws-load-balancer-controller/