작년에 이어 Kubernetes 스터디에 참가하게 되었다.
연구 교재는 24단계 실습으로 정복하는 쿠버네티스사용합니다.
이 책의 저자가 서문에 말했듯이 실습으로 이해의 폭을 넓히는 과정은 정말 중요한 것 같다.
이 책은 쿠버네티스의 실습 중심에서 정말 깔끔하게 구성되어 있다.
이 기사는 스터디를 참가하면서 학습한 내용을 중심으로 Kubernetes를 정리하는 연재기사다.
스터디 진행에 맞춰 4~5개의 문장을 만들 예정이다.
이 기사에서는 Kubernetes의 개념과 설치, 기본적인 관리 방법을 배웁니다.
1. kOps로 Cluster 설치
kOps란?
kOps 공식 웹페이지그럼 Kubernetes 환경에서 Kubectl사용하는 경우 Cluster를 설치하고 관리할 때 kops를 사용하는 것이 좋습니다.
We like to think of it as kubectl for clusters.
클러스터용 kubectl이라고 생각하고 싶습니다.
kops는 프로덕션 수준의 고가용성 Kubernetes Cluster 생성, 파괴, 업그레이드, 유지 보수에 사용할 수 있습니다.
현재 AWS(Amazon Web Services)와 Google Cloud는 현재 공식적으로 지원되고 있으며 DigitalOcean, Hetzner 및 OpenStack은 베타 지원으로, Azure는 알파에서 지원되고 있다고 한다.
1.1. AWS kOps 아키텍처
연습의 클러스터에는 다음과 같은 아키텍처가 있습니다.
AWS Free Tier 계정, AdministratorAccess 정책이 부여된 IAM User 및 AWS Route53 도메인을 미리 준비합니다.
나는 ygpark.net이라는 도메인을 구입했습니다.
1.2. 기본 인프라 구축
스터디가 제공하는 cloudformation을 통해 기본 인프라 EC2 3대(t3.medium) 생성한다.
# yaml 파일 다운로드
curl -O https://s3.ap-northeast-2.amazonaws.com/cloudformation.cloudneta.net/K8S/kops-new-ec2.yaml
# 배포: 작업용 EC2 인스턴스를 생성한다.
# aws cloudformation deploy --template-file ~/Downloads/kops-new-ec2.yaml --stack-name mykops --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=ygpark 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
예시) 13.124.42.108
# kOps-ec2 에 SSH 접속
예시) ssh -i <My SSH Keyfile> [email protected]
ssh -i /mnt/c/vswork/_pkos2/secret/ygpark.pem ec2-user@$(aws cloudformation describe-stacks --stack-name mykops --query 'Stacks(*).Outputs(0).OutputValue' --output text)
AWS 콘솔에서 확인할 수 있습니다.
(설치 중 화면)
EC2에는 kops, aws CLI, SSH 키 등이 설치되어 있다.
1.3. kOps 클러스터 배포
위에서 만든 ec2에 성공적으로 연결되면 kOps로 클러스터를 배포해 봅시다.
우선, 미리 작성해 둔 administrator 권한을 가지는 IAM User 의 자격 증명 입력을 해, 버킷을 작성해 준다.
버킷에 k8s 구성 파일이 저장됩니다.
# 자격증명 입력
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
# 버킷 생성
REGION=ap-northeast-2 # 서울 리전 사용
# aws s3 mb s3://버킷<유일한 이름> --region <S3 배포될 AWS 리전>
aws s3 mb s3://ygpark --region $REGION
# 배포 시 참고할 정보를 환경 변수에 저장
## export NAME=<자신의 퍼블릭 호스팅 메인 주소>
## export KOPS_STATE_STORE=s3://(위에서 생성한 자신의 버킷 이름)
export KOPS_CLUSTER_NAME=ygpark.net
export KOPS_STATE_STORE=s3://ygpark
export AWS_PAGER=""
export REGION=ap-northeast-2
echo 'export AWS_PAGER=""' >>~/.bashrc
echo 'export REGION=ap-northeast-2' >>~/.bashrc
echo 'export KOPS_CLUSTER_NAME=ygpark.net' >>~/.bashrc
echo 'export KOPS_STATE_STORE=s3://ygpark' >>~/.bashrc
# kops Cluster 생성
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
Cluster의 구성은 CNI는 aws vpc cni를 사용, 마스터 노드 1대(t3.medium), 워커 노드 2대(t3.medium), 퍼드 사용 네트워크 대역 지정(172.30.0.0/16)이다.
클러스터가 모두 배포되면 콘솔에서도 인스턴스를 볼 수 있습니다.
# 클러스터 확인
kops get cluster
NAME CLOUD ZONES
ygpark.net aws ap-northeast-2a,ap-northeast-2c
2. kubectl CLI 환경 최적화
관리의 편의를 위해 kubectl completion, alias를 등록해 준다.
그리고 플러그인으로 kubectl을 확장해준다.
2.1. kubectl 자동 완성 기능, alias
source <(kubectl completion bash)
echo 'source <(kubectl completion bash)' >> ~/.bashrc
echo 'alias k=kubectl' >> ~/.bashrc
echo 'complete -F __start_kubectl k' >> ~/.bashrc
2.2. 플러그인으로 kubectl 확장
추천하는 플러그인에는 컨택 사용하는 kube-ctx, 네임스페이스의 선택, 확인에 kube-ns 이외에 df-pv get-all ktop neat oomd view-secret kube-ps1 등이 있다.
kubectl krew list에서 플러그인과 버전을 확인할 수 있습니다.
# 설치
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
/root/.krew/bin
└── kubectl-krew -> /root/.krew/store/krew/v0.4.3/krew
# PATH 추가
export PATH="${PATH}:/root/.krew/bin"
echo 'export PATH="${PATH}:/root/.krew/bin"' >>~/.bashrc
# krew 확인
kubectl krew
kubectl krew update
Updated the local copy of plugin index.
kubectl krew search
kubectl krew list
PLUGIN VERSION
krew v0.4.3
kubectl krew
3. ExternalDNS
ExternalDNS Addon을 설치하면 Kubernetes Service 또는 Ingress를 만들 때 Public Cloud DNS 서비스 – AWS(Route 53), Azure(DNS), GCP(Cloud DNS)에 자동으로 A 레코드를 등록/삭제합니다.
한마디로 대히트 기능, 번거로움이 완전히 줄어든다.
3.1 ExternalDNS Addon 설치
# 정책 생성 -> 마스터/워커노드에 정책 연결
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
Unknown output type: ygpark
# 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
# 설치
# 아래 spec 부분을 수정해서 Addon 추가
kops edit cluster
--------------------------
spec:
certManager:
enabled: true
externalDns:
provider: external-dns
--------------------------
apiVersion: kops.k8s.io/v1alpha2
kind: Cluster
metadata:
creationTimestamp: "2023-03-05T11:43:10Z"
name: ygpark.net
spec:
certManager:
enabled: true
externalDns:
provider: external-dns
api:
dns: {}
authorization:
rbac: {}
channel: stable
cloudProvider: aws
configBase: s3://ygpark/ygpark.net
etcdClusters:
...
# 업데이트 적용
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
3.2 mario 서비스에 대한 도메인 연결 연습
구입한 도메인에서 성공적으로 연결할 수 있는지 도메인 연결을 시도합니다.
# CLB에 ExternanDNS 로 도메인 연결
kubectl annotate service mario "external-dns.alpha.kubernetes.io/hostname=mario.$KOPS_CLUSTER_NAME"
service/mario annotated
# 확인
dig +short mario.$KOPS_CLUSTER_NAME
3.38.78.138
kubectl logs -n kube-system -l k8s-app=external-dns
time="2023-03-05T12:51:54Z" level=info msg="Desired change: CREATE a-kops-controller.internal.ygpark.net TXT (Id: /hostedzone/Z02152902Y86CY31OLIX5)"
time="2023-03-05T12:51:54Z" level=info msg="3 record(s) in zone ygpark.net. (Id: /hostedzone/Z02152902Y86CY31OLIX5) were successfully updated"
time="2023-03-05T12:51:54Z" level=info msg="All missing records are created"
time="2023-03-05T12:51:54Z" level=info msg="Applying provider record filter for domains: (ygpark.net. .ygpark.net.)"
time="2023-03-05T12:51:54Z" level=info msg="All records are already up to date"
time="2023-03-05T12:52:52Z" level=info msg="Applying provider record filter for domains: (ygpark.net. .ygpark.net.)"
time="2023-03-05T12:52:52Z" level=info msg="Desired change: CREATE cname-mario.ygpark.net TXT (Id: /hostedzone/Z02152902Y86CY31OLIX5)"
time="2023-03-05T12:52:52Z" level=info msg="Desired change: CREATE mario.ygpark.net A (Id: /hostedzone/Z02152902Y86CY31OLIX5)"
time="2023-03-05T12:52:52Z" level=info msg="Desired change: CREATE mario.ygpark.net TXT (Id: /hostedzone/Z02152902Y86CY31OLIX5)"
time="2023-03-05T12:52:52Z" level=info msg="3 record(s) in zone ygpark.net. (Id: /hostedzone/Z02152902Y86CY31OLIX5) were successfully updated"
# 웹 접속 주소 확인 및 접속
echo -e "Maria Game URL = http://mario.$KOPS_CLUSTER_NAME"
Maria Game URL = http://mario.ygpark.net
차잔!
# mario 삭제
kubectl delete deploy,svc mario
4. 리소스 삭제
– kOps 클러스터 삭제: `**kops delete cluster –yes`**
– (클러스터 삭제 완료 확인 후) AWS CloudFormation 스택 삭제: `**aws cloudformation delete-stack –stack-name mykops**`
# kOps 클러스터 삭제
kops delete cluster --yes
#(클러스터 삭제 완료 확인 후) AWS CloudFormation 스택 삭제
aws cloudformation delete-stack --stack-name mykops
5. Kubernetes 문제 해결
IaaS 환경의 Instance Managed Service를 문제 해결하면 일반적으로 Managed Service의 작업 절차에 따라 문제를 해결합니다.
마찬가지로 Kubernetes 작업 순서에 따라 Kubernetes 문제 해결을 수행할 수 있습니다.
Kubernetes 작업 순서
Apply → Get → Describe → Logs → Get Event
오류 상황이 발생한 경우 기본 조치 프로세스:
get 확인 → describe 확인 → 애플리케이션 로그(log) 확인 → 클러스터 오류 이벤트(event) 확인
learnk8s의 Kubernetes 배포 문제 해결에 대한 시각적 안내 기사에서는 Kubernetes 문제 해결의 어려움에 대한 해결책을 제시합니다.
Kubernetes 문제 해결은 어디서부터 시작해야 할지 모르는 경우 어려운 작업이 될 수 있습니다.
항상 상향식으로 문제에 액세스해야 함을 기억해야합니다.
포드부터 시작하여 서비스와 잉글스로 스택을 위로 이동합니다.
문제 해결은 상향식으로 포드에서 서비스 / 입구 방향으로 확인하자!
6. 끝
작년 Kubernetes를 배울 때 개념의 이해를 열심히 했다면, 올해는 실제의 운용 환경에서 사용할 수 있는 것을 명령을 사용해 보고 싶습니다.
아직 실습해 보지 않은 kOps 기능이 유감이다.
스터디 기간에 하나씩 실습해 볼 예정이다.
메모
- 24단계 실습으로 정복하는 쿠버네티스: https://ebook-product.kyobobook.co.kr/dig/epd/ebook/E000005050811
- PKOS – CloudNet@팀 연구 내용
- Kubernetes 배포 문제 해결에 대한 시각적 안내: https://learnk8s.io/troubleshooting-deployments
- kOps 공식 웹페이지: https://kops.sigs.k8s.io/