PKOS 연구 소개
올해 저는 가다님의 쿠버네티스 스터디에 참여하게 되어 영광이었습니다.
이번에는 PKOS(피생산 케이오버넷 영형온라인 에스tudy)Study는 Kubernetes를 실제로 사용하는 기존 회사를 대상으로 한 연구입니다.
가시다의 스터디가 워낙 유명하고 인기가 많아서(가치로 따지면 100만원 이상은 들어야…) 이번 스터디모집에 많은 사람들이 몰려들었다.
그래서 두 그룹으로 나눕니다.
1월은 스터디에 처음 참여하신 분들, 3월은 스터디에 처음 참여하신 분들입니다.
연구 소개: (’23) 쿠버네티스 인턴십(기존회원 대상) (신청마감)
이 PKOS 연구 스터디, 스터디 텀 데이터, 태스크(이 글) 다 책
PKOS 연구 1주차 소개
재료
1. AWS 계정
- 루트: IAM 계정에 AllAccessAdmin 권한을 부여해야 합니다.
- IAM: 여기에서 모든 작업을 수행합니다.
2. 직접 구매한 도메인
- DNS가 서비스에 연결될 때 사용됩니다.
- Route53에서 직접 도메인을 구입할 수도 있지만 비용이 많이 듭니다.
- 호스팅 센터나 카페24, 가비아 등 저렴한 업체에서 구매하여 Route53에 설치하는 것을 권장합니다.
(옵션)
3. 2개 이상의 브라우저
AWS 계정 루트와 IAM을 구별하는 것이 유용합니다.
원래 저는 Chrome에서 모든 활동을 하는 사람입니다. B. 업무용 및 개인용, 개인 AWS 루트 계정은 Naver Whale에 있고 IAM 계정은 Safari에 있습니다.
4. 테르미우스처럼 태비 SSH 연결 도구
이는 각 VM에 연결할 때 편리합니다.
PKOS 연구 인프라

기본 인프라 만들기
Cloud Formation으로 kops-ec2 구축
kops-ec2 인스턴스는 Cloud Formation을 사용하여 생성됩니다.
Gada(Kashida 제작)에서 생성한 템플릿을 사용하여 Cloud Formation Stack을 생성합니다.
키 페어를 준비하기만 하면 됩니다.

kops-ec2에 연결
생성 완료 확인 후 로컬 터미널에서 kops-ec2 인스턴스에 접속해 봅시다!

# CloudFormation 스택 배포 완료 kops-ec2의 IP확인하기
aws cloudformation describe-stacks --stack-name mykops --query 'Stacks(*).Outputs(*).OutputValue' --output text
# kops-ec2에 SSH 접속하기
ssh -i ~/.ssh/{my-key}.pem ec2-user@$(aws cloudformation describe-stacks --stack-name mykops --query 'Stacks(*).Outputs(0).OutputValue' --output text)

클러스터 생성을 위한 기본값
(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-ec2에서 Kubernetes 클러스터 생성 및 확인
(Kops VM)
# kops 설정 파일 생성(s3) 및 k8s 클러스터 배포 : 6분 정도 소요
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
# validate
kops validate cluster --wait 10m
몇 분 후에 Kubernetes 클러스터가 배포되어야 합니다.



Route53에서 내 도메인 설정
도메인을 추가해 보겠습니다.
# 자신의 도메인 변수 지정하기
MyDomain=<자신의 도메인>
# 자신의 Route 53 도메인 ID 조회 및 변수 지정
aws route53 list-hosted-zones-by-name --dns-name "${MyDomain}." | jq
aws route53 list-hosted-zones-by-name --dns-name "${MyDomain}." --query "HostedZones(0).Name"
aws route53 list-hosted-zones-by-name --dns-name "${MyDomain}." --query "HostedZones(0).Id" --output text
MyDnzHostedZoneId=`aws route53 list-hosted-zones-by-name --dns-name "${MyDomain}." --query "HostedZones(0).Id" --output text`
echo $MyDnzHostedZoneId
# Route53에 자신의 도메인 A레코드 조회
aws route53 list-resource-record-sets --hosted-zone-id "${MyDnzHostedZoneId}" --query "ResourceRecordSets(?Type == 'A')" | jq
aws route53 list-resource-record-sets --hosted-zone-id "${MyDnzHostedZoneId}" --query "ResourceRecordSets(?Type == 'A').Name" | jq
aws route53 list-resource-record-sets --hosted-zone-id "${MyDnzHostedZoneId}" --query "ResourceRecordSets(?Type == 'A').Name" --output text
# A 레코드 값 반복 조회
while true; do aws route53 list-resource-record-sets --hosted-zone-id "${MyDnzHostedZoneId}" --query "ResourceRecordSets(?Type == 'A')" | jq ; date ; echo ; sleep 1; done
단말기에서 설정 후 콘솔에서 바로 확인하실 수 있습니다.

마리오 게임의 유통
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 }'

감시 옵션은 하나의 리소스만 볼 수 있는 것 같습니다.


외부 DNS add-0n으로 프로비저닝
외부 DNS 애드온이란 무엇입니까?
Kubernetes Service 및 Ingress 생성 시 도메인 설정 시 AWS(Route 53), Azure(DNS), GCP(Cloud DNS)에 A 레코드(또는 TXT 레코드)를 자동으로 생성/삭제하는 플러그인입니다.
상당히 낯설고 CSP마다 서비스 설정이 다르기 때문에 쿠버네티스(이미 진입장벽이 높음)에 문제가 있는 분들이 많은데 이 과정을 플러그인으로 줄였다는게 상당히 신기했습니다.
외부 DNS 애드온 설치
# 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

도메인을 외부 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"


nslookup을 실행하면 CLB 주소와 도메인 모두 A 레코드가 동일한 것을 확인할 수 있습니다.


