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에 설치하는법과 용어 정의



아래 실습1-14. 노트북에 K8S설치법은 참고로만 보시기 바랍니다.

3년전 작성본인데 버전업 후 오류가 납니다.

오류 내용 확인해서 수정이 필요한 내용입니다.



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




<2> 용어 정의



1

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

AWS EKS 설치가 아니다.  

쿠버네티스 설치다.

쿠버네티스의 Master와 Worknode까지 모두 만드는것이다.


Amazon EKS 등  CSP에서 제공하는 쿠버네티스는  Master는 CSP 에서 관리한다.

Amazon EKS 쿠버네티스를 사용하면 Woker node만 보인다.



2

쿠버네티스  = 조타수 의미 이다. =  실제로는 관리툴이다.






3

쿠버네티스란 ?

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


도커 운영의 불편을 개선하고자 나온 관리툴이다 =k8s 라고 줄여 사용한다. 


구성은 ?

master = 컨트롤 플래인이라고 한다.

node = worker node = 워커 노드

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

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

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

컨테이너 = 서비스가 올라가는 서버, Pod안에 컨테이너가 구성된다.



4

쿠버네티스 기능?

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

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

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

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




5

KOPS 란 무엇인가?

쿠버네티스 설치하기 위한 툴중 하나이다.


KOPS(Kubernetes Operation)란?

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

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

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



6


쿠버네티스 오리지널  과  AWS,GCP, Azure 에서 쿠버네티스 관리는  ?


쿠버네티스 오리지널은 마스터와 워커 노드 모두 사용자가 관리한다.


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

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




7

아키텍처?


kubectl 개발자 PC (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


또는

만들어진 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  도메인을 가지고 있는 경우 설정법


1

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

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



2

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

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

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

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

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




3

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

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

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



4

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개가 나오면 정상적으로 설정 된것이다.




5

AWS  Route53 에서 작업

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



6

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개가 나오면 정상적으로 설정 된것이다.





7

방법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


네이버 nks 설치의 경우 예제


[root@start1 ~]#  k get pods -n kube-system

NAME                                      READY   STATUS    RESTARTS   AGE

cilium-operator-6fdfd65fbc-b75ft          0/1     Pending   0          23h

cilium-operator-6fdfd65fbc-rjklj          0/1     Pending   0          23h

coredns-86cd684f9f-4gfm9                  0/1     Pending   0          23h

csi-nks-controller-686ff56b79-l6v88       0/7     Pending   0          23h

dns-autoscaler-674d68ffb4-88cmt           0/1     Pending   0          23h

nks-nas-csi-controller-69879ddc7f-h4bkv   0/4     Pending   0          23h

snapshot-controller-0                     0/1     Pending   0          23h





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



감사합니다.

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