AWS EKS 란?
Amazon Elastic Kubernetes Service (Amazon EKS).
AWS 에서 만든 관리형 Kubernetes Service.
EKS 를 사용하면 Kuberenetes 설치부터 운영까지 EKS가 해주기 때문에
직접 Kubernetes Cluster 를 구성하고 관리하는 것보다 쉽게 Kubernetes 를 사용할 수 있음.
Amazon EKS는 오픈소스 kubernetes 의 최신버전을 실행하므로
kubernetes 의 모든 plugin과 tool을 사용할 수 있음.
[Kubernetes Master Node]
AWS EKS가 직접 관리.
EKS에서 Master Node를 Control Plane 이라 부름
[Kubernetes Worker Node]
AWS EKS Node Groups가 관리.
EKS에서 Worker Node를 Data Plane 이라 부름
이해에 필요한 참고 그림
(AWS 세미나에서 가져옴.)
EC2에 직접 K8s를 설치하는 것과 EKS 차이점.
[질문]
EC2에 쿠버네티스를 설치해서 사용하는 것이랑
EKS를 사용하는 것의 주요 차이점, 장단점 등은 어떤 것들이 있을까요?
[답변]
EC2에서 쿠버네티스를 설치해서 사용하실 경우
쿠버네티스의 마스터 노드에 위치한
각종 컴포넌트(api server, etcd etc.) 등에 대한 고가용성도 고객이 직접 보장/관리 하셔야 합니다.
하지만. eks를 사용하시는 경우 싱글태넌트로 고객별로 만들어진
kubernetes master node를 저희가 직접 고가용성 관리를 하므로 관리 운영 부담이 현저히 줄어듭니다.
항목 |
K8S |
EKS |
구동 환경 |
on-premises |
AWS |
master node |
직접 설치 및 관리 필요 |
AWS에서 관리 해줌 |
master node HA |
직접 구성 필요 |
자동으로 구성 |
인증 |
직접 구성 필요 |
AWS IAM 기반 인증 사용 |
Pod 네트워크 통신 방식 |
다양한 plugin 지원 |
EKS는 기본적으로 amazon-vpc-cni-k8s 을 지원 amazon-vpc-cni-k8s 플러그인은 VPC 상에서 유효한 실제 IP를 Pod에 할당합니다. |
Pod 제한 |
없음 |
c5.large에서는 29개의 Pod만 사용 가능
|
EKS를 관리할 수 있는 Tool
AWS Management Console
Website AWS 홈페이지에서
GUI 로 AWS 를 컨트롤
AWS CLI
AWS Command Line Interface (AWS CLI)
즉 cli 명령어로 AWS 를 컨트롤 하는 tool
download link : https://awscli.amazonaws.com/AWSCLIV2.msi
eksctl
cli 명령어로 가장 간단하고 쉽게 클러스터 생성 가능
windows 용 download link : https://github.com/weaveworks/eksctl/releases/download/0.21.0/eksctl_Windows_amd64.zip
[windows에서 설치 명령어]
chocolatey install -y eksctl
참고)
eksctl 을 사용하기 위해서는 AWS CLI가 설치 되어 있고
자격증명구성이 되어있어야함
AWS SDK
개발 api 를 사용해서 컨트롤 가능
Terraform
IAC ( Infrastructure As Code )
인프라를 코드로 관리 가능
Terraform : 인프라를 만들고 바꾸고 버전 관리하는 도구.
AWS, GCP, Azure 등에서도 지원
Firecracker
마이크로 VM
[질문]
람다가 있는데 Firecracker가 만들어진 이유는 무엇인가요?
굳이 불편한 가상화 환경에서 구현하는 이유는 무엇인가요?
[답변]
람다도 결국 어떠한 호스트 환경에서 (underhood)구동된다는 사실에서 보면
Firecracker와 lamabda를 직접 비교하기는 어려울것 같습니다.
Firecracker의 태생 목적을 보면 이 효용 가치를 이해 하실수 있을것 같습니다.
"Firecracker is an open source virtualization technology that is purpose-built
for creating and managing secure, multi-tenant container and function-based
services that provide serverless operational models. "
EKS Cluster 생성
1. Cloud9 생성
Cloud9이란?
브라우저만으로 코드를 작성, 실행 및 디버깅할 수 있는 클라우드 기반 통합 개발 환경(IDE)
cloud9 링크 : https://ap-northeast-2.console.aws.amazon.com/cloud9/home/product
[주의]
Cloud9 워크스페이스는 루트 계정 사용자가 아닌 관리자 권한을 가진 IAM 사용자가 생성할 수 있음.
루트 계정 사용자가 아닌 IAM 사용자로 로그인했는지 확인해야함.
Create environment 클릭
생성할 cloud9 Name 입력
스펙 설정.
예시에서는 default로 생성함.
생성되는 스펙 확인 후 Create environment 로 생성
조금 시간이 흐른 뒤 생성완료 됨.
아래 이미지와 같이 창을 닫고 터미널남 새로 open함
터미널 open 단축키 : Alt+T
Cloud9 사용준비 완료.
2. IAM Role생성 후 Cloud9에 할당
Workspace에서 eks를 사용하기 위해서는 권한 설정이 필요함.
AdministratorAccess 권한을 가진 IAM Role (cloud9-admin)을 생성 후 workspace에 할당함.
[주의]
AdministratorAccess 이 아닐경우 권한문제 때문에 테스트가 어려워 짐..
IAM 역할 생성
IAM에 접속 후 역할만들기
EC2 선택
AdministratorAccess 정책을 추가함.
역할 이름을 넣어줌.
Cloud9 인스턴스에 상위에서 생성한 IAM 적용.
EC2 대시보드로 가서
인스턴스를 클릭하면 생성했던 Cloud9 인스턴스 확인가능
인스턴스 선택 후 IAM 역할 수정
상위에서 생성한 IAM 넣어줌
Cloud9 IDE로 돌아와서 Preferences 클릭
임시 자격증명 기능 끄기
[기존 자격증명이 존재시 파일 제거하는 명령어]
rm -vf ${HOME}/.aws/credentials
3. EKS에 필요한 Tool 설치
eksctl 설치
[명령어]
curl --silent --location "https://github.com/weaveworks/eksctl/releases/download/latest_release/eksctl_$(uname -s)_amd64.tar.gz" | tar xz -C /tmp
[명령어]
sudo mv -v /tmp/eksctl /usr/local/bin
[eksctl 자동 완성 기능 ]
eksctl completion bash >> ~/.bash_completion
. /etc/profile.d/bash_completion.sh
. ~/.bash_completion
JQ 설치
[명령어]
sudo yum -y install jq
kubectl 설치
[명령어]
curl -LO "https://storage.googleapis.com/kubernetes-release/release/$(curl -s https://storage.googleapis.com/kubernetes-release/release/stable.txt)/bin/linux/amd64/kubectl"
[명령어]
chmod +x ./kubectl
[명령어]
sudo mv ./kubectl /usr/local/bin/kubectl
[설치 확인]
kubectl version --client
AWS IAM Authenticator 설치
aws-iam-authenticator은 AWS IAM 정보를 활용하여 쿠버네티스 클러스터 사용자 인
[명령어]
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install.sh)"
[명령어]
brew install aws-iam-authenticator
[설치확인]
aws-iam-authenticator help
4. 현재 Region 을 기준으로 aws-cli 구성
[명령어]
export ACCOUNT_ID=$(aws sts get-caller-identity --output text --query Account)
export AWS_REGION=$(curl -s 169.254.169.254/latest/dynamic/instance-identity/document | jq -r '.region')
[확인]
echo $ACCOUNT_ID
echo $AWS_REGION
[생성된 region 확인 명령어]
test -n "$AWS_REGION" && echo AWS_REGION is "$AWS_REGION" || echo AWS_REGION is not set
[ACCOUNT_ID 정보화 AWS_REGION정보를 bashrc에 기록 명령어]
echo "export ACCOUNT_ID=${ACCOUNT_ID}" | tee -a ~/.bash_profile
echo "export AWS_REGION=${AWS_REGION}" | tee -a ~/.bash_profile
aws configure set default.region ${AWS_REGION}
aws configure get default.region
[GetCallerIdentity CLI 명령어]
aws sts get-caller-identity --query Arn | grep cloud9-admin -q && echo "IAM role valid" || echo "IAM role NOT valid"
Cloud9 IDE가 올바른 IAM 역할을 사용하는지 확인.
grep 부분에서 명칭을 확인후 명령어 실행을 해야 함.
5. SSH Key 생성하고 EC2 region에 업로드
SSH Key 생성
[명령어]
ssh-keygen
enter키를 세번 눌러서 기본 옵션으로 생성함.
- id_rsa = private key, 절대 타인에게 노출되면 안됨
- id_rsa.pub = public key, 접속하려는 리모트 머신의 authorized_keys에 입력.
- authorized_keys = 리모트 머신의 .ssh 디렉토리 아래에 위치하면서 id_rsa.pub 키의 값을 저장.
[명령어]
aws ec2 import-key-pair --key-name "iksoon-cloud9" --public-key-material file://~/.ssh/id_rsa.pub
생성한 후 EC2 의 네트워크 및 보안 > 키페어로 가보면 생성한 키 페어 확인가능
6. EKS Cluster 생성 보안을 위한 ssh-key 등록
KMS(Key Management Service)를 이용한 CMK(Customer managed key) 생성
[명령어]
aws kms create-alias --alias-name alias/iksoon-eksworkshop --target-key-id $(aws kms create-key --query KeyMetadata.Arn --output text)
[명령어]
export MASTER_ARN=$(aws kms describe-key --key-id alias/iksoon-eksworkshop --query KeyMetadata.Arn --output text)
[확인]
echo "export MASTER_ARN=${MASTER_ARN}" | tee -a ~/.bash_profile
7. EKS Cluster 생성
[예제 eks_cluster.yaml 파일]
apiVersion: eksctl.io/v1alpha5 kind: ClusterConfig metadata: name: iksoon-eks-cluster # 생성할 EKS 클러스터명 region: ap-northeast-2 # 클러스터를 생성할 리젼 version: "1.18" # kubernetes version managedNodeGroups: - name: iksoon-eks-cluster-ng # 클러스터의 노드 그룹명 desiredCapacity: 3 # 클러스터 워커 노드의 갯수 volumeSize: 10 # 클러스터 워커 노드의 EBS 용량 (단위: GiB) iam: withAddonPolicies: ImageBuilder: true # AWS ECR에 대한 권한 추가 albIngress: true # alb ingress에 대한 권한 추가 ssh: allow: true # 워커 노드에 SSH 접속 허용 publicKeyName: iksoon-cloud9 # 워커 노드에 SSH 접속을 위해 사용할 pem키 명(aws key pairs에 >등록되어 있어야함) secretsEncryption: keyARN: ${MASTER_ARN} |
만약 ssh: publicKeyName 설정이 없다면
EKS는 기본적으로 worker node에 ssh 설정을 안하기 때문에
worker node로 접근이 불가능해짐.
[명령어]
eksctl create cluster -f eks_cluster.yaml
[EKS 생성 완료 상태 로그]
8. EKS Cluster Worker Node에 접속
상위의 eks_cluster.yaml 에서
ssh: publicKeyName 설정을 해서 ssh 로
Worker Node에 접속 가능
[명령어]
ssh -i "~~~"
참고
EKS Cluster 생성 참고
https://awskrug.github.io/eks-workshop/prerequisites/
EKS ClusterConfig 참고
https://eksctl.io/usage/creating-and-managing-clusters/
서비스 중단 없이 EKS로 이동
http://engineering.vcnc.co.kr/2019/02/eks-migration/
Amazon EKS 워크샵
https://awskrug.github.io/eks-workshop/
youtube 강의
https://www.youtube.com/watch?v=O3znWPUdt18&t=1069s
eks 참고 pdf
https://docs.aws.amazon.com/ko_kr/eks/latest/userguide/eks-ug.pdf
WorkerNode접속 참고
https://twofootdog.tistory.com/79
https://kycfeel.github.io/posts/2/
'클라우드 > AWS' 카테고리의 다른 글
EKS Network Policy 분석 (0) | 2021.05.06 |
---|---|
EKS AWS CNI - Pod 간 통신 (0) | 2021.05.06 |
EKS AWS CNI 분석 (2) | 2021.05.03 |
AWS API 사용 (Python) (0) | 2020.08.12 |
AWS 1년 무료 서버 생성법 (0) | 2020.08.12 |