kOps란
kOps는 클라우드 플랫폼(AWS, GCP, Azure)에서 쉽고 빠르게 쿠버네티스 환경을 자동으로 생성하고 관리할 수 있도록 도와주는 오픈소스 툴입니다.
짧은 프로비저닝 시간 및 AWS의 다양한 서비스와 유연하게 연동되는 점을 토대로 kOps 기반으로 스터디 실습 환경을 구축하게 되었습니다.
실습 환경 구성도
•
kops-ec2 : kOps가 설치되어 쿠버네티스 클러스터 구축 및 이후 클러스터에 컨트롤 명령(kubectl)을 실행하기 위한 인스턴스
•
k8s : k8s v1.24.10, OS Ubuntu 20.04 LTS을 사용, 마스터 노드와 워커 노드 2대는 ASG로 구성되며 etcd 및 필요한 데이터를 저장하기 위해 EBS를 사용
•
S3 : 쿠버네티스 관련 설정파일 및 상태 저장을 위해 사용
•
Route53 : 미리 등록한 퍼블릭 도메인(jjikin.com)으로 클러스터 구축에 필요한 A 레코드를 생성
실습 환경 구축
CloudFormation을 이용한 기본 인프라 배포
1.
VPC, 서브넷, 라우팅테이블, IGW, kops-ec2 등의 기본 인프라를 CloudFormation 스택으로 생성합니다.
2.
클러스터 배포 시 권한이 필요한데, 실습 편의를 위해 Admin 권한의 Credential을 aws configure 명령을 통해 입력합니다.
[root@kops-ec2 ~]# aws configure
AWS Access Key ID [None]: AKIA****************
AWS Secret Access Key [None]: Htep********************************
Default region name [None]: ap-northeast-2
Default output format [None]: json
Bash
3.
클러스터 배포 전 필요한 리소스를 생성하고, 환경 변수로 저장합니다.
# k8s 설정 파일을 저장할 버킷 생성
aws s3 mb s3://jjikin-kops-s3 --region $REGION
# 환경 변수 설정
export KOPS_CLUSTER_NAME=jjikin.com #자신의 퍼블릭 호스팅 메인 주소
export KOPS_STATE_STORE=s3://jjikin-kops-s3 # 위에서 생성한 버킷명
export REGION=ap-northeast-2
# 기타 설정
export AWS_PAGER=""
Bash
4.
클러스터를 배포합니다.
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
Bash
예제 서비스 배포
# 수퍼마리오 디플로이먼트 배포 (약 5분 소요)
curl -s -O https://raw.githubusercontent.com/gasida/PKOS/main/1/mario.yaml
kubectl apply -f mario.yaml
cat mario.yaml | yh
# 배포 확인
kubectl get deploy,svc,ep mario
watch kubectl get svc mario
# 서비스 확인
kubectl get svc mario -o jsonpath={.status.loadBalancer.ingress[0].hostname} | awk '{ print "Maria URL = http://"$1 }'
Bash
ExternalDNS를 이용한 AWS Route53 연동
쿠버네티스 Service, Ingress 생성 시 AWS Route53과 연동되어 자동으로 A레코드를 생성/삭제 가능하도록 설정합니다.
•
ExternalDNS 설치
# 정책 생성 및 마스터/워커노드에 연결
curl -s -O https://s3.ap-northeast-2.amazonaws.com/cloudformation.cloudneta.net/AKOS/externaldns/externaldns-aws-r53-policy.json
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)
# EC2 instance profiles에 IAM Policy attach
aws iam attach-role-policy --policy-arn arn:aws:iam::$ACCOUNT_ID:policy/AllowExternalDNSUpdates --role-name masters.$KOPS_CLUSTER_NAME
aws iam attach-role-policy --policy-arn arn:aws:iam::$ACCOUNT_ID:policy/AllowExternalDNSUpdates --role-name nodes.$KOPS_CLUSTER_NAME
# 설치(맨 아래에 externalDns 추가)
kops edit cluster
...
topology:
dns:
type: Public
masters: public
nodes: public
externalDns:
provider: external-dns
# 업데이트 적용
kops update cluster --yes && echo && sleep 3 && kops rolling-update cluster
# externalDns 컨트롤러 파드 확인
(⎈|jjikin:kube-system) [root@kops-ec2 ~]# kubectl get pod -n kube-system -l k8s-app=external-dns
NAME READY STATUS RESTARTS AGE
external-dns-5644d9c4bf-gfz6r 1/1 Running 0 35s
Bash
•
예제 서비스에 도메인 연결
# CLB에 ExternanDNS로 도메인 연결
kubectl annotate service mario "external-dns.alpha.kubernetes.io/hostname=mario.$KOPS_CLUSTER_NAME"
# 확인
dig +short mario.$KOPS_CLUSTER_NAME
kubectl logs -n kube-system -l k8s-app=external-dns
# 웹 접속 주소 확인 및 접속
echo -e "Maria Game URL = http://mario.$KOPS_CLUSTER_NAME"
# 도메인 체크
echo -e "My Domain Checker = https://www.whatsmydns.net/#A/mario.$KOPS_CLUSTER_NAME"
Bash
활용성 및 관리 편리성을 위한 설정
kubectl 자동 완성 기능과 alias 사용하기
# 자동 완성 및 alias 축약 설정
source <(kubectl completion bash)
echo 'source <(kubectl completion bash)' >> ~/.bashrc
echo 'alias k=kubectl' >> ~/.bashrc
echo 'complete -F __start_kubectl k' >> ~/.bashrc
Bash
krew(크루) 설치
•
kubernetes CLI 툴인 kubectl의 Plugin을 관리하는 패키지 매니저로 손쉽게 kubernetes 관련 플러그인들을 설치할 수 있다.
# 설치
curl -fsSLO https://github.com/kubernetes-sigs/krew/releases/download/v0.4.3/krew-linux_amd64.tar.gz
tar zxvf krew-linux_amd64.tar.gz
./krew-linux_amd64 install krew
tree -L 3 /root/.krew/bin
# PATH 추가
export PATH="${PATH}:/root/.krew/bin"
echo 'export PATH="${PATH}:/root/.krew/bin"' >>~/.bashrc
# 설치 플러그인 확인
kubectl krew list
Bash
krew를 통한 플러그인 설치
# kube-ctx : 쿠버네티스 컨텍스트 전환을 빠르게
kubectl krew install ctx
# ctx없이 기본적으로 컨텍스트를 변경하기 위한 명령어
kubectl config use-context jjikin.com
# ctx를 사용한 전환
[root@kops-ec2 ~]# kubectl ctx jjikin.com
Switched to context "jjikin.com".
# kube-ns : 네임스페이스를 컨텍스트처럼 전환 가능
kubectl krew install ns
# ns를 사용한 설정
[root@kops-ec2 ~]# k ns kube-system Context "jjikin.com" modified.
Active namespace is "kube-system".
[root@kops-ec2 ~]# kubectl ns
default
kube-node-lease
kube-public
kube-system
# 이외 유용한 플러그인 설치
kubectl krew install df-pv get-all ktop neat oomd view-secret
# kube-ps1
git clone https://github.com/jonmosco/kube-ps1.git /root/kube-ps1
cat <<"EOT" >> /root/.bash_profile
source /root/kube-ps1/kube-ps1.sh
KUBE_PS1_SYMBOL_ENABLE=true
function get_cluster_short() {
echo "$1" | cut -d . -f1
}
KUBE_PS1_CLUSTER_FUNCTION=get_cluster_short
KUBE_PS1_SUFFIX=') '
PS1='$(kube_ps1)'$PS1
EOT
Bash
실습 환경 + Add-On 원클릭 구축
참고
•
가시다님 PKOS2 스터디 자료