본문 바로가기
쿠버네티스

쿠버네티스(Kubernetes): 쿠버네티스가 뭐야?

by limdae94 2024. 12. 4.

장기적인 목표 중 한 개: Kubestronaut

1. 쿠버네티스(Kubernetes)란?

쿠버네티스(Kubernetes)는 다수의 컨테이너를 효율적으로 배포, 확장 및 관리하기 위한 오픈 소스 시스템이다.

쿠버네티스(Kubernetes)는 Docker Compose와 비슷한 느낌을 가지고 있다. Docker Compose도 다수의 컨테이너를 쉽게 관리하기 위해 활용하기 때문이다. 머릿속에서 쿠버네티스(Kubernetes)의 대략적인 이미지를 그릴 때는 Docker Compose의 확장판이라고 생각하면 편하다.

2. 쿠버네티스의 장점

  • 컨테이너 관리 자동화 (배포, 확장, 업데이트)
  • 부하 분산 (로드 밸런싱)
  • 쉬운 스케일링
  • 셀프 힐링

3. 파드(Pod)란?

도커에서는 하나의 프로그램을 실행시키는 단위를 컨테이너라고 주로 불렀다. 쿠버네티스에서는 하나의 프로그램을 실행시키는 단위를 파드(Pod)라고 부른다. 따라서 파드(Pod)는 일반적으로 쿠버네티스에서 하나의 프로그램을 실행시키는 단위라고 기억해두면 이해하기 편하다.

 

  • 쿠버네티스에서 가장 작은 단위일반적으로 하나의 파드가 하나의 컨테이너를 가진다. (예외적으로 하나의 파드가 여러 개의 컨테이너를 가지는 경우도 있다.) 

  • 2개의 결제 서버가 띄워져있다. = 2개의 결제 서버 파드(Pod)가 띄워져있다.
  • 1개의 결제 서버가 죽었다. = 1개의 결제 서버 파드(Pod)가 죽었다.
  • 업로드 서버를 하나 띄우자. = 업로드 서버 하나를 파드(Pod)로 띄우자
  • 컨테이너 : ‘Docker의 컨테이너’를 뜻한다. 쿠버네티스도 도커처럼 이미지를 기반으로 파드(Pod)를 띄워 실행시킨다.

 

쿠버네티스도 도커처럼 이미지를 기반으로 파드(Pod)를 띄워 실행시킨다.

 

4. 파드(Pod)로 띄운 프로그램에 접속이 안 되는 이유

  • 도커에 대해서 공부했을 때는 컨테이너 내부와 컨테이너 외부의 네트워크가 서로 독립적으로 분리되어 있다.
    하지만 쿠버네티스에서는 파드(Pod) 내부의 네트워크를 컨테이너가 공유해서 같이 사용한다.
  • 파드(Pod)의 네트워크는 로컬 컴퓨터의 네트워크와는 독립적으로 분리되어 있다.
    이 때문에 파드(Pod)로 띄운 Nginx에 아무리 요청을 보내도 응답이 없던 것이다.

따라서 Nginx가 띄우는 웹 페이지에 접근하려면 2가지 방법이 있다.

  1. 파드(Pod) 내부로 들어가서 접근하기
  2. 파드(Pod)의 내부 네트워크를 외부에서도 접속할 수 있도록 포트 포워딩(= 포트 연결시키기) 활용하기

하나씩 알아보자.

5. 파드(Pod) 내부로 들어가서 Nginx로 요청보내기

# kubectl exec -it [파드명] -- bash
# 도커에서 컨테이너로 접속하는 명령어(docker exec -it [컨테이너 ID] bash)와 비슷하다. 
$ kubectl exec -it nginx-pod -- bash # nginx-pod 내부 환경으로 접속

# ---Pod 내부---
$ curl localhost:80 # Nginx로 요청보내기

 

kubectl exec -it nginx-pod -- /bin/bash

쿠버네티스에서는 파드(Pod) 내부의 네트워크를 컨테이너가 공유해서 같이 사용하기 때문에, 파드로 접속해서 Nginx로 요청을 보냈을 때 정상적으로 응답이 날라온 것이다.

 

아래 명령어를 통해 포트 포워딩을 활용해 로컬 환경에서도 Nginx로 접속할 수 있게 만들어보자.

# kubectl port-forward pod/[파드명] [로컬에서의 포트]/[파드에서의 포트]
$ sudo kubectl port-forward pod/nginx-pod 80:80

curl localhost:80

 

[curl로 요청 보낸 결과]

 

 

도커에서의 네트워크 (컨테이너 네트워크가 독립적임)

도커에서 컨테이너는 기본적으로 자체 네트워크 네임스페이스를 가진다. 각 컨테이너는 고유한 IP 주소와 네트워크 스택(TCP/UDP 포트, 방화벽 설정 등)을 갖고, 서로 분리된 네트워크 환경에서 동작한다. 하나의 도커 컨테이너는 외부와 통신하려면 포트를 매핑하거나 도커 네트워크 브리지를 통해야 한다. 도커 컨테이너 네트워크의 예제를 살펴보자.

  • 컨테이너 A: 172.17.0.2
  • 컨테이너 B: 172.17.0.3
  • 각각 독립된 네트워크 스택을 갖고 있으며, 서로 네트워크를 공유하지 않는다.

쿠버네티스에서의 네트워크 (Pod 내부에서 네트워크 공유)

쿠버네티스에서는 Pod가 컨테이너를 담는 단위이다. Pod 내부에 있는 모든 컨테이너는 동일한 네트워크 네임스페이스를 공유한다. 이때 네트워크 공유의 의미는 다음과 같다.

 

1. Pod의 컨테이너는 같은 IP 주소를 사용한다.

  • Pod 내부의 모든 컨테이너는 동일한 IP 주소를 갖는다. 따라서 외부에서 볼 때 Pod는 하나의 네트워크 엔티티로 보인다.
  • 예: Pod에 컨테이너 A와 컨테이너 B가 있다면 두 컨테이너는 같은 IP를 공유한다.
    • Pod IP: 10.244.0.10
    • 컨테이너 A: 10.244.0.10
    • 컨테이너 B: 10.244.0.10

2. 같은 포트를 공유하지만 충돌을 피할 수 있음:

  • 컨테이너는 네트워크를 공유하기 때문에, 동일한 Pod 안에서 동일한 포트를 사용하려고 하면 충돌이 발생한다. 이를 방지하기 위해 컨테이너 간 통신은 로컬 호스트(127.0.0.1)로 접근하며, 각 컨테이너는 고유한 포트를 사용해야 한다. 다음 예제를 살펴보자.
  • 컨테이너 A는 localhost:8080에서 서버를 실행.
  • 컨테이너 B는 localhost:9090에서 서버를 실행.

 

3. Pod 내부에서 컨테이너 간 통신은 로컬 네트워크로 처리

  • Pod 내부의 컨테이너 간 통신은 localhost를 사용하여 처리된다.
  • 이는 네트워크 인터페이스를 통해 외부로 나갈 필요 없이, 네트워크 비용이 적고 빠르다.

 

6. 디플로이먼트(Deployment)란?

디플로이먼트(Deployment) : 파드를 묶음으로 쉽게 관리할 수 있는 기능

 

현업에서는 일반적으로 서버를 작동시킬 때 파드(Pod)를 수동으로 배포하진 않는다. 디플로이먼트(Deployment)라는 걸 활용해서 파드(Pod)를 자동으로 배포한다.

 

7. 디플로이먼트(Deployment)의 장점

파드의 수를 지정하는 대로 여러 개의 파드를 쉽게 생성할 수 있음.
예를 들어, 파드를 100개를 생성하라고 시키면 디플로이먼트가 알아서 파드를 100개 생성해준다.

  • 파드가 비정상적으로 종료된 경우, 알아서 새로 파드를 생성해 파드 수를 유지한다.
  • 동일한 구성의 여러 파드를 일괄적으로 일시 중지, 삭제, 업데이트를 하기가 쉽다.

예를 들어, 디플로이먼트를 활용하면 ‘100개의 파드로 띄워져있는 결제 서버’를 한 번에 일시 중지/삭제/업데이트하는 게 굉장히 쉽다.

 

8. 디플로이먼트(Deployment)의 구조

디플로이먼트(Deployment)가 레플리카셋(ReplicaSet)을 관리하고, 레플리카셋(ReplicaSet)이 여러 파드(Pod)를 관리하는 구조다.

  • 레플리카(Replica) : 복제본
  • 레플리카셋(ReplicaSet) : 복제본끼리의 묶음

 

9. 서비스(Service)란?

서비스(Service) : 외부로부터 요청을 받는 역할 / 외부로부터 들어오는 트래픽을 받아, 파드에 균등하게 분배해주는 로드밸런서 역할을 하는 기능

실제 서비스에서 파드(Pod)에 요청을 보낼 때, 포트 포워딩(port-forward)이나 파드 내로 직접 접근(kubectl exec …)해서 요청을 보내진 않는다. 서비스(Service)를 통해 요청을 보내는 게 일반적이다.

 

10. 서비스(Service)의 구조

  • 파드(Pod) : 일반적으로 쿠버네티스에서 하나의 프로그램을 실행시키는 단위 (쿠버네티스에서 가장 작은 단위)
  • 디플로이먼트(Deployment) : 파드를 묶음으로 쉽게 관리할 수 있는 기능
  • 서비스(Service) : 외부로부터 들어오는 트래픽을 받아, 파드에 균등하게 분배해주는 로드밸런서 역할을 하는 기능

쿠버네티스에서는 서비스(Service), 디플로이먼트(Deployment), 파드(Pod)와 같은 리소스를 보고 오브젝트(Object)라고 부른다.