월루를 꿈꾸는 대학생

PKOS 1주차 본문

Server&Network/Kubernets_Dokcer

PKOS 1주차

하즈시 2023. 3. 12. 02:27
728x90

 

24단계 실습으로 정복하는 쿠버네티스책을 기준하여 정리하였습니다.

 

 

24단계 실습으로 정복하는 쿠버네티스 - YES24

실무 현장의 경험을 고스란히 담은 쿠버네티스 실습서!직접 해야만 알 수 있는 것들이 있다. 쿠버네티스도 마찬가지다. 쿠버네티스의 기반이 되는 컨테이너 기술은 기존의 가상 머신과 기본 전

www.yes24.com


 

aws kops 

- 쿠버네티스를 프로덕션에 준하게 지원하는 오픈소스 배포판 

- aws 여러 서비스와 연동이 가능 

- 기능 

  • 고가용성 Kubernetes 클러스터 프로비저닝 자동화
  • 스테이트 동기 모델을 기반으로 구축되어 드라이런 및 자동 아이돌 가능성 실현
  • Terraform 생성 기능
  • 제로 구성 관리 Kubernetes 애드온 지원
  • 명령줄 자동 완성
  • YAML 매니페스트 기반 API 설정
  • 매니페스트 작성을 위한 템플릿 및 시운전 모드
  • 가장 인기 있는 CNI 네트워킹 프로바이더에서 즉시 선택 가능
  • ARM64 지원으로 멀티 아키텍처 지원
  • 클러스터 매니페스트를 통해 컨테이너와 파일을 후크로 노드에 추가하는 기능

https://kubernetes.io/ko/docs/setup/production-environment/tools/kops/

 

Kops로 쿠버네티스 설치하기

이곳 빠른 시작에서는 사용자가 얼마나 쉽게 AWS에 쿠버네티스 클러스터를 설치할 수 있는지 보여준다. kops라는 이름의 툴을 이용할 것이다. kops는 자동화된 프로비저닝 시스템인데, 완전 자동화

kubernetes.io


구성도

- kops-ec2 : kops 배포 , kubectl 실행 

- 노드들은 오토스케일링 

 


환경구축

 

가시다님의 노션에서 링크 클릭후 cloudformation에서 환경구축 시작

프로비저닝용 ec2 하나 생성

 

kops 클러스터 관련 설정내용을 s3에 저장하고 이걸 이용해서 클러스터를 만듦

쿠버네티스 api주소도 route53이용해서 kops접근가능

 

쿠버네티스 클러스터 배포를 위해 아까 만들어둔 ec2에 접근후 다음과 같은 설정을 한다.

#iam 자격 증명을 통해 cli사용할 수 있도록 설정

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

https://docs.aws.amazon.com/ko_kr/powershell/latest/userguide/pstools-appendix-sign-up.html

 

AWS 계정 및 액세스 키 - AWS Tools for PowerShell

이 페이지에 작업이 필요하다는 점을 알려 주셔서 감사합니다. 실망시켜 드려 죄송합니다. 잠깐 시간을 내어 설명서를 향상시킬 수 있는 방법에 대해 말씀해 주십시오.

docs.aws.amazon.com

 

# s3 버킷 생성

[root@kops-ec2 ~]# aws s3 mb s3://hazu-pkos --region ap-northeast-2
make_bucket: hazu-pkos

 

# 배포시 사용할 정보 환경변수에 저장

export AWS_PAGER=""
export REGION=ap-northeast-2
export KOPS_CLUSTER_NAME=[도메인]
export KOPS_STATE_STORE=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://[버킷명]' >>~/.bashrc

 

# 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" -y

error creating VPC: VpcLimitExceeded: The maximum number of VPCs has been reached.

갑자기 저런 에러가 나올 수가 있는데 찾아보니 vpc는 5개까지 밖에 못 만들어서 나온 에러였다..

이미 vpc를 5개 사용하고 있어서 삭제해주고 기다리면 다시 만들어 진다

 

 

kops배포시 자동으로 route53에 쿠버네티스 클러스터 api주소를 내 도메인 a레코드로 설정시켜줌

 

 

만들어 진 거 확인

 

 

다른 명령어 실행시켜 보니까 안 됨..

생각해보니 route53 api도 ip가 변경 안 되고 203.0.113.123 그대로 ....

슬랙을 보니 기다리면 되는 경우가 있어서 기다려봄

30분째 ip가 변하질 않는중...

 

 

슬랙에 여쭤보니 이미 같은 이슈를 겪은 분이 해결해서 올린 걸 발견

너무 감사하게도 덕분에 해결 완료

https://medium.com/techblog-hayleyshim/k8s-kubernetes-operations-kops-install-in-aws-c0dc460343cf

 

[k8s] Kubernetes Operations (kOps) Install in AWS

안녕하세요. CloudNet@ K8S Study를 진행하며 해당 내용을 이해하고 공유하기 위해 작성한 글입니다. DevOps 이정훈님의 도서 ‘24단계 실습으로 정복하는 쿠버네티스’ 의 내용을 바탕으로 스터디를

medium.com

 

근데 나 같이 cafe24로 도메인 구매한 사람은 먼가 자꾸 네임서버 변경이 안 된다고 하고 오류가 자꾸 뜸

새벽에 해서 그런가 해서 다시 낮에 해봐도 똑같이 뜨는 이건 뭘까?

 

포기하고 route53에 도메인 구매후 네임서버 연동

 

 

일단 다시 확인해보니 요렇게 됨 아직 ip 가 바뀌지 않아서 그런듯

 

다시 기다려봄

 

드디어 확인 완료

 

확인

 

 

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

--

# 설치
kubectl krew install ctx

# 컨텍스트 확인
kubectl ctx

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

--
# 설치
kubectl krew install df-pv get-all ktop neat oomd view-secret # mtail tree

# get-all 사용
kubectl get-all
kubectl get-all -n kube-system

# ktop 사용
kubectl ktop

# oomd 사용
kubectl oomd

# df-pv 사용
kubectl df-pv

# view-secret 사용 : 시크릿 복호화
kubectl view-secret


CLB 배포 테스트

 

# 수퍼마리오 디플로이먼트 배포
curl -s -O https://raw.githubusercontent.com/gasida/PKOS/main/1/mario.yaml
kubectl apply -f mario.yaml
cat mario.yaml | yh

# 배포 확인 : CLB 배포 확인 >> 5분 이상 소요
kubectl get deploy,svc,ep mario
watch kubectl get svc mario

# 마리오 게임 접속 : CLB 주소로 웹 접속
kubectl get svc mario -o jsonpath={.status.loadBalancer.ingress[0].hostname} | awk '{ print "Maria URL = http://"$1 }'

알아서 clb 로드벨런서 만들어서 배포해줌

 

 


 

kops의 경우 addon 기능을 제공해서 간편하게 external dns 설치가 가능

# 모니터링
watch -d kubectl get pod -A

# 정책 생성 -> 마스터/워커노드에 정책 연결
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

# 설치
kops edit cluster
--------------------------
spec:
  certManager:    # 없어도됨!
    enabled: true # 없어도됨!
  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
NAME                            READY   STATUS    RESTARTS   AGE
external-dns-66969c4497-wbs5p   1/1     Running   0          8m53s

 

# 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"


 

트러블 슈팅

 

잘못된 파드 배포

describe 명령어로 에러 확인

 

1.19.19 버전이 잘못된거 같음

컨테이너 버전을 봐도 1.19.19 버전은 없음

https://hub.docker.com/_/nginx/tags?page=4 

 

nginx Tags | Docker Hub

 

hub.docker.com

 


워커 노드 증가 확인

# EC2 인스턴스 모니터링
while true; do aws ec2 describe-instances --query "Reservations[*].Instances[*].{PublicIPAdd:PublicIpAddress,InstanceName:Tags[?Key=='Name']|[0].Value,Status:State.Name}" --output text | sort; echo "------------------------------" ;date; sleep 1; done

# 인스턴스그룹 정보 확인
kops get ig

# 노드 추가
kops edit ig nodes-ap-northeast-2a --set spec.minSize=2 --set spec.maxSize=2

# 적용
kops update cluster --yes && echo && sleep 3 && kops rolling-update cluster

# 워커노드 증가 확인
while true; do kubectl get node; echo "------------------------------" ;date; sleep 1; done

 


 

최대 파드 생성 확인

- 노드 당 정해진 최대 pod갯수가 있음

- 즉 그 이상으로 pod를 배포할 경우 제대로 배포가 안 됨

너무 많은 파드를 배포하여 pending 걸리는 거 확인 노드 2개에 다 할당을 못함

 

 

 

728x90

'Server&Network > Kubernets_Dokcer' 카테고리의 다른 글

PKOS 3주차 GitOps  (0) 2023.03.26
PKOS 2주차  (1) 2023.03.19
로컬에서 k8s 구축하기  (1) 2023.03.04
쿠버네티스 API 개념 및 보안 내용 정리  (0) 2022.03.14
CoreDNS & Service (MetalLB)  (0) 2022.02.20