Search

AWS kOps 설치 및 실습 환경 구성

Date
2023/03/12
Catagory
Kubernetes
Service
Kubenetes
Keyword
week1

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 스터디 자료