Kubernetes

[PKOS] 1주차 - AWS kops 설치 및 기본 사용

라온클 2023. 3. 12. 08:30

 

 

PKOS 스터디 소개

올해도 영광스럽게 가시다님의 쿠버네티스 스터디에 참여하게 되었다.

이번에 PKOS(Production Kubernetes Online Study)스터디는 현업에서 쿠버네티스를 사용하는 현직자를 위한 스터디다.

가시다님의 스터디가 워낙 유명하고 인기가 많다보니(가치로 따지면 100만원 이상 돈 내고 들어야 하는 스터디다..) 이번 스터디 모집에도 사람이 엄청 몰렸다.

그래서 두팀으로 나눠서, 

1월에는 가시다님 스터디에 처음 참여하는 분들, 그리고 3월에는 가시다님 스터디 기존 참여자고인물분들이 참여하게 되었다.

스터디 소개: (’23) 쿠버네티스 실무 실습 스터디 (기존멤버 대상)

 

이번 PKOS 스터디는 스터디, 스터디 노션 자료, 과제(본 포스팅) 모두 <24단계 실습으로 정복하는 쿠버네티스> 내용을 기반으로 진행한다.

책 저자분도 스터디에 도우미로 참여하신다!

 

 

 

 

PKOS 스터디 1주차 소개

준비물

1. AWS 계정

  • Root : IAM계정에 AllAccessAdmin 권한을 부여해줘야한다.
  • IAM : 여기서 모든 작업을 수행한다.

 

2. 직접 구매한 도메인

  • IP가 아니라, 도메인에 붙여서 애플리케이션을 노출할 수 있다.
  • Route53에서도 직접 도메인을 살 수 있으나 비싸다.. 호스팅센터, Cafe24, 가비아 등 더 저렴한 업체에서 구매해서 Route53에 설정하는 것을 권장한다.

 

(선택사항)

3. 2개 이상의 브라우저

AWS 계정 Root, IAM 구분할 때 편하다.

원래 나는 업무용,개인용 등 모든 활동을 Google Chrome에서 하는 사람이지만, 개인용 AWS Root계정은 네이버웨일, IAM계정은 Safari에서 진행하고 있다.

 

4. Termius, Tabby 같은 SSH 접속 툴

각 EC2인스턴스에 접속할 때 편하다. 

 

 

PKOS 스터디 인프라 구조

오타는 일부 수정

 

 

 

기본 인프라 만들기

Cloud Formation으로 kops-ec2 만들기

kops-ec2 인스턴스는 Cloud Formation으로 생성한다.

가시다님이 만들어주신 템플릿(mady by ✨가시다님✨)이 있어서 우리는 Key Pair만 준비해두면 된다.

템플릿 안에는 kops 설치도 포함되어 있다.

감사합니다, 가시다님..!

Cloud Formation으로 1분도 안되어서 생성 뚝딱

 

kops-ec2에 접속하기

kops-ec2 인스턴스가 생성된 걸 확인하면 로컬에서 터미널로 kops-ec2 인스턴스에 접속해보자.

 

 

 

 

 

 

클러스터를 생성하기 위해 사전 세팅하기

kops-ec2에 접속하면 제일 먼저, kops가 제대로 설치 완료되었는지 확인 후, IAM 계정 및 기초 환경설정을 시작한다.

 

[kops-ec2]

# kops가 제대로 설치되었는지 명령어로 확인하기
kops --help

# AWS IAM 설정하기 (준비물 중 IAM계정의 Accesskey를 입력한다.)
aws configure

# aws cli 페이지 출력 옵션
export AWS_PAGER=""

# 리소스를 배치할 리전 이름을 변수 지정하기(리전은 서울을 사용한다.)
REGION=ap-northeast-2

 

 

S3 버킷 생성하기

[kops-ec2]

# k8s 설정 파일이 저장될 버킷 생성
aws s3 mb s3://{유일한 S3버킷 이름} --region $REGION

 

 

클러스터 생성 후, 버킷에 이렇게 설정파일들이 쌓이는걸 볼 수 있다.

 


환경변수 세팅하기

클러스터 배포 시 참고할 정보들을 환경 변수에 저장한다.

 

[kops-ec2]

export AWS_PAGER=""
export REGION=ap-northeast-2
export KOPS_CLUSTER_NAME={자신의 도메인}
export KOPS_STATE_STORE=s3://{내가 생성한 S3버킷 이름}

echo 'export AWS_PAGER=""' >>~/.bashrc
echo 'export REGION=ap-northeast-2' >>~/.bashrc
echo 'export KOPS_CLUSTER_NAME={자신의 도메인}' >>~/.bashrc
echo 'export KOPS_STATE_STORE=s3://{내가 생성한 S3버킷 이름}' >>~/.bashrc

 

 

 

 

 

쿠버네티스 클러스터 만들기

쿠버네티스 클러스터 생성 및 확인하기

[kops VM]

# kops 설정 파일 생성하기
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

# 클러스터가 생성될 때까지(="Your cluster {자신의 도메인} is ready" 표시가 나타날 때까지) 기다린다.
kops validate cluster --wait 10m

 

 

 

몇 분 후, 쿠버네티스 클러스터가 배포된 것을 확인할 수 있다.

 

 

인스턴스와 쿠버네티스 component들 모두 running하는걸 확인한다.

콘솔에서 확인한 ec2인스턴스들

 

터미널에서 확인한 kube-system 네임스페이스의 component들

 

 

Route53에서 내 도메인 설정하기

도메인도 붙여보자. 

# 자신의 도메인 변수 지정하기
MyDomain=<자신의 도메인>

# 자신의 Route 53 도메인 ID 조회
aws route53 list-hosted-zones-by-name --dns-name "${MyDomain}." --query "HostedZones[0].Id" --output text

# 자신의 도메인 호스트 존 ID 변수 지정하기
MyDnzHostedZoneId=`aws route53 list-hosted-zones-by-name --dns-name "${MyDomain}." --query "HostedZones[0].Id" --output text`

# Route53에 자신의 도메인 A레코드 조회
aws route53 list-resource-record-sets --hosted-zone-id "${MyDnzHostedZoneId}" --query "ResourceRecordSets[?Type == 'A'].Name" --output text

 

 

터미널에서 세팅 후, 콘솔에서 바로 확인할 수 있다.

 

마리오 게임 배포하기

CLB로 배포하기

# 수퍼마리오 관련 yaml파일 다운받기
curl -s -O https://raw.githubusercontent.com/gasida/PKOS/main/1/mario.yaml

# 수퍼마리오 Deployment, 서비스(Load Balancer) 배포
kubectl apply -f mario.yaml

# 마리오 게임의 (웹브라우저에서 접속할 수 있는)CLB주소 확인하기
kubectl get svc mario -o jsonpath={.status.loadBalancer.ingress[0].hostname} | awk '{ print "Maria URL = http://"$1 }'

[참고] watch 옵션은 리소스 1개만 볼 수 있다.

 

 

 

External DNS Add-0n로 배포하기

Exnternal DNS Add-On는?

쿠버네티스의 Service와 Ingress를 생성할 때 도메인을 설정하면, AWS(Route 53), Azure(DNS), GCP(Cloud DNS)에 A레코드(or TXT 레코드)를 자동으로 생성/삭제 해주는 플러그인이다.

각 CSP마다 서비스 세팅하는게 달라서 (가뜩이나 진입장벽 높은)쿠버네티스에 애먹는 사람이 많은데, 이걸 플러그인 하나로 절차를 줄여준다니 꽤나 신기했다.

 

Exnternal DNS Add-On 설치하기

# IAM 정책 json파일 다운받기(가시다님 제공)
curl -s -O https://s3.ap-northeast-2.amazonaws.com/cloudformation.cloudneta.net/AKOS/externaldns/externaldns-aws-r53-policy.json

# IAM 정책 생성하기
aws iam create-policy --policy-name AllowExternalDNSUpdates --policy-document file://externaldns-aws-r53-policy.json

# ACCOUNT_ID 변수 지정하기
export ACCOUNT_ID=$(aws sts get-caller-identity --query 'Account' --output text)

# 마스터노드에 IAM Policy 추가하기(attach)
aws iam attach-role-policy --policy-arn arn:aws:iam::$ACCOUNT_ID:policy/AllowExternalDNSUpdates --role-name masters.$KOPS_CLUSTER_NAME

# 워커노드에 IAM Policy 추가하기(attach)
aws iam attach-role-policy --policy-arn arn:aws:iam::$ACCOUNT_ID:policy/AllowExternalDNSUpdates --role-name nodes.$KOPS_CLUSTER_NAME

# 설치(spec 하위에 아래 두줄을 추가한다.)
kops edit cluster
--------------------------
spec:
  externalDns:
    provider: external-dns
--------------------------

# 업데이트 적용하기
kops update cluster --yes && echo && sleep 3 && kops rolling-update cluster

# externalDns 컨트롤러 파드 확인
kubectl get pod -n kube-system -l k8s-app=external-dns

 

 

Exnternal DNS로 도메인 연결하기

# CLB에 ExternanDNS 로 도메인 연결하기(mario서비스에 annotation을 추가한다)
kubectl annotate service mario "external-dns.alpha.kubernetes.io/hostname=mario.$KOPS_CLUSTER_NAME"

# 웹브라우저에서 접속할 수 있는 도메인 확인하기
echo -e "Maria Game URL = http://mario.$KOPS_CLUSTER_NAME"

 

 

웹 브라우저로 위 URL을 들어가면~

완성!

 

 

nslookup 해보면, CLB주소와 도메인 모두 A레코드가 동일한 것을 확인할 수 있다.

관련 포스팅: DNS 레코드를 간단히 알아보아요

 

 

 

 

리소스 삭제

꺼진 불.. 아니 꺼진 리소스도 다시 보자.

 

 

위부터 아래로 순서대로 삭제하자

# mario 애플리케이션(Deployment), 서비스(Load Balancer) 삭제
kubectl delete deploy,svc mario


# 쿠버네티스 클러스터 삭제
kops delete cluster --yes


# Cloud Formation 스택(=kops-ec2 인스턴스) 삭제
aws cloudformation delete-stack --stack-name mykops