새소식

Study/PKOS

PKOS - 1주차 AWS kOps 설치 및 기본 사용

  • -

kOps란?

Kubernetes Operations (kOps) - Production Grade k8s Installation, Upgrades and Management

  • kOps 는 클라우드 플랫폼(aws, gcp, azure 등)에서 쉽게 k8s 를 설치할 수 있도록 도와주는 도구
  • kOps 는 서버 인스턴스와 네트워크 리소스 등을 클라우드에서 자동으로 생성해 k8s 를 설치
  • kOps 는 AWS 의 다양한 서비스와 유연하게 연동되어 사용 가능
  • AWS (Amazon Web Services) 및 GCE (Google Cloud Platform)는 현재 공식적으로 지원되며 DigitalOcean , Hetzner  OpenStack 은 베타 지원으로, Azure 는 알파로 지원됩니다.

 

실습을 위한 사전 준비 사항

  • IAM User 생성 : IAM 정책(AdministratorAccess) 부여
  • AWS Route53 퍼블릭 호스팅 영역(도메인) 구입

Route53 도메인 구입 예시

 

kOps를 활용하기 위한 실습 구성도

  • 가시다님이 공유해준 cloudformation yaml을 통해서 인프라 구성.
  • 버전 : k8s v1.24.9, OS Ubuntu 20.04 LTS

실습 구성 아키텍처

 

AWS kOps 설치

포탈을 통한 클라우드 포메이션 배포

해당 클라우드 포메이션을 이용한 배포시 파라미터 입력 값 주의 사항

 

아래 CLI를 통한 배포도 가능

Yaml 파일 다운로드

curl -O https://s3.ap-northeast-2.amazonaws.com/cloudformation.cloudneta.net/K8S/kops-new-ec2.yaml

 

AWS CLI를 통한 배포 ( AWS CLI 플러그인이 설치된 로컬 or kops-ec2에서 실행 )

# aws cloudformation deploy --template-file ~/Downloads/kops-new-ec2.yaml --stack-name <Stack name> --parameter-overrides KeyName=<My SSH Keyname> SgIngressSshCidr=<My Home Public IP Address>/32 --region <리전>
예시) aws cloudformation deploy --template-file ~/Downloads/kops-new-ec2.yaml --stack-name mykops --parameter-overrides KeyName=kp-yeongil SgIngressSshCidr=$(curl -s ipinfo.io/ip)/32 --region ap-northeast-2

 

 

CloudFormation 스택 배포 완료 후 EC2 IP 출력 

aws cloudformation describe-stacks --stack-name mykops --query 'Stacks[*].Outputs[*].OutputValue' --output text
예시) 3.35.137.31


kOps-ec2 에 SSH 접속

예시) ssh -i <My SSH Keyfile> ec2-user@3.35.137.31

 

kOps 클러스터 배포 및 확인 : kops-ec2 에 SSH 로그인 후 아래 실행

 

IAM User 자격 구성 : 실습 편리를 위해 administrator 권한을 가진 IAM User 의 자격 증명 입력

(Access Key는 미리 발급!!!)

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


자격 구성 적용 확인 : 노드 IP 확인

aws ec2 describe-instances


aws cli 페이지 출력 옵션 ( 한번에 스크롤로 확인이 가능한 옵션 )

export AWS_PAGER=""


리소스를 배치할 리전이름을 변수 지정

REGION=ap-northeast-2  # 서울 리전 사용


k8s 설정 파일이 저장될 버킷 생성

aws s3 mb s3://버킷<유일한 이름>  --region </s3 배포될 aws 리전>
aws s3 ls
예시) aws s3 mb s3://yeongil-k8s-s3 --region ap-northeast-2

 

배포 시 참고할 정보를 환경 변수에 저장 ( ~/.bashrc에 환경 변수를 저장시 EC2재접속시에도 변수정보가 남아있음!!! )

예시) 
export AWS_PAGER=""
export REGION=ap-northeast-2
export KOPS_CLUSTER_NAME=yeongil.link
export KOPS_STATE_STORE=s3://yeongil-k8s-s3
echo 'export AWS_PAGER=""' >>~/.bashrc
echo 'export REGION=ap-northeast-2' >>~/.bashrc
echo 'export KOPS_STATE_STORE=s3://yeongil-k8s-s3' >>~/.bashrc

 

자신의 퍼블릭 호스팅 메인 주소

Route53 퍼블릭 호스팅 도메인 없는 경우 Gossip DNS 사용 가능 : "<각자 편한 이름>.k8s.local"

KOPS_CLUSTER_NAME 사용

echo 'export KOPS_CLUSTER_NAME=yeongil.link' >>~/.bashrc


kops 설정 파일 생성(s3) 및 k8s 클러스터 배포 : 6분 정도 소요
CNI는 aws vpc cni 사용, 마스터 노드 1대(t3.medium), 워커 노드 2대(t3.medium), 파드 사용 네트워크 대역 지정(172.30.0.0/16)

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.9" -y


10분간 클러스터 구성 확인 

kops validate cluster --wait 10m

 

만약 10분이 지나도 클러스터가 구성이 안되었을 경우 아래 방법 확인!

  • 설치 중간에 실패 시 삭제 방법
    1. EC2 Auto Scaling 그룹 : 3개 삭제
    2. EC2 시작 템플릿 Launch Templates : 3개 삭제
    3. S3 버킷 비우기
    4. Route53 에 추가된 A 레코드 3개 삭제
    5. CloudFormation 삭제

 

kOps 설치 확인 : 설치 완료 후 진행

과제1

각자 설치한 AWS kOps 클러스터의 정보를 올려주세요 : kops get cluster , kops get instances

kops 클러스터, 인스턴스 정보 (과제 1)

 

kops 클러스터 상세 정보 확인(yaml 형식으로)

kops get cluster -o yaml
kops get cluster -o yaml | yh

kubectl cluster-info
kubectl cluster-info dump


인스턴스그룹 상세 정보 확인

kops get ig -o yaml
kops get ig -o yaml | yh


인스턴스 상세 정보 확인

kops get instances
kops get instances -o yaml | yh


편의를 위한 자동 완성 및 alias 축약 설정 

source <(kubectl completion bash)
echo 'source <(kubectl completion bash)' >> ~/.bashrc
echo 'alias k=kubectl' >> ~/.bashrc
echo 'complete -F __start_kubectl k' >> ~/.bashrc


배포 완료 후 정보 확인

tree -L 1 ~/.kube
cat .kube/config
cat .kube/config | yh

 

Master Node SSH 접속 후 확인

[master node] iptables rules
ssh -i ~/.ssh/id_rsa ubuntu@api.$KOPS_CLUSTER_NAME sudo iptables -t nat -S

[master node] 컨테이너 정보 확인
ssh -i ~/.ssh/id_rsa ubuntu@api.$KOPS_CLUSTER_NAME ps axf |grep /usr/bin/containerd
ssh -i ~/.ssh/id_rsa ubuntu@api.$KOPS_CLUSTER_NAME ps afxuwww

[master node] tree 툴 설치
ssh -i ~/.ssh/id_rsa ubuntu@api.$KOPS_CLUSTER_NAME sudo apt install -y tree jq

[master node] 볼륨/마운트 확인 : nvme1n1 과 nvme2n1 은 etcd-events, etcd-main 으로 사용
ssh -i ~/.ssh/id_rsa ubuntu@api.$KOPS_CLUSTER_NAME lsblk
ssh -i ~/.ssh/id_rsa ubuntu@api.$KOPS_CLUSTER_NAME df -hT --type=ext4
Filesystem     Type  Size  Used Avail Use% Mounted on
/dev/root      ext4   62G  5.5G   57G   9% /
/dev/nvme1n1   ext4   20G  167M   20G   1% /mnt/master-vol-03072035bffdd8252
/dev/nvme2n1   ext4   20G  170M   20G   1% /mnt/master-vol-0db4765644c7d6ecb

[master node] nvme1n1,nvme1n2 디렉터리 확인
ssh -i ~/.ssh/id_rsa ubuntu@api.$KOPS_CLUSTER_NAME tree /mnt/master-vol-03072035bffdd8252
ssh -i ~/.ssh/id_rsa ubuntu@api.$KOPS_CLUSTER_NAME tree /mnt/master-vol-0db4765644c7d6ecb

[master node] kubelet 상태 확인
ssh -i ~/.ssh/id_rsa ubuntu@api.$KOPS_CLUSTER_NAME systemctl status kubelet

 

kops-ec2에서 워커 노드 public ip 확인

aws ec2 describe-instances --query "Reservations[*].Instances[*].{PublicIPAdd:PublicIpAddress,InstanceName:Tags[?Key=='Name']|[0].Value}" --filters Name=instance-state-name,Values=running --output table

 

워커 노드 Public IP 변수를 지정하여 이후 워커노드 접속은 변수를 활용하여 쉽게 접근.

W1PIP=<워커 노드 1 Public IP>
W2PIP=<워커 노드 2 Public IP>

예제)
W1PIP=3.35.50.183
W2PIP=54.180.118.11

 

Worker Node SSH 접속 확인.

[worker1]
ssh -i ~/.ssh/id_rsa ubuntu@$W1PIP
exit

[worker2]
ssh -i ~/.ssh/id_rsa ubuntu@$W2PIP
exit

 

워커노드 스토리지 확인 ( kops-ec2에서 확인 )

ssh -i ~/.ssh/id_rsa ubuntu@$W1PIP lsblk
ssh -i ~/.ssh/id_rsa ubuntu@$W2PIP lsblk
ssh -i ~/.ssh/id_rsa ubuntu@$W1PIP df -hT -t ext4
ssh -i ~/.ssh/id_rsa ubuntu@$W2PIP df -hT -t ext4

 

클러스터 관리 편리성을 위한 추가 플러그인

kubectl cli 플러그인 매니저 쿠버네티스 크루(krew)

Krew란?

더보기

 https://krew.sigs.k8s.io/

 

Krew – kubectl plugin manager

© 2022 The Kubernetes Authors. Krew is a Kubernetes SIG CLI project. Edit Page ·

krew.sigs.k8s.io

Krew는 kubectl명령줄 도구의 플러그인 관리자입니다.

Krew helps you:

  • discover kubectl plugins,
  • install them on your machine,
  • and keep the installed plugins up-to-date

현재 Krew 에는 210 개의 kubectl 플러그인 이 배포되어 있습니다.

Krew는 macOS, Linux 및 Windows와 같은 모든 주요 플랫폼에서 작동합니다.

 

krew 플러그인 설치

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


krew 확인

kubectl krew
kubectl krew update
kubectl krew search
kubectl krew list
kubectl krew


kube-ctx : 쿠버네티스 컨텍스트 사용

# 설치
kubectl krew install ctx

# 컨텍스트 확인
kubectl ctx

# 컨텍스트 사용 
kubectl ctx <각자 자신의 컨텍스트 이름>

 

kube-ns : 네임스페이스(단일 클러스터 내에서 가상 클러스터) 사용

( 개인적으로 OpenShift와 비슷한 동작으로 Name space를 선택하여 작업하게 도와주는 편리한 플러그인이라고 생각한다. )

 

# 설치
kubectl krew install ns

# 네임스페이스 확인
kubectl ns

# 새로운 터미널
watch kubectl get pod

# kube-system 네임스페이스 선택 사용
kubectl ns kube-system

# default 네임스페이스 선택 사용
kubectl ns -
# 혹은
kubectl ns default

 

kube-ps1 설치 및 사용

더보기

https://github.com/jonmosco/kube-ps1

 

GitHub - jonmosco/kube-ps1: Kubernetes prompt info for bash and zsh

Kubernetes prompt info for bash and zsh. Contribute to jonmosco/kube-ps1 development by creating an account on GitHub.

github.com

kubectlBash/Zsh 프롬프트 문자열(예: ) 에 구성된 현재 Kubernetes 컨텍스트 및 네임스페이스를 추가할 수 있는 스크립트입니다 $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

# 적용
exit
exit

# default 네임스페이스 선택
kubectl ns default

 

 

헬름(Helm)

쿠버네티스의 패키지(Chart) Manager Helm

 

  • 헬름(Helm)은 쿠버네티스의 패키지(Chart) 관리자이다. 헬름은 오픈 소스 소프트웨어로 공개되어 있으며, 이미 많은 패키지(Chart)가 있다.또한, 롤링 업데이트 등에도 지원하는 것들이 많아 쿠버네티스에서 최적화된 설정으로 사용할 수 있는 장점도 있다.
  • 예를 들어, 레디스 클러스터나 워드프레스 환경 등의 소프트웨어를 하나의 명령어로 쿠버네티스 클러스터에 배포할 수 있다.
  • 헬름이 관리하는 공식 차트는 Artifact Hub 에서 제공된다. Artifact Hub 는 CNCF Projects 의 패키지/설정을 제공한다. Github
  • 기본적으로는 참조하는 저장소가 등록되어 있지 않다. 저장소를 추가해서 사용해야 한다.
 

GitHub - artifacthub/hub: Find, install and publish Kubernetes packages

Find, install and publish Kubernetes packages. Contribute to artifacthub/hub development by creating an account on GitHub.

github.com

더보기

https://helm.sh

 

Helm

Helm - The Kubernetes Package Manager.

helm.sh

  • 차트(Chart) : 쿠버네티스에서 실행할 애플리케이션을 만드는 데 필요한 정보 묶음(=압축 파일)
    • 차트는 쿠버네티스의 리소스 yaml 파일을 템플릿으로 만들고 메타정보파일 을 압축한 파일
  • 릴리즈(release) : 특정 컨피그를 이용해 실행 중인 차트의 인스턴스

 

과제2

Helm 으로 워드프레스를 배포하고 관리페이지에 접속해서 글 1개 작성해주시고 스크린샷을 올려주세요

Helm은 이미 kOps 클러스터 구성 과정 중 EC2 user-data로 설치 완료.

 

워드프레스 배포 과정

 

아티팩트 허브에서 검색

helm search hub wordpress
URL                                               	CHART VERSION 	APP VERSION        	DESCRIPTION
https://artifacthub.io/packages/helm/kube-wordp...	0.1.0         	1.1                	this is my wordpress package
https://artifacthub.io/packages/helm/bitnami/wo...	12.2.3        	5.8.2              	Web publishing platform for building blogs and ...
...

 

Repo 추가 및 wordpress 검색

# repo 추가 및 확인
helm repo add bitnami https://charts.bitnami.com/bitnami
helm repo list

# wordpress 검색
helm search repo wordpress
NAME                   	CHART VERSION	APP VERSION	DESCRIPTION
bitnami/wordpress      	15.2.22      	6.1.1      	WordPress is the world's most popular blogging ...
bitnami/wordpress-intel	2.1.28       	6.1.1      	WordPress for Intel is the most popular bloggin...

 

파라미터 지정 설치 & CLB를 통해 배포

# 워드프레스 네임스페이스 생성
kubectl create ns wordpress

# wordpress 네임스페이스로 변경
kubectl ns wordpress

# 기본 파라미터를 덮어쓸수 있게 --set 으로 지정
helm install myblog \
  --set wordpressUsername=admin \
  --set wordpressPassword=password \
  --set wordpressBlogName="PKOS BLOG" \
  --namespace wordpress bitnami/wordpress --version 15.2.22

# 설치 확인
kubectl get all,secret,cm,pvc
kubectl get-all -n wordpress
kubectl df-pv
 PV NAME                                   PVC NAME                NAMESPACE  NODE NAME            POD NAME                            VOLUME MOUNT NAME  SIZE  USED   AVAILABLE  %USED  IUSED  IFREE   %IUSED
 pvc-cc40901b-d762-4c2d-b387-4c3d381da992  data-myblog-mariadb-0   default    i-00d193c4426789be0  myblog-mariadb-0                    data               7Gi   127Mi  7Gi        1.61   245    524043  0.05
 pvc-8f8eb340-2d1b-4b50-8bf3-e3882b5a6ef7  myblog-wordpress        default    i-00d193c4426789be0  myblog-wordpress-5585b5f96d-q72fm   wordpress-data     9Gi   230Mi  9Gi        2.33   17976  637384  2.74

 

접속 URL 확인

# 워드프레스 블로그 접속 : CLB 주소로 웹 접속
kubectl get svc myblog-wordpress -o jsonpath={.status.loadBalancer.ingress[0].hostname} | awk '{ print "Wordpress URL = http://"$1 }'

# 워드프레스 블로그 관리자 페이지 접속 : CLB 주소로 웹 접속
kubectl get svc myblog-wordpress -o jsonpath={.status.loadBalancer.ingress[0].hostname} | awk '{ print "Wordpress URL = http://"$1"/admin" }'

 

관리자 계정 (admin 페이지) 확인

echo Username: admin
echo Password: $(kubectl get secret myblog-wordpress -o jsonpath="{.data.wordpress-password}" | base64 --decode)

 

워드프레스( 과제 2 ) 결과물!

릴리즈 삭제하기

helm uninstall myblog

 

과제3 

AWS kOps 활용

아래 kOps 활용 기능 중 1개를 선택해서 실습 후 결과 내용 공유

  • 워커 노드 증가(ASG = Auto Scaling Group 활용) 
  • Metrics 파드 설치 
  • AWS kOps에 Node local DNS cache 설정하기 
  • spec: kubeDNS: provider: CoreDNS nodeLocalDNS: enabled: true memoryRequest: 5Mi cpuRequest: 25m
  • Gossip DNS 로 AWS kOps 배포하기 
  • AWS kOps Audit Logging 설정하기 
  • AWS kOps Private Cluster 설정하기 
  • AWS kOps Rolling Updates 실행해보기
  • AWS kOps 인스턴스그룹에 spot 인스턴스 사용해보기
  • AWS kOps multiple master 설정하기
  • AWS kOps에 Karpenter 활용하기
  • Getting Started with kOps
  • AWS kOps의 ETCD 백업, 복구, 암호화 해보기
  • AWS kOps에 IRSA 설정하기
  • 기존에 존재하는 VPC 에 AWS kOps 클러스터 설치하기 

이중 워커 노드 증가(ASG = Auto Scaling Group 활용) 선택! 나머지는 추후 테스트 진행 후 업데이트 예정입니다! 

 

워커 노드 증가(ASG = Auto Scaling Group 활용) 

인스턴스 그룹 정보 확인

인스턴스 그룹 정보

 

kops edit 명령어를 통해 노드 갯수 편집

kops edit ig nodes-ap-northeast-2a
spec:
  maxSize: 3
  minSize: 2

 

kops edit ig <node> -  vi editor 편집화면

클러스터 업데이트 적용

kops update cluster --yes
kops rolling-update cluster

kops 클러스터 업데이트 적용

노드 갯수 증가 확인

kubectl get node

노드가 증가 되었는지 확인

 

실습 환경 삭제

어찌보면 실습에서 가장 중요한 부분 이라고 생각하는 리소스 삭제!

실습 종료후 반드시 사용한 리소스를 삭제하여 비용을 최소화 시키자!

 

kOps 클러스터 삭제

kops delete cluster --yes

클러스터 삭제 완료 확인 후 AWS CloudFormation 스택 삭제

aws cloudformation delete-stack --stack-name mykops
Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.