쿠버네티스

GGob2._.·2023년 1월 4일
0

kubernetes

목록 보기
1/2
post-thumbnail

쿠버네티스를 공부한 내용을 정리한다.

쿠버네티스란, 도커와 같은 컨테이너들을 관리, 유지, 보수하는 일을 하는 오픈 소스 프로젝트

  • 구글에서 개발한 Borg 시스템을 CNCF(Cloud Native Computing Foundation)에 기부해 CNCF가 관리, 개발 중

  • 도커란, 기존의 가상화 환경과 달리 하이퍼바이저를 사용하지 않고, 운영체제를 바로 설치하여 기존 가상화보다 더 많은 어플리케이션을 사용하며 컨테이너로 사용할 수 있도록 해주는 기술

  • 쿠버네티스는 vendor-neutral이기 때문에, 요구사항에 맞게 자유롭게 구성할 수 있음

  • 쿠버네티스 사용 종류는 3가지
  1. 관리형 쿠버네티스 : AWS, Google Cloud Platform, Azure와 같은 클라우드 시스템을 이용해 사용. 사용자는 배포한 후 크게 신경을 쓰지 않아도 됨

  2. 설치형 쿠버네티스 : RANCHER, OPENSHIFT를 예로 들며, 설치할 수 있도록 이미 패키지화를 진행. 쿠버네티스에 필요한 내용을 포함한 배포 패키지

  3. 구성형 쿠버네티스 : kubeadm, kops, kubespray, KRIB 등 사용자가 자유롭게 구성할 수 있도록 지원하는 개념. 교육 목적으로도 많이 사용


쿠버네티스 랩 환경 구성

  • 웹에서 제공하는 쿠버네티스
  1. 플레이 쿠버네티스 : 순수한 가상머신 (VM) 9개 제공, 4시간 시간 제한 존재, 세션이 날아간 경우 복구 불가

  2. 쿠버네티스 플레이그라운드 : 시나리오 등, 학습 방법 제공, 노드 수가 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에 직접 연결되는 구조는 아님

  • ServiceNodePort로 들어오고, 각 NodePort가 통신하며 pod 위치를 찾아가는 구조

> kubectl expose pod nginx --type=NodePort --port=80

NodePort를 사용해 pod nginx를 노출시킬 수 있도록 설정

> kubectl get service

서비스 영역을 확인해본 결과, NGINXNodePort를 통해 노출되고 있으며, 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

위 그림과 같이 구성해야 함

  • DeploymentPods 들이 잘 운영될 수 있도록 유지
  • PodNGINX 기능 제공
  • ServicePods에 접근할 수 있도록 함

지금까지 사용한 kubectl run으로는 deployment 배포 불가

  • kubectl create, kubectl apply 사용해야하는데, applyXML 파일 필요

  • kubectl run은 단순하게 pod 하나만 배포하는 경우에만 사용

kubectl create deployment deploy-nginx --image=nginx

위 명령어를 사용해 deploy-nginx라는 이름의 deploymentnginx 이미지를 통해 생성

kubectl get pods -o wide

위 명령어를 사용해 새롭게 배포한 deploymentip주소 확인 후 curl로 배포가 잘 되었는지 확인

deployment로 다수의 pods를 배포하기 위해서는 ReplicaSet의 도움을 받아야 함

  • ReplicaSet의 기본값은 1, pod를 3개로 늘리고 싶으면 3으로 변경

kubectl scale deployment deploy-nginx --replicas=3

위 명령어를 통해 deploy-nginx 이름의 deploymentreplicaset 값을 3으로 변경했고, pod가 3개로 늘어남을 확인

deploymentdpod 이름은 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 삭제

profile
소통을 잘하는 개발자가 되고 싶습니다.

0개의 댓글