AWS환경에서 쿠버네티스를 설치하여 스터디합니다.
kOps툴로 쿠버네티스 설치하고 공부해보자.
Kops는 온프라미스와 AWS에 모두 쿠버네티스를 설치할수 있다.
아래 내용은 24단계 실습으로 정복하는 쿠버네티스 책 (이정훈 님 지음)과 [CloudNet@] Production Kubernetes Online Study (=PKOS) 2기 스터디를 하며, 해당 내용을 참고하여 작성되었습니다.
쿠버네티스 스터디입니다. Amazon EKS가 아닙니다.
정리
실습 구성도
사전 준비와 절차
도메인을 미리 하나 구매, route53에 설정 필요
EC2 키페어 생성
IAM Access-key/Secret-key 생성
CloudFormation으로 kops가 설치된 EC2생성
AWS configure로 권한 설정
EC2에 kops와 kubectl등 유틸 설치
EC2에 로그온해 kOps로 AWS에 쿠버네티스 설치
게임 서비스 올리기
목차
<1> 쿠버네티스 실습 구성도와 실습 과정
<2> cloudformation으로 kops 가 설치된 EC2 생성(필수)
<3> aws route53에서 도메인 하나 구매 - 30분 걸린다.(필수)
<4> kops로 k8s 클러스터를 생성(필수)
<5> k8s 설정 파일을 s3에 저장(필수)
<6> 도메인은 퍼블릭 도메인(필수)
<7> 설치 실패 시 삭제 방법
<8> 툴 설치와 사용 = CLI 플러그인 매니저, 쿠버네티스 크루(krew) 설치
<9> 슈퍼마리오 디플로이먼트 배포
<10> 멱등성 테스트 (선택)
<11> ExternalDNS (선택)
<12> 트러블 슈팅 = 에러 발생시 기본 조치 프로세스
<13> 장애 사례 처리 예시 : 노드의 사용 가능한 디스크 용량이 부족한 경우
<14> Helm
<15> 노드 최대 파드 배포 이해
<16> 워커 노드 증가(ASG = Auto Scaling Group 활용
<17> 모니터링 대시보드
<18> kops로 클러스터 삭제
<19> 정리
<1> 쿠버네티스 실습 구성도와 실습 과정
1
실습 구성도
실습 과정
cloudformation으로 kops 가 설치된 ec2 생성 = kops-ec2
aws route53에서 도메인 하나 구매 - 30분 걸린다.
k8s 설정 파일을 s3에 저장
kops로 k8s 클러스터를 생성
kops-ec2 역할 : kOps 배포 수행, kubectl 명령 실행 등
마스터 노드와 워커 노드는 EC2 Auto Scaling Group(=ASG) 설정으로 구성
도메인은 퍼블릭 도메인
2
조타수 사용하기
3
쿠버네티스 개요
컨트롤 플래인과 워커 노드
4
개발자 제어는 컨트롤 플래인의 API Server를 통해 제어한다.
5
인터넷 사용자의 파드 접속 경로
인터넷 사용자 -서비스 (로드밸런서)-------파드(컨테이너)
6
kOps 란?
kOps는 클라우드 플랫폼(aws, gcp, azure 등)에서 쉽게 k8s 를 설치할 수 있도록 도와주는 도구
kOps는 서버 인스턴스와 네트워크 리소스 등을 클라우드에서 자동으로 생성해 k8s 를 설치
Kubernetes Operations(kOps) - Production Grade k8s Installation, Upgrades and Management
kOps 사용자는 Kubernetes가 지원하는 3가지 부 버전 중 하나를 실행하는 것이 좋습니다 .
https://kubernetes.io/releases/version-skew-policy/#supported-versions
현재 kOps 최신버전
https://kops.sigs.k8s.io/welcome/releases/
https://kops.sigs.k8s.io/releases/1.26-notes/
7
절차
CloudFormation으로 EC2 하나 생성하자.
해당 EC2에서 kops로 쿠버네티스 클러스터를 만들어보자.
EC2 키페어 필요 = EC2 접속을 위한 키페어 하나 필요
Access-Key/Secret-Key 필요 (Admin권한이다. 쿠버네티스를 만들려면 권한이 필요하다)
클라우드 포메이션으로 ec2 만듬.
Kops로 쿠버네티스를 생성한다.
<2> cloudformation으로 kops 가 설치된 EC2 생성(필수)
1
일반 콘솔 계정 생성? (선택)
https://console.aws.amazon.com/console/home
iam계정 1개 생성
콘솔 사용자 계정 생성 후, access-key와 secret key 생성해야 한다.
사용자 생성
Command Line Interface(CLI) 만든다.
.csv 파일 다운로드 하기
access-key와 secret-key를 노트패드에 복사해 놓는다.
3
EC2 키페어 하나 생성하자.
클라우드 포메이션으로 ec2 1대 만들 때 서버 접속을 위한 키페어가 필요함.
4
클라우드 포메이션으로 ec2 1대 생성하자
CidrBlock: 10.0.0.0/16
CidrBlock: 10.0.0.0/24
Type: AWS::EC2::Instance 1개
각종 유틸 모두 포함
또는
7
생성확인 ?
VPC 1개 = CidrBlock: 10.0.0.0/16
Public sunet 1개 = CidrBlock: 10.0.0.0/24
명령 내릴 EC2 1개 확인
# 클라우드 포메인션 내용.
Resources:
MyVPC:
Type: AWS::EC2::VPC
Properties:
EnableDnsSupport: true
EnableDnsHostnames: true
CidrBlock: 10.0.0.0/16
RouteTableId: !Ref MyPublicRT
DestinationCidrBlock: 0.0.0.0/0
GatewayId: !Ref MyIGW
MyPublicSN:
Type: AWS::EC2::Subnet
Properties:
VpcId: !Ref MyVPC
AvailabilityZone: !Select [ 0, !GetAZs '' ]
CidrBlock: 10.0.0.0/24
Tags:
- Key: Name
Value: My-Public-SN
CidrIp: !Ref SgIngressSshCidr
KOPSEC2:
Type: AWS::EC2::Instance
Properties:
InstanceType: t2.micro
ImageId: !Ref LatestAmiId
AssociatePublicIpAddress: true
PrivateIpAddress: 10.0.0.10
UserData:
Fn::Base64:
!Sub |
#!/bin/bash
hostnamectl --static set-hostname kops-ec2
# Change Timezone
ln -sf /usr/share/zoneinfo/Asia/Seoul /etc/localtime
# Install Packages
cd /root
yum -y install tree jq git htop
curl -LO "https://dl.k8s.io/release/$(curl -L -s https://dl.k8s.io/release/stable.txt)/bin/linux/amd64/kubectl"
install -o root -g root -m 0755 kubectl /usr/local/bin/kubectl
curl -Lo kops https://github.com/kubernetes/kops/releases/download/$(curl -s https://api.github.com/repos/kubernetes/kops/releases/latest | grep tag_name | cut -d '"' -f 4)/kops-linux-amd64
chmod +x kops
mv kops /usr/local/bin/kops
curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip"
unzip awscliv2.zip
또는
수동으로 설치
8
CLI로 클라우드포메이션을 실행기켜 네트워크와 EC2 1대를 생성하는 법도 있다.
PC에서 CLI로 kops 가 설치된 EC2 생성해보자
1)
# yaml 파일 다운로드
curl -O https://s3.ap-northeast-2.amazonaws.com/cloudformation.cloudneta.net/K8S/kops-new-ec2.yaml
2)
# 배포
# 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=kp-gasida SgIngressSshCidr=$(curl -s ipinfo.io/ip)/32 --region ap-northeast-2
3)
# CloudFormation 스택 배포 완료 후 EC2 IP 출력
aws cloudformation describe-stacks --stack-name mykops --query 'Stacks[*].Outputs[*].OutputValue' --output text
예시) 3.35.137.31
4)
# kOps-ec2에 SSH 접속
예시) ssh -i <My SSH Keyfile> ec2-user@3.35.137.31
ssh -i ~/.ssh/kp-gasida.pem ec2-user@$(aws cloudformation describe-stacks --stack-name mykops --query 'Stacks[*].Outputs[0].OutputValue' --output text)
9
정리
EC2 키페어 1개 미리 만들기
CloudFormation 실행시킴
결과는 EC2 1개 생성= 확인
서버에 접속 확인
kops version
Client version: 1.28.2 (git-v1.28.2)
여기까지 잘 되었나요?
<3> aws route53에서 도메인 하나 구매 - 30분 걸린다.(필수)
1
도메인 하나 구매해 사용 (구매하는데 30분 걸린다)
또는
기존 도메인에서 하위 도메인 하나 cname 위임받아 사용.
예) game.serverup11.com 을 aws에 세팅, 나온 네임 서버를 기존 네임서버에서 cname으로 위임해 사용해도 된다.
2
도메인 하나 구매해 사용
1년에 5달러 (7,228원)
등록된 카드로 바로 빠져나간다.
크레디트로 사용은 안된다.
3
AWS에서 도메인 구매하면, 처음은 route53 호스트 영역에 자동 설정 된다.
삭제후 재 생성시는 네임서버를 도메인 등록 기관에 재 설정해야 한다.
4
등록 후 메일 수신 확인하여 링크 클릭으로 확인을 꼭 해줘야 한다.
<4> kops로 k8s 클러스터를 생성(필수)
1
kOps(Kubernetes Operations) ?
클라우드 플랫폼(aws, gcp, azure 등)에서 쉽게 k8s를 설치할 수 있도록 도와주는 도구
2
ec2에 로그인
# 자격 구성 설정 하기
# IAM User 자격 구성 : 실습 편리를 위해 administrator 권한을 가진 IAM User의 자격 증명 입력
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]:
# 권한을 할당 받는 법은 access-key/ Secret-key를 사용하는 방법과 role을 만들어 EC2에 할당하는 방법 2가지가 있다.
# 자격 구성 적용 확인 : 노드 IP 확인
aws s3 ls
aws ec2 describe-instances
access-key 재 설정할 경우
rm -rf /root/.aws/credentials
참고
3.
# 기본 툴 및 SSH 키 설치 등 확인
kubectl version --client=true -o yaml | yh
gitVersion: v1.26.2
kops version
Client version: 1.25.3 (git-v1.25.3)
aws --version
aws-cli/2.11.0 Python/3.11.2 Linux/4.14.305-227.531.amzn2.x86_64 exe/x86_64.amzn.2 prompt/off
4
환경 설정
# aws cli 페이지 출력 옵션
페이저 없이 API 실행결과가 출력됩니다
export AWS_PAGER=""
# 리소스를 배치할 리전이름을 변수 지정
REGION=ap-northeast-2
# 서울 리전
5
# k8s 설정 파일이 저장될 버킷 생성
## aws s3 mb s3://버킷<유일한 이름> --region <S3 배포될 AWS 리전>
aws s3 mb s3://master-seo-bk1 --region $REGION
aws s3 mb s3://topas1102-s3-bucket1 --region $REGION
6
# 배포 시 참고할 정보를 환경 변수에 저장
## export NAME=<자신의 퍼블릭 호스팅 메인 주소>
export KOPS_CLUSTER_NAME=<자신의 퍼블릭 호스팅 메인 주소>
export KOPS_STATE_STORE=<s3://(위에서 생성한 자신의 버킷 이름)>
export AWS_PAGER=""
export REGION=ap-northeast-2
실행
export AWS_PAGER=""
export REGION=ap-northeast-2
export KOPS_CLUSTER_NAME=taho11.co.kr
export KOPS_STATE_STORE=s3://topas1102-s3-bucket1
echo 'export AWS_PAGER=""' >>~/.bashrc
echo 'export REGION=ap-northeast-2' >>~/.bashrc
echo 'export KOPS_CLUSTER_NAME=taho11.co.kr' >>~/.bashrc
echo 'export KOPS_STATE_STORE=s3://topas1102-s3-bucket1' >>~/.bashrc
// aws route53에서 masterseo0.link 도메인 구매 , 1년에 5달러.
// Cluster Name must be a fully-qualified DNS name (e.g. --name=mycluster.myzone.com)
7
# 옵션
다른 터미널에서 생성 모니터링.
# kops 설정 파일 생성(s3) 및 k8s 클러스터 배포 : 6분 정도 소요
## CNI는 aws vpc cni 사용, 마스터 노드 1대(t3.medium), 워커 노드 2대(t3.medium), 파드 사용 네트워크 대역 지정(172.30.0.0/16)
## --container-runtime containerd --kubernetes-version 1.24.0 ~ 1.25.6
[새 터미널1] Kops로 쿠버네티스 생성시 EC2 생성 모니터링
while true; do aws ec2 describe-instances --query "Reservations[*].Instances[*].{PublicIPAdd:PublicIpAddress,InstanceName:Tags[?Key=='Name']|[0].Value,Status:State.Name}" --filters Name=instance-state-name,Values=running --output text ; echo "------------------------------" ; sleep 1; done
------------------------------
kops-ec2 13.209.20.102 running
------------------------------
kops-ec2 13.209.20.102 running
------------------------------
kops-ec2 13.209.20.102 running
8
dry-run으로 사전 테스트
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.28.0" --dry-run -o yaml > mykops.yaml
9
생성
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.28.0" -y
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.12" -y
kops create cluster --zones="$REGION"a,"$REGION"c -
클러스터 생성은 리전 a와 c에 한다.
-networking amazonvpc
네트워크는 아마전 vpc에 한다. 칼리코등 다른 것도 있다.
--cloud aws
클라우드는 aws에 한다.
--master-size t3.medium
마스터는 사양
--node-size t3.medium
노드 사양
--node-count=2
노드 2대
--network-cidr 172.30.0.0/16
vpc네트워크
--ssh-public-key ~/.ssh/id_rsa.pub
키를 사용
--name=$KOPS_CLUSTER_NAME
클러스터 이름
--kubernetes-version "1.24.12" -y
6분 정도 소요
모니터링에서 서버 생성
콘솔에서 인스턴스 생성확인
10
혹, 생성을 잘못 했다면 지우고 다시 생성
kops delete cluster --yes
11
node 생성 모니터링
kops validate cluster --wait 10m
생성 완료 되면 아래처럼 나온다.
NODE STATUS
NAME ROLE READY
i-0670e7000d8e3c14c node True
i-08679f31573e8ca3a control-plane True
i-0c570795ec5b1f7a1 node True
Your cluster masterseo1.link is ready
12
node 생성 후 확인
kubectl get nodes
node 2대와 컨트롤 플래인 1대가 생성되었다!!!!
NAME STATUS ROLES AGE VERSION
i-0670e7000d8e3c14c Ready node 4m2s v1.24.12
i-08679f31573e8ca3a Ready control-plane 6m47s v1.24.12
i-0c570795ec5b1f7a1 Ready node 4m42s v1.24.12
여기까지 되었나요??
<5> k8s 설정 파일을 s3 에 저장과 확인
1
콘솔로 로그온해서 s3 버킷 확인
2
# 확인
1
kops get cluster
NAME CLOUD ZONES
masterseo1.link aws ap-northeast-2a,ap-northeast-2c
2
kops get instances
ID NODE-NAME STATUS ROLES STATE INTERNAL-IP INSTANCE-GROUP MACHINE-TYPE
i-00ab1b9ae91ffde16 i-00ab1b9ae91ffde16 UpToDate master 172.30.56.117 master-ap-northeast-2a.masters.masterseo1.link t3.medium
i-0413db6a78f715740 i-0413db6a78f715740 UpToDate node 172.30.86.251 nodes-ap-northeast-2c.masterseo1.link t3.medium
i-0b81c1e0af2f4d747 i-0b81c1e0af2f4d747 UpToDate node 172.30.51.83 nodes-ap-northeast-2a.masterseo1.link t3.medium
3
kubectl get nodes -v6
I0115 11:11:59.450632 7891 loader.go:395] Config loaded from file: /root/.kube/config
I0115 11:11:59.473119 7891 round_trippers.go:553] GET https://api.masterseo0.link/api/v1/nodes?limit=500 200 OK in 12 milliseconds
NAME STATUS ROLES AGE VERSION
i-01b493527fe0541ba Ready control-plane 7m36s v1.28.0
i-0659d01828755e6d8 Ready node 3m44s v1.28.0
i-0add68f853b55900e Ready node 4m5s v1.28.0
/root/.kube/config - 사용자 인증 정보
4
마스터 노드와 워커 노드는 EC2 Auto Scaling Group(=ASG) 설정으로 구성되어 있다.(선택)
콘솔로 확인
EC2 확인
마스터와 워커노드 모두 Auto Scaling Group 으로 관리되고 있다. (EC2 삭제시 다시 생성됨)
<6> 도메인은 퍼블릭 도메인(필수)
1
콘솔로 확인
Route53
A레코더 3개가 생겼다.
<7> 설치 실패시 삭제 방법
1. EC2 Auto Scaling 그룹 : 3개 삭제
2. EC2 시작 템플릿 Launch Templates : 3개 삭제
3. S3 버킷 비우기
4. Route53에 추가된 A 레코드 3개 삭제
5. CloudFormation 삭제
<8> 툴 설치와 사용 = CLI 플러그인 매니저, 쿠버네티스 크루(krew) 설치
각종 tool을 설치해 유용하게 사용해 보자.
1
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
재 로그인
k get nodes
NAME STATUS ROLES AGE VERSION
i-002186eeab26ccd9a Ready node 27m v1.24.10
i-00d730519589b5519 Ready control-plane 29m v1.24.10
i-0c3ef584d2e10254b Ready node 27m v1.24.10
2
krew ?
kubectl cli 플러그인 매니저, 쿠버네티스 크루(krew) 설치
macOS의 brew, Ubuntu의 apt와 비슷한 역할
Krew를 통해 현재 90가지 이상의 플러그인 1을 설치할 수 있다.
# 설치
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 update
kubectl krew search
kubectl krew list
kubectl krew install pluginxxxxxx
3
krew로 kube-ctx, kube-ns 설치 및 사용
kube-ctx : 쿠버네티스 콘텍스트 사용
# 설치
kubectl krew install ctx
# 콘텍스트 확인
kubectl ctx
masterseo1.link
# 콘텍스트 사용
kubectl ctx <각자 자신의 콘텍스트 이름>
4
kube-ns : 네임스페이스(단일 클러스터 내에서 가상 클러스터) 사용
# 설치
kubectl krew install ns
# 네임스페이스 확인
k ns
[root@kops-ec2 ~]# kubectl ns
default
kube-node-lease
kube-public
kube-system
# 터미널 1
watch kubectl get svc,pod
# kube-system 네임스페이스 선택 사용
kubectl ns kube-system
# default 네임스페이스 선택 - 디폴트로 변경.
kubectl ns -
혹은
kubectl ns default
설치된 리스트 확인
[root@kops-ec2 ~]# kubectl krew list
PLUGIN VERSION
ctx v0.9.4
krew v0.4.3
ns v0.9.4
5
krew로 기타 플러그인 설치 및 사용 : df-pv get-all ktop neat oomd view-secret
# 설치
kubectl krew install df-pv get-all ktop neat oomd view-secret
# get-all 사용
kubectl get-all -n kube-system
kubectl get-all
# ktop 사용
리소스 사용량을 볼수 있다!!
kubectl ktop
# oomd 사용
kubectl oomd
No out of memory pods found in default namespace.
# df-pv 사용 - 스토리지 정보 확인
kubectl df-pv
INFO[2023-03-13T19:22:57+09:00] Either no volumes found in namespace/s: 'all' or the storage provisioner used for the volumes does not publish metrics to kubelet
# view-secret 사용 : 시크릿 복호화
kubectl view-secret
6
kube-ps1
프롬프트에 Context와 Namespace를 표시 (선택)
# 설치 및 설정
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
sudo su -
# default 네임스페이스 선택
k ns default
(⎈|masterseo0:default) [root@kops-ec2 ~]#
Active namespace is "default".
7
# 자신의 도메인 변수 지정 : 소유하고 있는 자신의 도메인을 입력하시면 됩니다
MyDomain=<자신의 도메인>
MyDomain=masterseo0.link
# 자신의 Route 53 도메인 ID 조회 및 변수 지정
aws route53 list-hosted-zones-by-name --dns-name "${MyDomain}." | jq
aws route53 list-hosted-zones-by-name --dns-name "${MyDomain}." --query "HostedZones[0].Name"
aws route53 list-hosted-zones-by-name --dns-name "${MyDomain}." --query "HostedZones[0].Id" --output text
MyDnzHostedZoneId=`aws route53 list-hosted-zones-by-name --dns-name "${MyDomain}." --query "HostedZones[0].Id" --output text`
echo $MyDnzHostedZoneId
# A 레코드 타입 조회
aws route53 list-resource-record-sets --hosted-zone-id "${MyDnzHostedZoneId}" --query "ResourceRecordSets[?Type == 'A']" | jq
aws route53 list-resource-record-sets --hosted-zone-id "${MyDnzHostedZoneId}" --query "ResourceRecordSets[?Type == 'A'].Name" | jq
aws route53 list-resource-record-sets --hosted-zone-id "${MyDnzHostedZoneId}" --query "ResourceRecordSets[?Type == 'A'].Name" --output text
# A 레코드 값 반복 조회
while true; do aws route53 list-resource-record-sets --hosted-zone-id "${MyDnzHostedZoneId}" --query "ResourceRecordSets[?Type == 'A']" | jq ; date ; echo ; sleep 1; done
8
API Server IP 정보 확인 - 디폴트로 제공 되는 IP가 변경된다.
[root@kops-ec2 ~]# dig +short api.masterseo0.link
52.78.141.166
<9> 슈퍼마리오 디플로이먼트 배포
1
curl -s -O https://raw.githubusercontent.com/gasida/PKOS/main/1/mario.yaml
kubectl apply -f mario.yaml
cat mario.yaml | yh
apiVersion: apps/v1
kind: Deployment
metadata:
name: mario
labels:
app: mario
spec:
replicas: 1
selector:
matchLabels:
app: mario
template:
metadata:
labels:
app: mario
spec:
containers:
- name: mario
image: pengbai/docker-supermario
---
apiVersion: v1
kind: Service
metadata:
name: mario
spec:
selector:
app: mario
ports:
- port: 80
protocol: TCP
targetPort: 8080
type: LoadBalancer
// 따로 LoadBalancer 타입을 상세 지정하지 않으면, Classic LoadBalancer가 생성된다.
AWS Console에서 확인 가능하다.
2
다른 터미널에서 모니터링
watch kubectl get svc mario
3
# 배포 확인 : CLB 배포 확인 >>
5분 이상 소요
kubectl get deploy,svc,ep mario
(⎈|masterseo0:default) [root@kops-ec2 ~]# kubectl get deploy, svc, ep mario
NAME READY UP-TO-DATE AVAILABLE AGE
deployment.apps/mario 1/1 1 1 2 m57 s
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/mario LoadBalancer 100.70.19.159 afa3a47950a5e44758a552c9877aea2a-1768875087.ap-northeast-2.elb.amazonaws.com 80:31369/TCP 2m57s
NAME ENDPOINTS AGE
endpoints/mario 172.30.51.237:8080 2m56s
4
명령을 내리는 과정.
디플로이먼트 생성 , 리플리카셋 생성 , 파드 생성, 컨테이너 생성
LoadBalancer 확인하기
watch -d kubectl get deploy,rs,pods,svc
5
ELB 생성 확인
해당 IP로 서비스 접속하기
6
# 마리오 게임 접속 : CLB 주소로 웹 접속
kubectl get svc mario -o jsonpath={.status.loadBalancer.ingress[0].hostname} | awk '{ print "Maria URL = http://"$1 }'
Maria URL = http://a5e0231e1680b4178a2fdbb7c52ff386-371188548.ap-northeast-2.elb.amazonaws.com
7
확장
kubectl scale deployment mario --replicas=2
8
삭제 테스트
kubectl delete pod 파드명
삭제 되었나요 ?
9
삭제
디플로이 먼트로 삭제
k delete deployment.apps/mario
deployment.apps "mario" deleted
서비스 삭제
k delete svc mario
service "mario" deleted
여기까지 잘 되었나요?
<10> 멱등성 테스트 - 선택
기존 Pod 수를 유지하려는 것
선언적 구성
원하는 상태와 일치 하도록 만들고, 장애가 발생하더라도 그 상태를 유지하는 구성.
원하는 상태(쿠버네티스 오브젝트) ? pod 3개
현재 상태?
쿠버네티스 컨트롤 플래인 - 액션 함.
1
# 터미널 1 (모니터링)
watch -d 'kubectl get deploy,rs,pod'
2
# 터미널 2
kubectl create namespace my-webs
k ns my-webs
# Deployment 배포(Pod 3개)
kubectl create deployment my-webs --image=gcr.io/google-samples/kubernetes-bootcamp:v1 --replicas=3
kubectl get pod -w
# 파드 증가 및 감소
kubectl scale deployment my-webs --replicas=4
kubectl scale deployment my-webs --replicas=6 && kubectl get pod -w
kubectl get pod
# 강제로 파드 삭제
kubectl delete pod --all && kubectl get pod -w
kubectl get pod
pod가 지워지고 다시 생겨난다.
3
# 실습 완료 후 Deployment 삭제
kubectl delete deploy my-webs
여기까지 이해 되시나요?
<11> ExternalDNS (선택)
kops이용해서 K8S 서비스/인그레스 생성 시 도메인을 설정하면, AWS(Route 53), Azure(DNS), GCP(Cloud DNS)에 A 레코드(TXT 레코드)로 자동 생성/삭제 하기
위에서 mario 서비스가 설치된 상태에서 실습한다.
1
# 모니터링
watch -d kubectl get pod -A
or
watch -d 'kubectl get deploy,rs,svc,pod'
2
# 정책 생성 -> 마스터/워커노드에 정책 연결
iam > 정책 > AllowExternalDNSUpdates 정책이 있다.
route53 업데이트 권한이 들어가 있다.
echo $KOPS_CLUSTER_NAME
export KOPS_CLUSTER_NAME=masterseo0.link
정책 생성
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
// External DNS 컨트롤 Pod가 Route53에 명령을 줄수 있어야 한다.
Route53에 레코더를 추가해야 하니까~
참고
externaldns-aws-r53-policy.json
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"route53:ChangeResourceRecordSets"
],
"Resource": [
"arn:aws:route53:::hostedzone/*"
]
},
{
"Effect": "Allow",
"Action": [
"route53:ListHostedZones",
"route53:ListResourceRecordSets"
],
"Resource": [
"*"
]
}
]
}
# ACCOUNT_ID 변수 지정
export ACCOUNT_ID=$(aws sts get-caller-identity --query 'Account' --output text)
3
master, node ec2 둘다 정책 연결
# 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
4
# 설치
kops edit cluster
--------------------------
spec:
externalDns:
provider: external-dns
--------------------------
# 업데이트 적용
kops update cluster --yes && echo && sleep 3 && kops rolling-update cluster
5
# 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
6
# 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
time="2023-03-14T01:29:29Z" level=info msg="All records are already up to date"
time="2023-03-14T01:30:11Z" level=info msg="Applying provider record filter for domains: [masterseo0.link. .masterseo0.link.]"
time="2023-03-14T01:30:11Z" level=info msg="Desired change: CREATE cname-mario.masterseo0.link TXT [Id: /hostedzone/Z07945364AOETW5HEWKP]"
time="2023-03-14T01:30:11Z" level=info msg="Desired change: CREATE mario.masterseo0.link A [Id: /hostedzone/Z07945364AOETW5HEWKP]"
time="2023-03-14T01:30:11Z" level=info msg="Desired change: CREATE mario.masterseo0.link TXT [Id: /hostedzone/Z07945364AOETW5HEWKP]"
time="2023-03-14T01:30:11Z" level=info msg="3 record(s) in zone masterseo0.link. [Id: /hostedzone/Z07945364AOETW5HEWKP] were successfully update
time="2023-03-14T01:31:11Z" level=info msg="Applying provider record filter for domains: [masterseo0.link. .masterseo0.link.]"
time="2023-03-14T01:31:11Z" level=info msg="All records are already up to date"
time="2023-03-14T01:32:12Z" level=info msg="Applying provider record filter for domains: [masterseo0.link. .masterseo0.link.]"
time="2023-03-14T01:32:12Z" level=info msg="All records are already up to date"
7
# 웹 접속 주소 확인 및 접속
echo -e "Maria Game URL = http://mario.$KOPS_CLUSTER_NAME"
Maria Game URL = http://mario.masterseo0.link
확인
dns 전파 확인 사이트
mario.masterseo0.link 에 대해 ip 룩업 되는지 확인
https://www.whatsmydns.net/
https://dnschecker.org/
8
접속 확인
http://mario.masterseo0.link
게임 사이트가 뜬다 ~~ ^^
9
# 도메인 체크
echo -e "My Domain Checker = https://www.whatsmydns.net/#A/mario.$KOPS_CLUSTER_NAME"
My Domain Checker = https://www.whatsmydns.net/#A/mario.masterseo0.link
10
콘솔 route53 에서 A레코드들 확인
11
삭제
디플로이 먼트와 서비스를 지우면 된다.
kubectl delete deploy,svc mario
deployment.apps "mario" deleted
12
(선택)
다른 서비스 External DNS 설정하기.
예) Tetris 경우
// <13> ExternalDNS (선택) 참고
kubectl create namespace tetris
k ns tetris
:
kubectl annotate service tetris "external-dns.alpha.kubernetes.io/hostname=tetris.$KOPS_CLUSTER_NAME"
dig +short tetris.$KOPS_CLUSTER_NAME
echo -e "tetris Game URL = http://tetris.$KOPS_CLUSTER_NAME"
(⎈|masterseo1:default) [root@kops-ec2 ~]# echo -e "tetris Game URL = http://tetris.$KOPS_CLUSTER_NAME"
tetris Game URL = http://tetris.masterseo1.link
13
서비스 동작과 삭제
삭제시 디플로이먼트와 서비스 2개를 지워야 한다.
(⎈|masterseo1:default) [root@kops-ec2 ~]# k delete deploy mario
deployment.apps "mario" deleted
(⎈|masterseo1:default) [root@kops-ec2 ~]# k delete svc mario
service "mario" deleted
서비스 동작
<12> 트러블 슈팅 = 에러 발생시 기본 조치 프로세스
1
에러 발생 시 기본 조치 프로세스
get 확인 → describe 확인 → 애플리케이션 로그(log) 확인 → 클러스터 에러 이벤트(event) 확인
2
G-D-log-Event
# 터미널1
watch -d kubectl get all,deploy,rs,svc,pods
3
# 잘못된 이미지 정보의 파드 배포
kubectl apply -f https://raw.githubusercontent.com/junghoon2/kube-books/main/ch05/nginx-error-pod.yml
4
# 확인
get
kubectl get pod -owide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
nginx-19 0/1 ErrImagePull 0 3m 172.30.64.140 i-0670e7000d8e3c14c <none> <none>
5
describe
kubectl describe pod nginx-19
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal Scheduled 47s default-scheduler Successfully assigned default/nginx-19 to i-002186eeab26ccd9a
Normal BackOff 15s (x2 over 45s) kubelet Back-off pulling image "nginx:1.19.19"
Warning Failed 15s (x2 over 45s) kubelet Error: ImagePullBackOff
Normal Pulling 4s (x3 over 47s) kubelet Pulling image "nginx:1.19.19"
Warning Failed 3s (x3 over 46s) kubelet Failed to pull image "nginx:1.19.19": rpc error: code = NotFound desc = failed to pu ll and unpack image "docker.io/library/nginx:1.19.19": failed to resolve reference "docker.io/library/nginx:1.19.19": docker.io/library/nginx:1. 19.19: not found
Warning Failed 3s (x3 over 46s)
6
# 터미널2 : 문제 원인이 무엇일까요?
kubectl get events -w
LAST SEEN TYPE REASON OBJECT MESSAGE
104s Normal Scheduled pod/nginx-19 Successfully assigned default/nginx-19 to i-002186eeab26ccd9a
5s Normal Pulling pod/nginx-19 Pulling image "nginx:1.19.19"
4s Warning Failed pod/nginx-19 Failed to pull image "nginx:1.19.19": rpc error: code = NotFound desc = failed to pull and unpack image "docker.io/library/nginx:1.19.19": failed to resolve reference "docker.io/library/nginx:1.19.19": docker.io/library/nginx:1.19.19: not found
4s Warning Failed pod/nginx-19 Error: ErrImagePull
20s Normal BackOff pod/nginx-19 Back-off pulling image "nginx:1.19.19"
20s Warning Failed pod/nginx-19 Error: ImagePullBackOff
7
# 이미지 업데이트 : patch 와 update 의 차이는 무엇일까요?
kubectl patch pod nginx-19 --type='json' -p='[{"op": "replace", "path": "/spec/containers/0/image", "value":"nginx:1.19"}]'
pod/nginx-19 patched
8
# 확인
kubectl get pod
NAME READY STATUS RESTARTS AGE
nginx-19 1/1 Running 0 2m46s
9
# 클러스터 수준 이벤트 확인
kubectl get events
kubectl get events -w
kubectl get events -n kube-system
kubectl get events -h | grep '#' -A2
10
# 삭제
kubectl delete pod nginx-19
<13> 장애 사례 처리 예시 : 노드의 사용 가능한 디스크 용량이 부족한 경우
노드 서버에 접속해 디스크 용량부족 확인하고 처리하자.
1
# 터미널1
watch kubectl get pod -owide
# 터미널2
kubectl get pod
2
# 디플로이먼트 배포 - 파드 6개
curl -s -O https://raw.githubusercontent.com/junghoon2/kube-books/main/ch05/busybox-deploy.yml
cat busybox-deploy.yml | sed -e 's/replicas: 10/replicas: 6/g' | kubectl apply -f -
3
# 워커 노드 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
4
# 워커 노드 Public IP 변수 지정
W1PIP=<워커 노드 1 Public IP>
W2PIP=<워커 노드 2 Public IP>
W1PIP=13.209.42.82
W2PIP=13.209.9.82
5
# 워커 노드 스토리지 확인
ssh -i ~/.ssh/id_rsa ubuntu@$W1PIP df -hT -t ext4
Filesystem Type Size Used Avail Use% Mounted on
/dev/root ext4 124G 3.7G 121G 3% /
ssh -i ~/.ssh/id_rsa ubuntu@$W2PIP df -hT -t ext4
Filesystem Type Size Used Avail Use% Mounted on
/dev/root ext4 124G 4.9G 120G 4% /
6
# 노드2에 디스크에 큰 파일 생성
ssh -i ~/.ssh/id_rsa ubuntu@$W2PIP fallocate -l 110g 110g-file
7
# 노드2에 디스크에 용량 확인 >> 90% 넘김!
ssh -i ~/.ssh/id_rsa ubuntu@$W2PIP df -hT -t ext4
Filesystem Type Size Used Avail Use% Mounted on
/dev/root ext4 124G 114G 11G 92% /
8
# 파드 상태 확인 >> 노드2에서 쫓겨남 확인!
모니터링 상태
NAME READY STATUS RESTARTS AGE
pod/busybox-6b5c698b45-4xzbm 0/1 Error 0 27m
pod/busybox-6b5c698b45-7km8j 1/1 Running 0 27m
pod/busybox-6b5c698b45-chxvl 1/1 Running 0 4s
pod/busybox-6b5c698b45-ggmjw 1/1 Running 0 27m
pod/busybox-6b5c698b45-jtd26 0/1 Error 0 27m
pod/busybox-6b5c698b45-m6s8t 1/1 Running 0 35s
pod/busybox-6b5c698b45-nbcd4 1/1 Running 0 27m
pod/busybox-6b5c698b45-ncdps 0/1 Error 0 27m
pod/busybox-6b5c698b45-x5t24 1/1 Running 0 66s
kubectl get pod -owide
(⎈|masterseo1:default) [root@kops-ec2 ~]# kubectl get pod -owide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
busybox-6b5c698b45-4xzbm 0/1 Error 0 28m 172.30.49.115 i-0c570795ec5b1f7a1 <none> <none>
busybox-6b5c698b45-7km8j 1/1 Running 0 28m 172.30.83.130 i-0670e7000d8e3c14c <none> <none>
busybox-6b5c698b45-chxvl 1/1 Running 0 42s 172.30.71.51 i-0670e7000d8e3c14c <none> <none>
busybox-6b5c698b45-ggmjw 1/1 Running 0 28m 172.30.64.140 i-0670e7000d8e3c14c <none> <none>
busybox-6b5c698b45-jtd26 0/1 Error 0 28m 172.30.43.83 i-0c570795ec5b1f7a1 <none> <none>
busybox-6b5c698b45-m6s8t 1/1 Running 0 73s 172.30.64.110 i-0670e7000d8e3c14c <none> <none>
busybox-6b5c698b45-nbcd4 1/1 Running 0 28m 172.30.76.78 i-0670e7000d8e3c14c <none> <none>
busybox-6b5c698b45-ncdps 0/1 Error 0 28m 172.30.35.214 i-0c570795ec5b1f7a1 <none> <none>
busybox-6b5c698b45-x5t24 1/1 Running 0 104s 172.30.90.121 i-0670e7000d8e3c14c <none> <none>
(⎈|masterseo1:default) [root@kops-ec2 ~]#
9
# 노드의 이벤트이므로 클러스터 이벤트 확인
kubectl get events
collect required amount of images. Wanted to free 4255717785 bytes, but freed 0 bytes
11m Warning FreeDiskSpaceFailed node/k8s-n2 failed to garbage collect required amount of images. Wanted to free 4258220441 bytes, but freed 0 bytes
6m46s Warning FreeDiskSpaceFailed node/k8s-n2 failed to garbage kubectl describe nodes
0s Warning EvictionThresholdMet node/i-0c570795ec5b1f7a1 Attempting to reclaim ephemeral-storage
0s Warning EvictionThresholdMet node/i-0c570795ec5b1f7a1 Attempting to reclaim ephemeral-storage
0s Warning EvictionThresholdMet node/i-0c570795ec5b1f7a1 Attempting to reclaim ephemeral-storage
확인까지만 ~~~
10
# 삭제
kubectl delete deploy busybox
ssh -i ~/.ssh/id_rsa ubuntu@$W2PIP rm -rf 110g-file
<14> Helm
1
헬름(Helm)은 쿠버네티스의 패키지(Chart) 관리자이다.
다양한 환경/설정에서 하나의 템플릿으로 재사용, 필요한 모듈만 배포 가능, 안정적인 헬름 차트 생태계에서 필요한 오픈소스 설치
https://artifacthub.io/packages/helm/bitnami/wordpress
2
동작
그림출처 https://kubetm.github.io/k8s/
3
[등록]
helm repo add bitnami https://charts.bitnami.com/bitnami
[조회]
helm repo list
NAME URL
bitnami https://charts.bitnami.com/bitnami
[Chart 찾기]
helm search repo bitnami | grep tomcat
[업데이트]
helm repo update
[삭제]
helm repo remove bitnami
4
# [Tomcat 배포] 현재 Chart 최신 버전
helm install my-tomcat bitnami/tomcat
helm install my-tomcat bitnami/tomcat --version 9.6.3 --set persistence.enabled=false
# [NodePort 확인 및 접속] LoadBalancer 가 없으니 NodePort 로 접속 >> 관리자 페이지 접속 시 403 Access Denied
kubectl get svc my-tomcat
http://<master-ip>:<nodePort>/
5
삭제 ?
[릴리즈 조회]
helm list
[릴리즈 배포 상태확인] - 처음 배포 시 설명도 출력
helm status my-tomcat
[릴리즈 삭제]
helm uninstall my-tomcat
[Pod 확인]
kubectl get pods
No resources found in my-webs namespace.
6
참고 :
워드프레스 배포
https://artifacthub.io/packages/helm/bitnami/wordpress
<15> 노드 최대 파드 배포 이해
워커 노드의 인스턴스 타입 별 파드 생성 갯수 제한이 있다.
이 부분을 참고해서 배포 해야 한다.
1
# t3 타입의 정보(필터) 확인
aws ec2 describe-instance-types --filters Name=instance-type,Values=t3.* --query "InstanceTypes[].{Type: InstanceType, MaxENI: NetworkInfo.MaximumNetworkInterfaces, IPv4addr: NetworkInfo.Ipv4AddressesPerInterface}" --output table
--------------------------------------
| DescribeInstanceTypes
+----------+----------+--------------+
| IPv4addr | MaxENI | Type
+----------+----------+--------------+
| 15 | 4 | t3.2xlarge
| 6 | 3 | t3.medium
| 12 | 3 | t3.large
| 15 | 4 | t3.xlarge
| 2 | 2 | t3.micro
| 2 | 2 | t3.nano
| 4 | 3 | t3.small
+----------+----------+--------------+
# 파드 사용 가능 계산 예시 : aws-node 와 kube-proxy 파드는 host-networking 사용으로 IP 2개 남음
((MaxENI * (IPv4addr-1)) + 2)
예)
t3.medium 경우 : ((3 * (6 - 1) + 2 ) = 17개 >> aws-node 와 kube-proxy 2개 제외하면 15개
2
# 워커노드 상세 정보 확인
: 노드 상세 정보의 Allocatable 에 pods 에 17개 정보 확인
kubectl describe node | grep Allocatable: -A6
Allocatable:
cpu: 2
ephemeral-storage: 59763732382
hugepages-1Gi: 0
hugepages-2Mi: 0
memory: 3854320Ki
pods: 17
3
# 워커 노드 접속
# 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
W1PIP=52.78.73.237
W2PIP=13.209.12.125
ssh -i ~/.ssh/id_rsa ubuntu@$W1PIP
# 워커 노드 EC2 - 모니터링
watch -d "ip link | egrep 'ens|eni'"
while true; do ip -br -c addr show && echo "--------------" ; date "+%Y-%m-%d %H:%M:%S" ; sleep 2; done
4
# 작업용 EC2 - 터미널1
watch -d 'kubectl get pods -o wide'
5
# 작업용 EC2 - 터미널2
# 디플로이먼트 생성
kubectl apply -f https://raw.githubusercontent.com/gasida/PKOS/main/2/nginx-dp.yaml
# 파드 확인
kubectl get pod -o wide
kubectl get pod -o=custom-columns=NAME:.metadata.name,IP:.status.podIP
kubectl ktop
6
# 파드 증가 테스트 >> 파드 정상 생성 확인, 워커 노드에서 eth, eni 갯수 확인
kubectl scale deployment nginx-deployment --replicas=8
# 파드 증가 테스트 >> 파드 정상 생성 확인, 워커 노드에서 eth, eni 갯수 확인 >> 어떤일이 벌어졌는가?
kubectl scale deployment nginx-deployment --replicas=15
# 파드 증가 테스트 >> 파드 정상 생성 확인, 워커 노드에서 eth, eni 갯수 확인 >> 어떤일이 벌어졌는가?
kubectl scale deployment nginx-deployment --replicas=30
# 파드 생성 실패!
kubectl get pods | grep Pending
nginx-deployment-7fb7fd49b4-d4bk9 0/1 Pending 0 3m37s
nginx-deployment-7fb7fd49b4-qpqbm 0/1 Pending 0 3m37s
...
kubectl describe pod <Pending 파드> | grep Events: -A5
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Warning FailedScheduling 45s default-scheduler 0/3 nodes are available: 1 node(s) had untolerated taint {node-role.kubernetes.io/control-plane: }, 2 Too many pods. preemption: 0/3 nodes are available: 1 Preemption is not helpful for scheduling, 2 No preemption victims found for incoming pod.
7
# 디플로이먼트 삭제
kubectl delete deploy nginx-deployment
<16> 워커 노드 증가(ASG = Auto Scaling Group 활용)
워커 노드가 기본 Auto Scaling Group을 사용한다.
그래서, Auto Scaling Group을 이용해 노드 추가하면 된다.
https://kops.sigs.k8s.io/tutorial/working-with-instancegroups/
https://kops.sigs.k8s.io/operations/scaling
1
# 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
2
# 인스턴스그룹 정보 확인
kops get ig
NAME ROLE MACHINETYPE MIN MAX ZONES
control-plane-ap-northeast-2a ControlPlane t3.medium 1 1 ap-northeast-2a
nodes-ap-northeast-2a Node t3.medium 1 1 ap-northeast-2a
nodes-ap-northeast-2c Node t3.medium 1 1 ap-northeast-2c
3
# 노드 추가
kops edit ig nodes-ap-northeast-2a --set spec.minSize=2 --set spec.maxSize=2
# node 축소
kops edit ig nodes-ap-northeast-2a --set spec.minSize=1 --set spec.maxSize=1
# 적용
kops update cluster --yes && echo && sleep 3 && kops rolling-update cluster
Changes may require instances to restart: kops rolling-update cluster
Detected single-control-plane cluster; won't detach before draining
NAME STATUS NEEDUPDATE READY MIN TARGET MAX NODES
control-plane-ap-northeast-2a Ready 0 1 1 1 1 1
nodes-ap-northeast-2a Ready 0 1 2 2 2 1
nodes-ap-northeast-2c Ready 0 1 1 1 1 1
4
# 워커노드 증가 확인
while true; do kubectl get node; echo "------------------------------" ;date; sleep 1; done
5
(masterseo1:N/A) [root@kops-ec2 ~]# kops get ig
NAME ROLE MACHINETYPE MIN MAX ZONES
control-plane-ap-northeast-2a ControlPlane t3.medium 1 1 ap-northeast-2a
nodes-ap-northeast-2a Node t3.medium 2 2 ap-northeast-2a
nodes-ap-northeast-2c Node t3.medium 1 1 ap-northeast-2c
<17> 모니터링 대시보드
1
# 모니터링
watch kubectl get pod,svc,ep -n weave
2
# 설치
kubectl apply -f https://github.com/weaveworks/scope/releases/download/v1.13.2/k8s-scope.yaml
# 서비스(LoadBalancer)로 변경 : AWS CLB
kubectl patch svc -n weave weave-scope-app -p '{"spec":{"type":"LoadBalancer"}}'
(5분 걸림)
# CLB에 ExternanDNS 로 도메인 연결
kubectl annotate service weave-scope-app -n weave "external-dns.alpha.kubernetes.io/hostname=weave.$KOPS_CLUSTER_NAME"
# 확인
dig +short weave.$KOPS_CLUSTER_NAME
kubectl logs -n kube-system -l k8s-app=external-dns
# 웹 접속 주소 확인 및 접속
echo -e "Weave Web URL = http://weave.$KOPS_CLUSTER_NAME"
# 삭제
kubectl delete -f https://github.com/weaveworks/scope/releases/download/v1.13.2/k8s-scope.yaml
<18> kops로 클러스터 삭제
1
kops로 클러스터 삭제
kops delete cluster --yes
cloudformation 삭제
aws cloudformation delete-stack --stack-name mykops
2
VPC까지 삭제 확인!!!
또는
수동 삭제 하는법 ?
1
EC2 > Auto Scaling groups 삭제 부터 해야 한다.
그렇지 않으면 EC2를 삭제해도 다시 자동 생성 된다.
2
콘솔에서 EC2 삭제 확인 하자.
<19> 정리
다음은
https://brunch.co.kr/@topasvga/3103
다시보기
https://brunch.co.kr/@topasvga/3144
참고서적
감사합니다.