kOps
클라우드 환경에 kubernetes 클러스터를 배포할 수 있게 도와주는 클러스터 배포 자동화 오픈소스 툴
보통 각 CSP 별로 Managed Kubernetes 서비스가 존재한다. (AWS의 EKS, GCP의 GKE, Azure의 AKS 등등)
이러한 Managed 서비스와는 비용계산이나 배포 방식 등이 다르다.
- 예를 들어, EKS는 Control plane을 AWS managed 방식으로 사용하기에 그 비용이 많이 나온다.
- 또한 Control Plane은 AWS managed라 직접 접근할 수 없다.
- kOps는 이러한 master node를 사용자가 직접 관리하게 함, 따라서 Control Plane 노드에 대한 접근도 가능하다
- 인스턴스 유형도 조절이 가능해, 싸게 간단한 클러스터를 구축할 수 있다.
- kOps로 구축한 클러스터의 각 node들은 모두 ec2 autoscaling group으로 동작한다.
EKS같은 Managed 서비스는 Control plane을 안정적으로 사용할 수 있다. 하지만 kubernetes를 스터디하는 용도로써는 그 비용이 만만치않다는 것을 금방 알 수 있을 것이다.
따라서 스터디 용도로 적합한 Kubernetes 클러스터 생성도구라고 볼 수 있다.
kOps를 통해 AWS 클라우드 환경에 클러스터를 구축하고, 이 클러스터에 몇 가지 배포를 해보도록 한다.
kOps로 클러스터 구축
kOps EC2 구축
kOps 커맨드를 실행할 EC2 인스턴스를 구축한다. 이 인스턴스에서 kOps 커맨드를 통해 클러스터를 생성하고 관리하게 될 것이다.
이 인스턴스와 더불어 클러스터가 배포될 VPC와 같은 네트워크 리소스도 만들어주어야 한다. 여기서는 kOps 인스턴스와 네트워크 리소스를 설치하는 Cloudformation Template을 이용하여 기초 구성을 진행한다.
IAM Role 설정
kOps 인스턴스의 CLI를 통해 클러스터와 노드 등의 요소를 구성하므로, kOps 인스턴스에 클러스터 요소들을 관리할 수 있는 적절한 IAM Role을 연결해주어야한다.
kOps 공식 Docs에 따르면, kOps가 사용하는 Role은 최소한 아래와 같은 Permission들은 가지고 있어야한다고 한다.
AmazonEC2FullAccess
AmazonRoute53FullAccess
AmazonS3FullAccess
IAMFullAccess
AmazonVPCFullAccess
AmazonSQSFullAccess
AmazonEventBridgeFullAccess
이번 실습에서는 간단하게 AdministratorAccess를 준 Role을 kOps 인스턴스에 연결하도록 한다.
(언제나 최소권한을 주어야한다는 마인드는 잊지 않아야 할 것이다)
SSH 키 페어 & State Storage 생성
클러스터 내의 Master/Worker 노드에 연결할 SSH 키 페어를 만들어준다.
ssh-keygen -t rsa -f ~/.ssh/kops
이어서 kOps를 통해 생성한 클러스터의 State를 저장할 Storage를 만들어주어야한다. S3 버킷을 생성해서 사용하도록 한다.
aws s3 mb s3://[bucket명]
클러스터 생성
SSH 키 페어까지 만든 뒤, 본격적으로 클러스터를 생성한다.
export ZONES=ap-northeast-2a,ap-northeast-2c
export KOPS_CLUSTER_NAME=omoknooni.link # 배포할 route53 호스팅 영역을 클러스터 이름으로 지정
export KOPS_STATE_STORE=s3://omoknooni-kops-test # 클러스터의 state가 저장될 공간
# 클러스터 생성
kops create cluster --zones $ZONES --networking amazonvpc --cloud aws \
--control-plane-size t3.small --node-size t3.small --node-count 2 \
--network-cidr 10.0.1.0/24 --ssh-public-key=~/.ssh/kops.pub --name $KOPS_CLUSTER_NAME \
--state $KOPS_STATE_STORE --yes
클러스터 생성에 사용한 몇가지 option의 내용은 아래와 같다.
- zones : 클러스터의 Worker node의 배치될 가용영역(AZ)
- cloud : 배포할 클러스터의 CSP
- networking : 클러스터의 네트워킹 모드 (calico, flanner, cilium, amazonvpc 등)
- control-plane-size / node-size : master node(control plane) / workder node의 인스턴스 유형
- node-count : worker node의 총 갯수 (default는 각 zone별로 1개라고 한다.)
- network-cidr : 클러스터 네트워크의 CIDR
- ssh-public-key : 클러스터 node의 SSH public key
- state : 클러스터 state를 저장할 스토리지 (기본적으로 KOPS_STATE_STORE 환경변수를 먼저 참조)
- kubernetes-version : 설치할 kubernetes 버전
create cluster에 대한 전체 options 내용은 공식 Docs를 참조
클러스터 create 이후 완전 배포까지 약 10분 가량 대기해준다.
# 최대 10분 간 20초 단위로 10번 cluster가 validate한지를 검증
kops validate cluster --wait 10m --interval 20s --count 10
인스턴스 그룹 (Instance Groups)
kOps를 통해 클러스터를 생성하면 ASG도 같이 생성되게 된다. kOps에서는 이를 Instance Group(ig)라고 부르며, ig를 통해 각 node들을 관리한다.
( The kOps InstanceGroup is a declarative model of a group of nodes. )
예를 들어, 이 클러스터 내의 worker node들의 인스턴스 유형을 변경하는 경우, 아래와 같이 작업할 수 있다.
kops edit ig [ig명]
# 클러스터 변경 내역 update (--yes를 주는 경우 바로 반영)
# update문의 경우, 이후에 생성되는 node들에만 반영
kops update cluster --name [cluster명] (--yes)
# 클러스터 변경 내역을 현재 node들에도 반영
kops rolling-update cluster --name [cluster명] (--yes)
이렇게 worker node의 유형이 변경된 것을 볼 수 있다.
그리고 동일하게 edit을 통해 worker node의 최대/최소 값의 변경 등 다양한 작업이 가능하다.
클러스터 삭제
kops delete cluster --name $KOPS_CLUSTER_NAME --yes