Container/Kubernetes

kOps로 쿠버네티스 설치하기 (on AWS EC2)

wrynn 2021. 10. 1. 01:57

 

 kOps를 활용하여 쿠버네티스 클러스터를 구성해보겠습니다. Bastion 서버로 AWS EC2 (Amazon LInux 2, t2.micro)를 생성하여 사용하였습니다. EC2에는 기본 이미지에 awscli 및 python이 포함되어 있어 본문의 내용 외에 다른 도구는 설치하지 않고 EC2 인스턴스 생성 직후인 상태 그대로 진행하였습니다. 

  ※ AWS의 유료 서비스를 사용하므로 비용이 발생할 수 있습니다.


kOps 및 kubectl 설치

# kops
wget -O kops https://github.com/kubernetes/kops/releases/download/\
$(curl -s https://api.github.com/repos/kubernetes/kops/releases/latest\
| grep tag_name | cut -d '"' -f 4)/kops-linux-amd64
chmod +x ./kops
sudo mv ./kops /usr/local/bin/

# kubectl
wget -O kubectl 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

 

AWS Credentials 설정

 aws 명령어를 사용하기 위해 credentials 정보를 설정합니다. Access Key ID 및 Secret Access Key는 AWS 웹 콘솔 상단 본인 계정 - My Security Credentials - Access keys for CLI, SDK, & API access 에서 생성할 수 있습니다. 

aws configure # <Access Key ID>, <Secret Access Key>, ap-northeast-2, json
AWS Access Key ID [None]: <Access Key ID>
AWS Secret Access Key [None]: <Secret Access Key>
Default region name [ap-northeast-1]: ap-northeast-2
Default output format [json]: json

 

kOps가 사용할 AWS IAM 계정 생성 및 권한 부여

aws iam create-group --group-name kops

aws iam attach-group-policy --policy-arn arn:aws:iam::aws:policy/AmazonEC2FullAccess \
--group-name kops
aws iam attach-group-policy --policy-arn arn:aws:iam::aws:policy/IAMFullAccess \
--group-name kops
aws iam attach-group-policy --policy-arn arn:aws:iam::aws:policy/AmazonS3FullAccess \
--group-name kops
aws iam attach-group-policy --policy-arn arn:aws:iam::aws:policy/AmazonSQSReadOnlyAccess \
--group-name kops
aws iam attach-group-policy --policy-arn arn:aws:iam::aws:policy/AmazonVPCFullAccess \
--group-name kops
aws iam attach-group-policy --policy-arn arn:aws:iam::aws:policy/AmazonRoute53FullAccess \
--group-name kops
aws iam attach-group-policy --policy-arn arn:aws:iam::aws:policy/AmazonEventBridgeReadOnlyAccess \
--group-name kops

aws iam create-user --user-name kops
aws iam add-user-to-group --user-name kops --group-name kops
aws iam create-access-key --user-name kops

 그 다음 생성한 kops 계정으로 AWS 인증 정보를 변경합니다. kops 계정의 credentials 정보는 아래 경로에서 확인할 수 있습니다. (IAM - Users - kops 계정 클릭 - Security credentials 탭 - Create Access Key)

aws configure # kops 계정의 <Access Key ID>, <Secret Access Key>, ap-northeast-2, json
AWS Access Key ID [****************BR5L]: kops 계정의 <Access Key ID>
AWS Secret Access Key [****************1E9o]: kops 계정의 <Secret Access Key>
Default region name [ap-northeast-1]: 
Default output format [json]:

 

S3 버킷 생성

 kOps는 클러스터에 관한 config, manifest 등을 저장하기 위해 S3를 사용합니다. 버킷 이름으로 kops-bucket-sample 을 사용하였으며 Versioning 기능을 켜둡니다.

aws s3api create-bucket \
    --bucket kops-bucket-sample \
    --region ap-northeast-2 
    
aws s3api put-bucket-versioning \
    --bucket kops-bucket-sample \
    --versioning-configuration Status=Enabled

 

SSH 키 생성

 키 파일을 생성합니다. 사용자 입력을 요구하는 경우 Enter 키로 모두 넘어갑니다.

$ ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key (/home/ec2-user/.ssh/id_rsa): 
Enter passphrase (empty for no passphrase): 
Enter same passphrase again: 
Your identification has been saved in /home/ec2-user/.ssh/id_rsa.
Your public key has been saved in /home/ec2-user/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:f2w13CyYo4MUCB3ABE61ChUSkI3WkrgXTHbcjEilcLg ec2-user@bastion-host
The key's randomart image is:
+---[RSA 2048]----+
|BX%XB*..         |
|=%=++o+..        |
|oo+.. . .        |
|E...     . o + o |
| ..  .  S   + = o|
|       . o o o o |
|        . + +    |
|           +     |
|                 |
+----[SHA256]-----+

 

클러스터 설정 구성

 클러스터명을 나타내는 NAME 변수는 별도의 DNS를 사용하지 않고 kops-cluster.k8s.local 로 명시하였습니다. KOPS_STATE_STORE 값에는 위에서 생성한 S3 버킷의 이름(kops-bucket-sample)을 입력합니다.

echo "export NAME=kops-cluster.k8s.local" >> ~/.bashrc
echo "export KOPS_STATE_STORE=s3://kops-bucket-sample" >> ~/.bashrc
source ~/.bashrc
kops create cluster --zones ap-northeast-2a $NAME

 

노드 설정

 생성될 마스터 및 워커 노드의 인스턴스 타입, 노드 수 등을 지정합니다. 기본 설정을 사용하시려면 이 단계는 건너뛰어도 좋습니다. 기본 설정은  마스터와 워커 노드 모두 t3.medium 타입으로 1개씩 생성됩니다.

kops edit ig master-ap-northeast-2a --name $NAME 
kops edit ig nodes-ap-northeast-2a --name $NAME

 

클러스터 생성

 위에서 지정한 클러스터 정의를 바탕으로 실제로 EC2를 생성하고 클러스터를 구성합니다.

kops update cluster $NAME --yes

 

클러스터 상태 확인

 클러스터가 생성된 것을 확인합니다. 클러스터가 생성되기까지 약 10분 이내의 시간이 소요됩니다.

kops validate cluster

이 때, 다음과 같이 오류가 나타나면 kops export 명령으로 해결한 후 다시 시도해 봅니다.

# Validation failed: unexpected error during validation: error listing nodes: Unauthorized
kops export kubecfg --admin

정상적으로 생성되었다면 kubectl 명령어로 클러스터 정보를 조회할 수 있습니다.

kubectl get no

 

클러스터 삭제

클러스터가 더 이상 필요없는 경우 두가지 방법 중 하나를 선택할 수 있습니다. 먼저 클러스터를 삭제하는 방법입니다.

kops delete cluster --name $NAME --yes		# 클러스터 삭제

 

또는 마스터와 워커 노드 수를 0으로 조정하여 비용을 절약할 수 있습니다.

kops edit ig nodes-ap-northeast-2a		# 노드의 minSize를 0으로 수정
kops edit ig master-ap-northeast-2a		# 마스터의 minSize를 0으로 수정
kops update cluster --name=$NAME --yes

참고자료

[1] Installing Kubernetes with kops

 

Installing Kubernetes with kops

This quickstart shows you how to easily install a Kubernetes cluster on AWS. It uses a tool called kops. kops is an automated provisioning system: Fully automated installation Uses DNS to identify clusters Self-healing: everything runs in Auto-Scaling Grou

kubernetes.io

[2] kOps Github Repositoy

 

GitHub - kubernetes/kops: Kubernetes Operations (kops) - Production Grade K8s Installation, Upgrades, and Management

Kubernetes Operations (kops) - Production Grade K8s Installation, Upgrades, and Management - GitHub - kubernetes/kops: Kubernetes Operations (kops) - Production Grade K8s Installation, Upgrades, an...

github.com