다음은 쿠버네티스 스터디 자료를 참고해 정리한 내용입니다.
아래 실습1-14. 노트북에 K8S설치법은 참고로만 보시기 바랍니다.
3년전 작성본인데 버전업 후 오류가 납니다.
오류 내용 확인해서 수정이 필요한 내용입니다.
https://brunch.co.kr/@topasvga/1682
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(컨테이너)가 있다)
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 도메인이 없는 경우 설치법도 뒤에 따로 나온다.
KOPS 1.21.0 은 K8s 1.21.x 까지 모두 지원 - 2021년 10월 현재
https://kops.sigs.k8s.io/welcome/releases/#compatibility-matrix
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에서 서비스만 하면 된다.
방법3
보유 도메인이 없는 경우 ??
https://brunch.co.kr/@topasvga/1681
쿠버네티스 설치를 하기 위한 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 확인
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 -
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
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)]$
사용하지 않는다면 삭제 ~
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 > 클러스터 에서 삭제 되었는지 반드시 확인하라~
https://brunch.co.kr/@topasvga/1667
감사합니다.