brunch

You can make anything
by writing

C.S.Lewis

by Master Seo Jun 14. 2021

쿠버1탄-3. KOPS로 AWS에 쿠버네티스-2021

다음은 쿠버네티스 스터디 자료를 참고해  정리한 내용입니다.


<1> 비용 안나오게 로컬 PC에 설치하는법

<2> 용어 정의

<3> AWS에 쿠버네티스 설치를 위한 사전 작업

<4> KOPS 버전과 쿠버네티스 호환성 확인

<5> Public  도메인을 가지고 있는 경우 설치법

<6> Public  도메인이 없는 경우 설치법 (추천)

<7> KOPS가 설치된 aws ec2 만들기 - 툴설치

<8> 리눅스 EC2 접속해  ks8 클러스터 만들기

<9> K8s 컨트롤 플레인(마스터)의 EC2 kube config 복사해 ssh 접속

<10> 컨트롤 플레인(Master) node 설정하기

<11> 정상 배포 확인

<12> 클러스터 삭제

<13> 다음 공부




<0> 비용 안나오게 로컬 PC에 설치하는법과 용어 정의



https://brunch.co.kr/@topasvga/1682




<2> 용어 정의



1

KOPS (쿠버네티스 운영)툴로 AWS에 쿠버네티스 설치해보자.

AWS EKS 설치가 아니다.  

쿠버네티스 설치다.

Master와 Worknode까지 모두 만드는것이다.


2

쿠버네티스  = 조타수 

= 관리툴





3

쿠버네티스란 ?

쿠버네티스는 컨테이너화된 워크로드와 서비스를 관리하기 위한 이식성이 있고, 확장가능한 오픈소스 플랫폼이다.

도커 운영의 불편을 개선하고자 나온 관리툴이다 =k8s 

master = 컨트롤 플래인 = 리더

node = worker node = 워커 노드

kubectl = 큐브 컨트롤  = 쿠버네티스에 명령을 내리는 실행파일

etcd = 이티시디 = 리눅스 시스템파일이 /etc 이고 분산되어 d를 더함. 마스터 노드에 있음

pod = 파드 = 컨테이너가 실행되는 곳, IP가 할당되다. Pod안에 컨테이너가 1개이상 실행된다.

컨테이너 = 서비스가 올라가는 서버

istio = 이스티오



4

쿠버네티스 기능?

서버는 모두 워커노드에서 동작한다. 

1~2 서버가 문제가 되어도 서비스 문제가 없다.

사용자가 원하는 서버수와 상태가 유지 된다. = 서버를 1대 지워도 초기에 지정한 수만큼 자동으로 유지 된다.

네임 스페이스로 구분하여 운영 관리가 된다. = 디렉토리 개념? = 웹서버 네임스페이스 




5

KOPS 란 무엇인가?

KOPS = 쿠버네티스 설치하기 위한 툴중 하나

KOPS(Kubernetes Operation)란?

쿠버네티스 생성 및 관리를 쉽게 하도록 도와주는 오픈소스 툴.

쿠버네티스 클러스터를 간단한 CLI 명령을 통해 생성, 관리, 업그레이드, 삭제할 수 있도록 지원한다.

Kops는 master와 work 모두 사용자가 관리하도록 설치한다.



6

AWS,GCP, Azure 에서 쿠버네티스 관리는  ?

컨트롤 플래인(Master)는 CSP(AWS,GCP ,Azure)가 관리 한다.

Worker node만 사용자가 관리하도록 설치된다.




7

아키텍처?


kubectl 개발자(EC2 리눅스 또는 MAC) -----> API 요청(컨트롤 플레인,제어와 모니터링) -----> Worker node1 , Worker node2  <---  사용자 접속


동작

개발자는 컨트롤 플래인(마스터)에 있는 API Server로 명령을 내린다.

마스터의 API Server를 이용해  Worker node 를 제어하고 모니터링한다.

인터넷 사용자 접속은 Worker node 로 한다. (Work node에  Pod(컨테이너)가 있다)







<3> AWS에 쿠버네티스 설치를 위한 사전 작업


1

AWS에  쿠버네티스를 설치하기 위한 서버 1대를 준비한다.

권한도 있어야 한다.

AWS에서  admin 권한을 가진 access-key 계정 생성 - seo-admin


or

만들어진 EC2에 admin-role 을 줘도 된다.



2

EC2에 접속하기 위해 해당 리전에  EC2 key-pair 생성한다 -  싱가포르에 우선 생성



3

Public 도메인이 1개 있어야 한다.  

없다면 무료 도메인 https://www.freenom.com/en/index.html?lang=en  사용. 1일 소요됨.

Public 도메인이 없는 경우 설치법





<4> KOPS 버전과 쿠버네티스 호환성 확인


KOPS  1.21.0 은  K8s  1.21.x  까지 모두 지원 - 2021년 10월 현재



https://kops.sigs.k8s.io/welcome/releases/#compatibility-matrix





<5>  Public  도메인을 가지고 있는 경우 설정법


도메인을 운영하고 있다면 바로 사용이 가능하다.

route53 에 사용하고 있는 도메인이  있어 바로 작업이 가능하다.



기타) 도메인이 없다면,  도메인 구매하고 설정을 하고 적용되는 데는 하루정도 소요된다.

이 방법을 사용하려면,  미리 route53에  public  도메인을 설정하고, 도메인 등록 대행기관(가비아, 아이네임즈, 후이즈)등에 네임서버 변경을 해야 한다.

Public 도메인이 1개 있어야 한다.  

없다면, 무료 도메인 https://www.freenom.com/en/index.html?lang=en  사용 = 1일 소요됨.

참고로, AWS route53에서도 도메인을 구매할 수도  있다.





아래는 AWS route53에서 2차 네임서버를 운영해야 하는 방식이다.

도메인은 온프라미스등에서 운영중인 경우이다.

route53에서 2차 네임서버가 설정된 AWS Account ID에서 작업하는 방식이다.



1

2차 도메인으로 위임해 사용하는 방법

serverchk.com 도메인을 가지고  있다고 가정하면, AWS에  k8s.serverchk.com  을 Hosted zones으로 생성해 설정한다.

k8s.serverchk.com에서 설정된 ns레코더를  serverchk.com에 등록한다.

k8s.serverchk.com   NS     ns.aws.xxxxxx  4개 등록한다.



dig로 질의해 본다.

dig  k8s.serverchk.com   ns

// 네임서버 정보 4개가 나오면 정상적으로 설정 된것이다.




2

AWS  Route53 에서 작업

k8s.serverchk.com  을 Hosted zones으로 생성해 설정한다.



3

serverchk.com 에서 작업 ?

k8s.serverchk.com   NS 레코더를 설정한다.

앞에  AWS  Route53에서 나온 NS를 입력한다.




예)

온프라미스나 AWS   A cccount 에서 serverchk.com 을 사용하고,  B  AWS Account에 쿠버네티스 설치 하려면?


1

B  Account에서  k8s.serverchk.com 을 생성하고,


2

온프라미스나 A Account (serverchk.com) 을 사용하는 곳에서 ,  B어카운트의 네임서버 정보 설정하면 된다.


3

dig로 질의해 본다.

dig  k8s.serverchk.com   ns

// 네임서버 정보 4개가 나오면 정상적으로 설정 된것이다.



방법2

도메인 자체를  AWS  route53을 사용하고 있다면 ?

도메인 자체로 사용도 가능하다.

serverchk.com 으로도 사용가능하다.

도메인 자체건, 2차 도메인이건  aws route53에서 서비스만 하면 된다.





<6> Public  도메인이 없는 경우 설치법



방법3

보유  도메인이 없는 경우 ??



https://brunch.co.kr/@topasvga/1681




<7>  KOPS 가 설치된 aws ec2 만들기 - 툴설치


쿠버네티스 설치를 하기 위한 EC2 1대가 필요하다.


1

일반적으로  VPC 2개 생성

VPC0에  kops가 설치된 ec2 1대

vpc1에  쿠버네티스를 설치한다.

ec2에서 cli로 명령어를 날리게 된다.


2

AWS 로그인

만들어진 EC2에 admin-role 을 주거나, aws configure로 access-key를 입력한다.


3

KOPS 가 설치된 ec2 1대에  기본 툴 설치

amzn2.x86_64


yum -y install tree tmux jq


curl -LO https://dl.k8s.io/release/v1.20.7/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/v1.20.0/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

sudo ./aws/install



or



4

또는

Cloudformattion으로  기본 툴 설치 된 EC2 1대 생성

우선 EC2 Keypair 는 미리 하나 만들어야 한다.   EC2 >  EC2 Keypair


싱가포르, 일본 리전에  ec2-sing , ec2-japan   라는 이름으로   EC2 Keypair를 만들다.

첨부된 Cloudformation  실행한다.


자동으로 EC2 1개 만들어진다.

kops-ec2  1대  생성 됨 - 명령어 날릴 서버 1대

amzn2.x86_64

kops-ec2




<8> EC2 접속해  ks8 클러스터 만들기


다음은 도메인 설정이 완료 된후 작업해야 한다.


1

sudo su -


2

# 기본 툴 및 SSH 키 설치 확인

kubectl version --client

1.20.x인 거 확인

Client Version: version.Info{Major:"1", Minor:"20", GitVersion:"v1.20.7",


3

kops version

1.20.x인 거 확인


4

aws --version

Version 1.20.0


5

ls /root/.ssh/id_rsa*

/root/.ssh/id_rsa  /root/.ssh/id_rsa.pub


6

명령어를 날리기 위해 aws 환경 설정

aws configure

싱가포르 ap-southeast-1

Default output format [None]: json


일본으로 변경하려면

REGION=ap-northeast-1


7

REGION=ap-southeast-1

 echo $REGION


8

k8s 설정 파일 버킷 생성

aws s3 mb s3://seo2-k8s-s3  --region $REGION

aws s3 ls


9

export NAME=k8s.serverchk.com

export KOPS_STATE_STORE=s3://seo2-k8s-s3

echo 'export NAME=k8s.serverchk.com' >>~/.bashrc

echo 'export KOPS_STATE_STORE=s3://seo2-k8s-s3' >>~/.bashrc


10

kops 설정 파일 생성(s3) 및 k8s 클러스터 배포

마스터 노드 1대(t3.medium), 워커 노드 2대(t3.medium)

kops create cluster --zones="$REGION"a --networking calico --master-size t3.medium --node-size t3.medium --node-count=2 --ssh-public-key ~/.ssh/id_rsa.pub $NAME -y



11

참고 - 생성되는데 10분을 걸린다.

생성 완료 10분후  master node로 접속 하자.


Suggestions:

 * validate cluster: kops validate cluster --wait 10m

 * list nodes: kubectl get nodes --show-labels

 * ssh to the master: ssh -i ~/.ssh/id_rsa ubuntu@api.k8s.serverchk.com

 * the ubuntu user is specific to Ubuntu. If not using Ubuntu please use the appropriate user based on your OS.

 * read about installing addons at: https://kops.sigs.k8s.io/operations/addons.



12

kops get cluster


[root@kops-ec2 ~]# kops get cluster

NAME                    CLOUD   ZONES

k8s.serverchk.com       aws     ap-southeast-1a


13

 tree -L 1 ~/.kube


[root@kops-ec2 ~]#  tree -L 1 ~/.kube

/root/.kube

└── config

0 directories, 1 file



14

Master 로 접속 하는 정보가 있는 설정 파일

kubectl 등 명령어 실행하면 디폴트로 아래 설정 파일에서 Master  API 연결 정보를 찾는다.


cat .kube/config


[root@kops-ec2 ~]# cat .kube/config

:

server: https://api.k8s.serverchk.com

  name: k8s.serverchk.com

contexts:

- context:

    cluster: k8s.serverchk.com

    user: k8s.serverchk.com

  name: k8s.serverchk.com

current-context: k8s.serverchk.com



15

kubectl get nodes


[root@kops-ec2 ~]# kubectl get nodes

NAME                                               STATUS   ROLES                  AGE     VERSION

ip-172-20-38-114.ap-northeast-1.compute.internal   Ready    node                   78s     v1.20.8

ip-172-20-38-144.ap-northeast-1.compute.internal   Ready    node                   61s     v1.20.8

ip-172-20-41-255.ap-northeast-1.compute.internal   Ready    control-plane,master   2m28s   v1.20.8



16

route53 에서 a레코더 추가 된것 확인하기


17

s3  버킷에  파일들 확인



18

ec2 확인


node 3개



19

EBS 확인


20

Auto Scaling groups 확인





<9>  K8s 마스터의 EC2 kube config 복사해 ssh 접속


1

kube/config 파일을 master  /tmp 디렉토리에 복사한다.

접속 정보를 Master API 서버에 복사해서, 해당 서버에서 작업해보자.


scp -i ~/.ssh/id_rsa ~/.kube/config ubuntu@api.k8s.serverchk.com:/tmp/


2

master 접속

ssh -i ~/.ssh/id_rsa ubuntu@api.k8s.serverchk.com


아래처럼  나오면  API서버에 정상 접속 된것이다.

ubuntu@ip-172-20-62-120:~$ sudo su -




<10>  Master node 설정하기


1

복사한 파일 확인

root@ip-172-20-62-120:~# cd /tmp

root@ip-172-20-62-120:/tmp# ls

config




2

kube config 사용 설정

mkdir -p $HOME/.kube

cp /tmp/config $HOME/.kube/config

chown $(id -u):$(id -g) $HOME/.kube/config


3

node 확인

kubectl get nodes

NAME                                               STATUS   ROLES                  AGE   VERSION

ip-172-20-37-123.ap-southeast-1.compute.internal   Ready    node                   17m   v1.20.7

ip-172-20-42-225.ap-southeast-1.compute.internal   Ready    node                   17m   v1.20.7

ip-172-20-62-120.ap-southeast-1.compute.internal   Ready    control-plane,master   19m   v1.20.7


5

확인하자 ?

aws는 컨테이너 런타임은 containerd://1.4.4 를 사용한다.

kubectl get nodes -o wide



6

 kubectl 자동완성 기능

source <(kubectl completion bash)

echo 'source <(kubectl completion bash)' >>~/.bashrc





<11> 정상 배포 확인


1

노드 정보 확인


kubectl get nodes



2

 k get pods -n kube-system


3

k get pods -A


$ k get pods -A

NAMESPACE     NAME                                                                       READY   STATUS    RESTARTS   AGE

kube-system   calico-kube-controllers-cc8b58cdf-kdzhm                                    1/1     Running   0

kube-system   calico-node-jql5f                                                          1/1     Running   0          48m

kube-system   calico-node-vtp7t                                                          1/1     Running   0          48m

kube-system   calico-node-xjrq8                                                          1/1     Running   0          51m

kube-system   coredns-5489b75945-qf4hl                                                   1/1     Running   0

kube-system   coredns-5489b75945-rljmw                                                   1/1     Running   0

kube-system   coredns-autoscaler-6f594f4c58-n9d5h                                        1/1     Running   0

kube-system   dns-controller-875d969bb-mtmk9                                             1/1     Running   0

kube-system   etcd-manager-events-ip-172-20-60-173.ap-northeast-1.compute.internal       1/1

kube-system   etcd-manager-main-ip-172-20-60-173.ap-northeast-1.compute.internal         1/1

kube-system   kops-controller-kmwq5                                                      1/1     Running   0          50m

kube-system   kube-apiserver-ip-172-20-60-173.ap-northeast-1.compute.internal            2/2

kube-system   kube-controller-manager-ip-172-20-60-173.ap-northeast-1.compute.internal

kube-system   kube-proxy-ip-172-20-43-172.ap-northeast-1.compute.internal                1/1

kube-system   kube-proxy-ip-172-20-46-12.ap-northeast-1.compute.internal                 1/1

kube-system   kube-proxy-ip-172-20-60-173.ap-northeast-1.compute.internal                1/1

kube-system   kube-scheduler-ip-172-20-60-173.ap-northeast-1.compute.internal            1/1



4

calico 명령어 설치 확인?


curl -o kubectl-calico -O -L  "https://github.com/projectcalico/calicoctl/releases/download/v3.19.1/calicoctl"

chmod +x kubectl-calico

mv kubectl-calico /usr/bin


ip 대역 확인 ?

kubectl-calico ipam show

[ubuntu@ip-172-20-60-173:~ (service-account-context:default)]$ kubectl-calico ipam show

+----------+---------------+------------+------------+-------------------+

| GROUPING |     CIDR      | IPS TOTAL  | IPS IN USE |     IPS FREE      |

+----------+---------------+------------+------------+-------------------+

| IP Pool  | 100.96.0.0/11 | 2.0972e+06 | 7 (0%)     | 2.0971e+06 (100%) |



5

aws 컨테이너 런타임을 docker를 사용하지 않는다. containerd를  사용한다.


k get nodes -o wide

NAME                                               STATUS   ROLES                  AGE   VERSION    INTERNAL-IP     EXTERNAL-IP      OS-IMAGE             KERNEL-VERSION    CONTAINER-RUNTIME

ip-172-20-43-172.ap-northeast-1.compute.internal   Ready    node                   60m   v1.20.11   172.20.43.172   18.183.238.226   Ubuntu 20.04.3 LTS   5.11.0-1017-aws   containerd://1.4.4

ip-172-20-46-12.ap-northeast-1.compute.internal    Ready    node                   60m   v1.20.11   172.20.46.12    13.112.170.254   Ubuntu 20.04.3 LTS   5.11.0-1017-aws   containerd://1.4.4

ip-172-20-60-173.ap-northeast-1.compute.internal   Ready    control-plane,master   64m   v1.20.11   172.20.60.173   18.183.248.245   Ubuntu 20.04.3 LTS   5.11.0-1017-aws   containerd://1.4.4

[ubuntu@ip-172-20-60-173:~ (service-account-context:default)]$




<12> 클러스터 삭제


사용하지 않는다면  삭제 ~


1

EC2  > Autoscaling 그룹에서  반드시 Autoscaling 그룹을 삭제하라.

삭제하지 않으면 EKS node 들이 다시 자동 생성 된다.

EC2에 가서  EC2 들이 삭제되었는지 확인하라.~



2

echo $NAME

kops delete cluster $NAME --yes


3

AWS CloudFormation 스택 삭제로 kops-ec2 등  명령내리는 EC2 삭제


상세

root@ip-172-20-41-255:/tmp# kubectl get nodes

NAME                                               STATUS   ROLES                  AGE     VERSION

ip-172-20-38-114.ap-northeast-1.compute.internal   Ready    node                   5m53s   v1.20.8

ip-172-20-38-144.ap-northeast-1.compute.internal   Ready    node                   5m36s   v1.20.8

ip-172-20-41-255.ap-northeast-1.compute.internal   Ready  control-plane,master 7m3s    v1.20.8


kops delete cluster $NAME --yes



4

AWS에 설치된 리소스들도 모두 지워야 한다.

특히 네트워크 인터페이스에 있는 route 53은 바로 지워라. 비용이 꽤 나온다.



VPC > 네트워크 인터페이스



5

EC2도 삭제 ~



6

EKS > 클러스터 에서 삭제 되었는지 반드시 확인하라~








<13> 다음 공부


https://brunch.co.kr/@topasvga/1667



감사합니다.

매거진의 이전글 쿠버1탄-14. 노트북에 K8S설치법

작품 선택

키워드 선택 0 / 3 0

댓글여부

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