쿠버네티스를 공부한 내용을 정리한다.
쿠버네티스란, 도커와 같은 컨테이너들을 관리, 유지, 보수하는 일을 하는 오픈 소스 프로젝트
구글에서 개발한 Borg
시스템을 CNCF(Cloud Native Computing Foundation)
에 기부해 CNCF
가 관리, 개발 중
도커란, 기존의 가상화 환경과 달리 하이퍼바이저를 사용하지 않고, 운영체제를 바로 설치하여 기존 가상화보다 더 많은 어플리케이션을 사용하며 컨테이너로 사용할 수 있도록 해주는 기술
vendor-neutral
이기 때문에, 요구사항에 맞게 자유롭게 구성할 수 있음관리형 쿠버네티스 : AWS
, Google Cloud Platform
, Azure
와 같은 클라우드 시스템을 이용해 사용. 사용자는 배포한 후 크게 신경을 쓰지 않아도 됨
설치형 쿠버네티스 : RANCHER
, OPENSHIFT
를 예로 들며, 설치할 수 있도록 이미 패키지화를 진행. 쿠버네티스에 필요한 내용을 포함한 배포 패키지
구성형 쿠버네티스 : kubeadm
, kops
, kubespray
, KRIB
등 사용자가 자유롭게 구성할 수 있도록 지원하는 개념. 교육 목적으로도 많이 사용
플레이 쿠버네티스 : 순수한 가상머신 (VM) 9개 제공, 4시간 시간 제한 존재, 세션이 날아간 경우 복구 불가
쿠버네티스 플레이그라운드 : 시나리오 등, 학습 방법 제공, 노드 수가 2개로 제한되어 있음
VAGRANT
, Virtual Box
를 이용해 CentOS
기반 마스터노드 및 워커 노드를 로드하려 함m-k8s
, 워커 노드는 w-k8s
Vagrant
설치
Virtual Box
설치
미리 작성된 스크립트를 통해 CentOS 기반 노드를 구성하는 중..
Virtual Box
에 4개의 노드가 로드, 활성화 됨
명령어를 통해 설치가 잘 된 것을 확인할 수 있음. 쿠버네티스의 버전은 v1.25
Super Putty
를 사용해 다중 세션을 관리할 수 있는 Putty
구현
Putty
다운로드
Super Putty
다운로드
Super putty
설정
준비된 XML
파일로 세션 정보 불러오기
Super Putty
를 이용해 여러 세션을 Putty
로 관리할 수 있도록 함
쿠버네티스에 어플리케이션을 배포한다는 것은, 마스터노드에서 워커노드에 사용할 프로그램을 설치하라는 명령을 보내는 것으로 이해
쿠버네티스의 어플리케이션 배포 과정에 쓰이는 단위는 pod
pod
: 컨테이너의 집합을 의미. 하나의 일을 하기 위해 묶인 컨테이너 집합, 하지만 대부분은 하나의 컨테이너(도커)가 하나의 pod
를 이룸
volume
: 계속해서 저장되어야 하는 데이터를 저장하는 저장소
예로, NGINX
를 배포해보자.
> kubectl run nginx --image=nginx
nginx
이미지를 이용해 pod
로 생성한다
> kubectl get pod -o wied
명령어를 통해 IP
주소를 확인하고, curl
명령어를 사용해 웹 접속을 체크해보면 NGINX
가 잘 배포된 것을 확인할 수 있음
pod
를 외부에서 접근할 수 있도록 하기현재 설정으로는 외부에서 접근이 불가함
현재 쿠버네티스 클러스터는 외부와 연결이 되어있지 않음
Service
영역을 정의하고, 배포한 어플리케이션(pod
)을 연결하여 안전한 접근이 가능하도록 설계
NodePort
를 통해 Node
에 접속하는 것이 더 정확한 표현이며, pod
에 직접 연결되는 구조는 아님
Service
가 NodePort
로 들어오고, 각 NodePort
가 통신하며 pod
위치를 찾아가는 구조
> kubectl expose pod nginx --type=NodePort --port=80
NodePort
를 사용해 pod nginx
를 노출시킬 수 있도록 설정
> kubectl get service
서비스 영역을 확인해본 결과, NGINX
는 NodePort
를 통해 노출되고 있으며, 10.96.39.138
의 주소로 접근, 30400 포트로 접근
> kubectl get nodes -o wide
외부에 노출되는 ip는 192.168.1.10
, 192.168.1.101
, 192.168.1.102
, 192.168.1.103
임을 확인
웹 브라우저를 통해 NGINX
배포 확인
cmd
상에서도 잘 연결되는 것을 확인
현재 쿠버네티스 클러스터는 단일 pod
로 구성되어 장애나 에러 발생 시 서비스를 진행하지 못하는 취약점 존재
pod
를 여러 개 사용하기 위한 방법 -->deployment
위 그림과 같이 구성해야 함
Deployment
는 Pods
들이 잘 운영될 수 있도록 유지Pod
는 NGINX
기능 제공Service
는 Pods
에 접근할 수 있도록 함지금까지 사용한 kubectl run
으로는 deployment
배포 불가
kubectl create
, kubectl apply
사용해야하는데, apply
는 XML
파일 필요
kubectl run
은 단순하게 pod
하나만 배포하는 경우에만 사용
kubectl create deployment deploy-nginx --image=nginx
위 명령어를 사용해 deploy-nginx
라는 이름의 deployment
를 nginx
이미지를 통해 생성
kubectl get pods -o wide
위 명령어를 사용해 새롭게 배포한 deployment
의 ip
주소 확인 후 curl
로 배포가 잘 되었는지 확인
deployment
로 다수의 pods
를 배포하기 위해서는 ReplicaSet
의 도움을 받아야 함
ReplicaSet
의 기본값은 1, pod
를 3개로 늘리고 싶으면 3으로 변경kubectl scale deployment deploy-nginx --replicas=3
위 명령어를 통해 deploy-nginx
이름의 deployment
의 replicaset
값을 3으로 변경했고, pod
가 3개로 늘어남을 확인
deploymentd
의 pod
이름은 name-replicaset-hash
로 구성
deployment
를 서비스로 노출하기 위해 NodePort
사용
kubectl expose deployment deploy-nginx --type=NodePort --port=80
위 명령어를 사용하여 서비스에 등록
kubectl get services
위 명령어로 서비스 목록을 확인한 뒤, ip주소와 포트번호를 이용해 웹 브라우저에서 잘 작동하는지 확인
현재 deployment
를 외부로 노출하는 것은 노드의 ip주소가 외부에 알려져 있는 경우에만 사용 가능
MetalLB
기술을 사용해 로드 밸런서를 구현하여, `NodePort를 대체
로드 밸런서는 대표 IP (Virtual IP
등)을 설정할 수 있어 IP 노출에 대한 부담이 적으며, 경로의 최적화 수행 가능
미리 정의된 yaml
파일을 이용해 로드 밸런서를 구현하는 metallb
를 설치
kubectl apply -f ~파일주소/metallb.yaml
또한, NGINX
를 대신할 수 있는 개인 컨테이너 레지스트리(이미지) 로드
kubectl create deployment 이름 --image=경로/이미지
pods
가 잘 생성됨을 확인
kubectl expose deployment 이름 --type=LoadBalancer --port=80
NodePort
가 아닌 LoadBalancer
타입으로 서비스에 등록
서비스를 확인해보면 NodePort
와는 달리 EXTERNAL-IP
가 등록되어 있어, 노드의 직접적인 IP주소를 노출하지 않을 수 있음
kubectl delete [-f] 종류 이름 [경로]
위 명령어를 사용해 배포한 서비스, deployment
, pods
, metallb
삭제