brunch

You can make anything
by writing

C.S.Lewis

by Master Seo Mar 05. 2023

쿠버4탄-1. K8S-kOps로 쿠버네티스설치-2023

1/11

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개

각종 유틸 모두 포함





또는


https://console.aws.amazon.com/cloudformation/home?region=ap-northeast-2#/stacks/new?stackName=mykops&templateURL=https:%2F%2Fs3.ap-northeast-2.amazonaws.com%2Fcloudformation.cloudneta.net%2FK8S%2Fkops-new-ec2.yaml




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

도메인 하나 구매해 사용 


masterseo0.link 

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


참고

https://docs.aws.amazon.com/ko_kr/cli/latest/userguide/cli-configure-files.html



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를 표시  (선택)




# 설치 및 설정


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


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


참고서적



감사합니다.




                    


                    

브런치는 최신 브라우저에 최적화 되어있습니다. IE chrome safari