Ssoon

[1주차] Amazon EKS 시작하기 - Nodes - 자체 관리형 노드 본문

AWS EKS Workshop Study

[1주차] Amazon EKS 시작하기 - Nodes - 자체 관리형 노드

구구달스 2023. 4. 25. 20:13
CloudNet@ 팀의 AWS EKS Workshop Study 1주차 정리입니다.
# Amazon EKS User Guide 참고

 Self-Managed Nodes

  • EKS의 "Node"는 쿠버네티스 Pod 를 스케줄링할 수 있는 Amazon EC2 인스턴스입니다. Pod 는 EKS 클러스터의 API 엔드포인트에 연결됩니다. Node 는 Node Group 으로 구성됩니다. Node Group 에 있는 모든 EC2 인스턴스는 동일해야 합니다:
    • Amazon instance type
    • Amazon Machine Image (IAM)
    • IAM role
  • 클러스터에 여러 개의 Node Group 을 가질 수 있으며, 각 Node Group 은 서로 다른 유형의 인스턴스 또는 서로 다른 역할을 가진 인스턴스를 나타냅니다.

🧿 장점:

  • Kubernetes 데이터 플레인 노드를 완벽하게 제어할 수 있으며 노드 그룹 내에서 실행할 EC2 인스턴스 유형을 선택할 수 있습니다. Auto Scaling 그룹을 생성하고 원하는 메트릭을 기반으로 확장할 수 있습니다.

🧿 단점:

  • 새 버전의 AWS EKS 최적화 AMI가 출시되면 노드 그룹 내부의 노드를 수동으로 업데이트하여 먼저 실행 중인 포드의 노드를 수동으로 draining 해야 합니다. 다른 옵션은 새로 업데이트된 AMI로 완전히 새로운 노드 그룹을 생성하여 기존 노드 그룹을 이전 버전의 AMI로 교체한 다음 워크로드를 새 노드 그룹으로 마이그레이션하는 것입니다.
  • EKS 클러스터를 최신 버전의 Kubernetes로 업그레이드가 필요한 경우 클러스터 Kubernetes 버전과 일치하도록 노드 그룹 내에서 실행되는 Kubernetes 버전을 수동으로 업그레이드하거나 완전히 새로운 노드 그룹을 생성해야 합니다. 이전 노드 그룹을 교체하고 워크로드를 새 노드 그룹으로 마이그레이션하기 위해 EKS 클러스터의 Kubernetes 버전과 일치하는 Kubernetes 버전이 있어야 합니다.

🧿 사용 사례: 

  • 노드 그룹 EC2 인스턴스 선택 및 자동 조정을 완전히 제어해야 하는 경우 이 옵션을 선택해야 합니다.

 

 자체 관리형 Amazon Linux 노드

 

1단계: AWS Management Console을 사용하여 자체 관리형 Linux 노드를 시작

 

🧿 AWS CloudFormation 템플릿의 최신 버전 다운로드

Invoke-WebRequest -Uri https://s3.us-west-2.amazonaws.com/amazon-eks/cloudformation/2020-10-29/aws-auth-cm.yaml -OutFile aws-auth-cm.yaml

🧿 AWS CloudFormation 콘솔을 실행합니다.

 

1단계. 스택 생성 

2단계. 스택 세부 정보 지정

🧿 생성된 정보를 확인합니다.

2단계: 노드를 클러스터에 조인

🧿 다음 명령을 사용하여 구성 맵을 다운로드합니다.

Invoke-WebRequest -Uri https://s3.us-west-2.amazonaws.com/amazon-eks/cloudformation/2020-10-29/aws-auth-cm.yaml -OutFile aws-auth-cm.yaml

 

🧿 aws-auth-cm.yaml 파일에서 rolearn을 이전 절차에서 기록한 값으로 설정합니다.

(Get-Content aws-auth-cm.yaml) -replace '<ARN of instance role \(not instance profile\)>', 'arn:aws:iam::251054188804:role/my-cluster-nodes-NodeInstanceRole-W71TMSFKGX3W' | Set-Content aws-auth-cm.yaml

🧿 구성을 적용하고 상태를 확인합니다.

Amazon EKS 관리형 노드 그룹이 아닌 노드는 AWS 콘솔에 표시되지 않습니다. 이는 사용자가 직접 EC2 인스턴스를 생성하고 Amazon EKS 클러스터에 연결한 경우에 해당합니다. 이러한 경우에는 노드의 상태를 모니터링하거나, 노드에 대한 스케일링 작업을 수행하려면 AWS CLI나 AWS SDK 등의 다른 도구를 사용해야 합니다. 즉, Amazon EKS 관리형 노드 그룹이 아닌 노드는 AWS 콘솔에서 직접 확인할 수 없고, EC2 인스턴스를 직접 관리해야 합니다.

 

 eksctl 설치

 Amazon의 EC2용 관리형(managed) Kubernetes 서비스인 EKS에서 클러스터를 생성하고 관리하기 위한 간단한 CLI 도구입니다. 

 

🧿 Chocolatey 설치합니다.

  • Chocolatey는 윈도우 운영체제에서 패키지 관리자로 사용할 수 있는 오픈소스 도구입니다. Chocolatey를 사용하면 윈도우용 소프트웨어를 쉽게 설치, 업데이트 및 제거할 수 있습니다. Chocolatey는 명령줄 인터페이스를 통해 패키지 관리를 할 수 있으며, PowerShell 스크립트를 사용하여 개발자들이 패키지를 만들고 배포할 수 있도록 지원합니다.
Set-ExecutionPolicy Bypass -Scope Process -Force; [System.Net.ServicePointManager]::SecurityProtocol = [System.Net.ServicePointManager]::SecurityProtocol -bor 3072; iex ((New-Object System.Net.WebClient).DownloadString('https://community.chocolatey.org/install.ps1'))

🧿 eksctl을 설치합니다.

choco install -y eksctl

 

😂 eksctl ? 

🧿 yaml 파일을 통해 eksctl 로 cluster를 생성합니다.

$here = Get-Location
Set-Content $here\my-cluster-eksctl.yaml @"
apiVersion: eksctl.io/v1alpha5
kind: ClusterConfig

metadata:
  name: my-cluster
  region: ap-northeast-2
  version: "1.24"

vpc:
  id : "vpc-0cf91c41816007d46"
  subnets:
    private:
      ap-northeast-2a: { id: subnet-0382599fb0bac23ec }
      ap-northeast-2b: { id: subnet-0f3422ac7fb03cc26 }
"@

 

metadata.name : 클러스터 이름

metadata.region : 이 클러스터를 호스팅하는 AWS 지역

metadata.version : 버전정보

 

vpc.id : 기존 VPC ID 정보

vpc.subnets.private : 서브넷 정보

 

 

🧿 CloudFormation 진행상황을 확인합니다.

🧿 생성된 클러스터 정보를 확인합니다.

🧿 생성된 리소스를 확인합니다.

 

 

🧿 클러스터의 IAM OIDC 제공업체 생성


OpenID Connect (OIDC)

  • 클라이언트-서버 애플리케이션과 서비스 간의 안전한 사용자 인증 및 권한 부여를 수행합니다.
  • JSON Web Tokens (JWT)를 사용하여 사용자 인증 및 권한 부여 정보를 전송합니다.
  • 인터넷 은행 서비스를 이용하려면 OIDC를 사용하여 인증합니다. 당신이 인증 요청을 보내면, 인증 서버에서 당신의 사용자 ID 및 비밀번호를 확인하고, 그 후에 사용자 정보에 대한 JWT를 생성합니다. 이 JWT는 서비스 제공업체에게 전송되고, 서비스 제공업체는 이를 확인하여 당신의 인증 및 권한을 확인합니다.

EKS OIDC(OpenID Connect) 공급자

  • EKS 클러스터에서 Kubernetes RBAC(Role-Based Access Control) 인증 및 인가 시스템에서 사용되는 OIDC 공급자입니다.
  • AWS에서 관리하는 IAM과 Kubernetes RBAC 사이의 매개체 역할을 합니다.
  • Kubernetes RBAC은 AWS IAM 역할을 직접 사용할 수 없기 때문에, Amazon EKS OIDC 공급자를 통해 IAM의 역할을 Kubernetes에 노출시켜 줄 수 있습니다.
  • EKS OIDC 공급자를 사용하여 IAM 역할을 Kubernetes에 노출시키면, 해당 역할을 Kubernetes에서 사용하여 권한 부여 규칙을 만들 수 있습니다. 이를 통해 Kubernetes에서 IAM 역할을 사용하여, AWS 리소스 및 서비스에 대한 권한을 관리할 수 있습니다.

eksctl utils associate-iam-oidc-provider

  • EKS OIDC 공급자와 IAM 역할을 연결하는 데 사용됩니다. 이 명령은 Amazon EKS 클러스터에 대한 OIDC 공급자를 만들고 이를 AWS Identity and Access Management(IAM) 서비스에서 사용할 수 있도록 등록합니다. 그런 다음 IAM 역할에 대한 신뢰 정책을 만들고 OIDC 공급자와 연결하여, Kubernetes Service Account와 IAM 역할 간에 인증 및 권한 부여를 수행하는 데 사용됩니다. 이를 통해 Amazon EKS 클러스터에서 실행되는 애플리케이션 및 서비스에서 AWS 리소스를 관리할 수 있게 됩니다.
eksctl utils associate-iam-oidc-provider --region=ap-northeast-2 --cluster=my-cluster --approve

 

🧿 IAM 역할 생성

eksctl create iamserviceaccount `
    --name aws-node `
    --namespace kube-system `
    --cluster my-cluster `
    --role-name "AmazonEKSVPCCNIRole" `
    --attach-policy-arn arn:aws:iam::aws:policy/AmazonEKS_CNI_Policy `
    --override-existing-serviceaccounts `
    --approve

 

 

 VPC CNI plugin for Kubernetes 생성

  • Amazon EKS 클러스터의 각 Amazon EC2 노드에 배포됩니다.
  • 탄력적 네트워크 인터페이스를 생성하여 Amazon EC2 노드에 연결합니다.
  • 프라이빗 IPv4 또는 IPv6 주소를 VPC에서 각 pod 및 서비스에 할당합니다.

🧿 클러스터에 설치된 추가 기능의 버전을 확인합니다.

kubectl describe daemonset aws-node --namespace kube-system | Select-String "amazon-k8s-cni:" | ForEach-Object { $_.ToString().Split(":")[2].Trim() }

✔ Add-on Builder (EKS-Build)

Kubernetes 클러스터에 애드온을 설치하는 데 사용할 수 있는 오픈 소스 CLI 도구입니다.

KS-Build를 사용하면 클러스터에 필요한 다양한 애드온을 빌드하고 배포할 수 있습니다.

 

🧿 AWS CLI를 사용하여 추가 기능을 생성합니다.

aws eks create-addon --cluster-name my-cluster --addon-name vpc-cni --addon-version v1.11.4-eksbuild.1 `
    --service-account-role-arn arn:aws:iam::251054188804:role/AmazonEKSVPCCNIRole

aws eks create-addon --cluster-name my-cluster --addon-name vpc-cni --addon-version v1.11.4-eksbuild.1 `
    --service-account-role-arn arn:aws:iam::251054188804:role/AmazonEKSVPCCNIRole

 

 

my-cluster : 클러스터 이름

251054188804 : 계정 ID

 

🧿 클러스터 Kubernetes 버전에 맞는 추가 기능의 최신 버전이 클러스터에 추가되었는지 확인합니다

aws eks describe-addon --cluster-name my-cluster --addon-name vpc-cni --query addon.addonVersion --output text

 

kube-proxy 자체 관리형 추가

  • 각 Amazon EC2 노드에서 네트워크 규칙을 관리합니다.
  • 포드와의 네트워크 통신이 가능합니다.
  • 이 추가 기능의 자체 관리형 또는 관리형 유형은 기본적으로 클러스터의 각 Amazon EC2 노드에 설치됩니다.

🧿 kube-proxy 추가 기능을 업데이트합니다. 

eksctl create addon --cluster my-cluster --name kube-proxy --version latest `
    --service-account-role-arn arn:aws:iam::251054188804:role/AmazonEKSVPCCNIRole --force

🧿 클러스터에 현재 설치된 컨테이너 이미지의 버전을 확인합니다.

kubectl describe daemonset kube-proxy -n kube-system | Select-String "Image" | Select-Object -Last 1

 

CoreDNS 추가 기능

aws eks create-addon --cluster-name my-cluster --addon-name coredns --addon-version v1.9.3-eksbuild.2

aws eks describe-addon --cluster-name my-cluster --addon-name coredns --query addon.addonVersion --output text

 

🧿 eksctl을 사용하여 자체 관리형 Linux 노드를 설치합니다.

eksctl create nodegroup `
  --cluster my-cluster `
  --name al-nodes `
  --node-type t3.medium `
  --nodes 2 `
  --nodes-min 1 `
  --nodes-max 2 `
  --ssh-access `
  --managed=false `
  --ssh-public-key my-key `
  --vpc-subnets=subnet-075d97f08e8a4e0af,subnet-053843712c12cc6e8 `
  --vpc-id=vpc-07884e2648af8ff12 `
  --vpc-security-group=sg-0f42fc2b759edfcf6

--cluster : 클러스터 이름

--name : 노드 그룹의 이름

--node-type : EC2 인스턴스 유형

--nodes : 생성할 노드의 총 수

--nodes-min : 최소 노드 수

--nodes-max : 최대 노드 수

--ssh-access : 노드에 SSH 접속을 허용

--managed=false : EKS에서 관리되지 않는 노드 그룹을 생성 = 사용자가 직접 노드를 관리

--ssh-public-key : EC2 키 페어

Comments