2 minute read

Background

클라우드상에서 airflow를 이용하기 위해서는 다음과 같은 몇가지 방법들이 있고, 각각 장단점이 있습니다.

1) 단일 ec2

  • 설치 및 실행 쉬움
  • SPOF 문제 존재
  • scalability 제한

2) MWAA

  • 관리 포인트에 대한 시간 절약
  • 높은 비용 + 관리 포인트 이외의 customizing은 힘듬

3) eks airflow(w. Helm charts)

  • 가격 최적화 및 성능 customizing 가능 (ec2 ami, airflow version etc…)
  • 초기 학습 및 구축 비용

실제 production 환경에서는 가격 대비 효율성 및 customizing 해야하는 부분이 많기 때문에 eks를 이용해서 k8s cluster를 생성하고 airflow를 설치해보는것을 연습해 보겠습니다.

Contents

eks cluster provisioning

0) Terminology


eks 란 kubernetes 컨트롤 플레인 또는 노드를 설치, 운영 및 유지 관리할 필요 없이 aws에서 kubernetes를 사용할수 있는 관리형 서비스 입니다. kubernetes란 컨테이너화된 어플리케이션의 배포, 확장, 관리를 자동화하기 위한 오픈 소스 시스템입니다.

1) ec2 provisioning


provisioning via aws cli

K8s-mng-system_security_group=$(aws ec2 create-security-group --group-name k8s-mng-system --description "k8s management" --output text)

aws ec2 authorize-security-group-ingress \
    --group-id ${K8s-mng-system_security_group} \
    --protocol tcp \
    --port 22 \
    --cidr {current_cidr}

aws ec2 run-instances \
    --image-id ami-xxxxxxxx  \
    --instance-type t2.large \
    --count 1 \
    --security-group-ids ${K8s-mng-system_security_group} \
    --key-name your-pem \
    --tag-specifications 'ResourceType=instance,Tags=[{Key=Name,Value=K8s-mng-system}]'

2) cli installation


aws cli install

sudo apt-get install -y unzip
curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip"
unzip awscliv2.zip
sudo ./aws/install # You can now run: /usr/local/bin/aws --version
aws --version # aws-aws-cli/2.11.23 Python/3.11.3 Linux/5.15.0-1036-aws exe/x86_64.ubuntu.20 prompt/offcli/2.7.11 Python/3.9.11 Linux/5.13.0-1029-aws exe/x86_64.ubuntu.20 prompt/off

eksctl install

curl --silent --location "https://github.com/weaveworks/eksctl/releases/latest/download/eksctl_$(uname -s)_amd64.tar.gz" | tar xz -C /tmp
sudo mv /tmp/eksctl /usr/local/bin
eksctl version # 0.143.0

kubectl install

# Download the kubectl binary for your cluster's Kubernetes version from Amazon S3 using the command for your device's hardware platform
curl -O https://s3.us-west-2.amazonaws.com/amazon-eks/1.25.7/2023-03-17/bin/linux/amd64/kubectl

# Apply execute permissions to the binary.
chmod +x ./kubectl

# Copy the binary to a folder in your PATH. If you have already installed a version of kubectl, then we recommend creating a $HOME/bin/kubectl and ensuring that $HOME/bin comes first in your $PATH.
mkdir -p $HOME/bin && cp ./kubectl $HOME/bin/kubectl && export PATH=$HOME/bin:$PATH

# (Optional) Add the $HOME/bin path to your shell initialization file so that it is configured when you open a shell
echo 'export PATH=$HOME/bin:$PATH' >> ~/.bashrc

# After you install kubectl, you can verify its version
kubectl version --short --client # Client Version: v1.25.7

cli completion option

source <(kubectl completion bash)
echo "source <(kubectl completion bash)" >> ~/.bashrc

3) iam configure


user creation

  • Name : eks-mng-user
  • access type : programming type
  • 기존 정책 연결 : Administratoraccess 권한 부여
  • access-key, secret-key store

aws configure

$ aws configure 
# input iam info
# region : ap-northeast-2

# check configuration info
$ aws sts get-caller-identity

4) eks provisioning & setting


installing eks via eksctl

prod_cluster_name="k8s-cluster"

eksctl create cluster \
    --name ${prod_cluster_name} \
    --region ap-northeast-2 \
    --with-oidc \
    --ssh-access \
    --ssh-public-key ${your-key-pair} \
    --managed \
    --spot \
    --instance-types t2.medium,t3.medium,t3.xlarge \
    --nodes 2 \
    --nodes-min 2 \
    --nodes-max 5 \
    --node-volume-size=10

eksctl은 이 cli를 통해 cluster가 사용할 vpc, 보안그룹, cluster iam등을 생성합니다.

그 이후 launch-template을 통해서 노드 그룹을 생성합니다.

reference

https://github.com/237summit/Kubernetes-on-AWS/blob/main/LAB_k8s_install