PKOS Study #1 – kOps

지난 Terraform Study에 이어 이번엔 Kubernetets Study에 참여하게 됐다.

그간 실무에 k8s을 사용할 일이 없었어서 이번 기회를 통해 k8s와 가까워지면 좋겠다고 생각했다.

Terraform Study 때 배운 내용을 따로 사용해보기도 하면서 많은 도움이 됐었는데 이번에도 스터디로 만족하지 않고 실무에 적용할 수 있는 기회가 오면 좋을 것 같다.

단순 k8s을 설치하고 관리하는 것에 중점을 둔 스터디가 아니라 kOps와 같은 Operation Tool과 네트워크, 스토리지 등에 대한 내용이 담겨있어 부족한 기본기와 더불어 확장성 있는 내용까지 학습할 수 있을 것으로 기대한다.

첫 스터디는 kOps 설치에 대해 다루고 있다.

kOps bastion 역할을 하는 EC2를 배포하고 그 뒤에 kOps 설치 스크립트를 통해 kOps을 설치하는데 그 과정에 있어 route53에 등록 된 DNS Hosted Zone을 사용하게 된다. 마침 최근 등록한 .com 도메인이 있어 해당 도메인을 통해 진행할 예정이다. (네임서버는 스터디를 위해 최근 route53으로 변경 완료하였다.)

0. kOps?

kOps는 AWS와 같은 Cloud Platform에서 k8s을 쉽게 설치하기 위해 도와주는 도구이다.

주요 기능으로는,

고가용성 쿠버네티스 클러스터의 프로비저닝 자동화

테라폼 생성 능력

명령줄 자동 완성

YAML Manifast 기반 API 구성 등이 있다.

이번 스터디를 통해 사용해보니 나같이 k8s가 익숙하지 않은 사람도 쉽고 간편하게 k8s을 설치할 수 있었다.

kOps에 대한 자세한 설명은 하기 링크로 대신한다.

https://kops.sigs.k8s.io/

1. kOps 설치

kOps 역할을 할  EC2를 배포하고 해당 EC2에서 kOps 설치를 진행한다.

사전 준비 내용은 Study 자료 중 제공 되는 yaml 파일을 따로 확인해서 yaml file 없이 별도로 준비를 진행해봤다.

kOps EC2는 Amazon Linux2을 사용하고 kOps가 배포되는 VPC와는 별도의 VPC를 생성했다.

awscli와 jq, git 등을 사전 설치하고 yaml 편집 편의를 위해 Yaml Highlighter도 설치해준다.

그리고 제일 중요한 kubectl, kOps 그리고 helm의 설치도 같이 진행한다.

* 이 부분부터 진행되는 모든 내용은 kOps EC2에서 root 로그인을 진행한 후 진행한다.

kOps의 설치는 아래 코드를 통해 설치한다.

cd /root
curl -LO "https://dl.k8s.io/release/$(curl -L -s https://dl.k8s.io/release/stable.txt)/bin/linux/amd64/kubectl"
install -o root -g root -m 0755 kubectl /usr/local/bin/kubectl
curl -Lo 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
mv kops /usr/local/bin/kops
curl -s https://raw.githubusercontent.com/helm/helm/master/scripts/get-helm-3 | bash

kubectl, KOps 그리고 awsclit 등의 설치 결과를 확인해보았다.

2. kOps Cluster 배포

kOps가 잘 설치 된 것을 확인했으니 kOps을 통해 Cluster 배포를 진행한다.

Cluster 배포 전에 IAM User 생성 및 kOps EC2에 AWS Configure에 IAM User 정보 설정이 필요하다.

IAM User을 생성하고 Administrator Access 권한을 부여한 뒤 Access key을 생성하는 과정을 진행한다.

방법은 하단 코드블럭을 참고해 진행한다.

#iam user 생성
aws iam create-user --user-name "kopsadmin"

#생성 된 iam user에 administrator access 부여
aws iam attach-user-policy --user-name "kopsadmin" --policy-arn arn:aws:iam::aws:policy/AdministratorAccess

#iam user access key, secret access key 생성
aws iam create-access-key --user-name "kopsadmin"

#aws configure 설정
aws configure
AWS Access Key ID [None]: ......
AWS Secret Access Key [None]: ......
Default region name [None]: ap-northeast-2
Default output format [None]: json

#필요 변수 설정
export KOPS_CLUSTER_NAME=bs-yang.com
export KOPS_STATE_STORE=s3://ybs-k8s-s3
export AWS_PAGER=""
export REGION=ap-northeast-2

#S3 생성도 이 단계에서 같이 진행한다.
aws s3 mb s3://ybs-k8s-s3 --region $REGION

Cluster 배포는 아래 코드를 통해 진행한다.

# 변수로 설정 된 값들을 통해 dry run으로 결과값을 yaml에 저장해 이상 유무를 확인한다.
kops create cluster --zones="$REGION"a,"$REGION"c --networking amazonvpc \
--cloud aws --master-size t3.medium --node-size t3.medium --node-count=2 \
--network-cidr 172.30.0.0/16 --ssh-public-key ~/.ssh/id_rsa.pub \
--name=$KOPS_CLUSTER_NAME --kubernetes-version "1.24.10" \
--dry-run -o yaml > mykops.yaml

#위 확인 이후 문제가 없다면 실제 배포를 진행한다.
kops create cluster --zones="$REGION"a,"$REGION"c --networking amazonvpc \
--cloud aws --master-size t3.medium --node-size t3.medium --node-count=2 \
--network-cidr 172.30.0.0/16 --ssh-public-key ~/.ssh/id_rsa.pub \
--name=$KOPS_CLUSTER_NAME --kubernetes-version "1.24.10" -y

일정 시간이 지나면 아래 화면과 같이 배포가 완료된 것을 알 수 있다.

3. kOps Cluster 배포 확인

배포가 모두 완료 되면 검증 명령어를 통해 배포 상황을 확인한다.

배포가 잘 됐는지 Instances 목록 및 Route53을 통해 확인한다.

DNS 정보도 제대로 등록되어 있는지 Route53을 통해 확인한다.

api.과 api.internal. 그리고 kops-controller.internal.이 생성된 것을 확인할 수 있다.

아래와 같이 Cluster 내용을 확인할 수 있다.

위 내용까지 진행하면서 오류가 발생하지 않는다면 kOps을 통해 Cluster 배포가 잘 진행됐다고 볼 수 있다.

추가로 Cluster 배포 때 설정한 S3 버킷을 확인하면 아래와 같은 목록들이 생성 된 것도 확인할 수 있다.

추후 Network, Storage 등을 확인하는 과정이 있어 이 부분이 기대 된다.

이번 회차 내용을 정리하는 것을 과제로 작성하면서 든 생각은 kOps 설치 및 Cluster 배포까지 한 번에 진행할 수 있는 설정이 추가 된 Terraform 코드를 작성해보면 어떨까 하는 생각을 해봤다. 시간은 좀 걸리겠지만 해당 내용을 진행할 수 있도록 도전해봐야겠다.

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다