0469

인프라

[K9s] 로컬에서 쿠버네티스 실행하기 (kind + nginx 실습)

| 서론

안녕하세요, 팡일입니다.

지난 포스팅에서는 Kubernetes의 개념과 구조를 중심으로, 컨테이너를 어떻게 관리하고 운영하는지에 대해 이론적으로 살펴보았습니다. 하지만 Kubernetes는 개념만으로 이해하기에는 한계가 있고, 실제로 직접 실행해보면서 동작을 확인하는 과정이 매우 중요합니다.

이번 포스팅에서는 로컬 환경에서 Kubernetes를 직접 구성하고, 간단한 서비스를 배포해보는 실습을 중심으로 정리해보려고 합니다. kind를 활용해 클러스터를 생성하고, nginx를 배포한 뒤, 실제로 접근하고 확장하고 복구되는 과정까지 경험하면서 Kubernetes가 어떻게 동작하는지 감각적으로 이해하는 것이 목표입니다.

이 글을 통해 “쿠버네티스가 무엇이다”를 넘어서, “쿠버네티스를 어떻게 다루는지”에 대한 흐름을 잡는 것에 초점을 맞춰보겠습니다.

|Kubernetes 로컬 실습 환경 구성

쿠버네티스를 처음 학습할 때 가장 어려운 부분 중 하나는 “실제로 실행해볼 환경을 만드는 것”입니다.

클라우드 환경(AWS, GCP 등)을 사용하면 비용이나 설정이 부담될 수 있는데, 이때 사용할 수 있는 것이 바로 kind입니다.

1) kind 설치

code
brew install kind
  • kind는 Docker 기반으로 로컬에 Kubernetes 클러스터를 빠르게 생성할 수 있는 도구입니다.

  • 쉽게 말하면, “내 로컬 컴퓨터 안에 Kubernetes를 하나 띄운다”고 보면 됩니다.

(1) 장점

  • 클라우드 필요 없음

  • 몇 초 만에 클러스터 생성

  • 실습/테스트에 최적화

2) 클러스터 생성

SQL
kind create cluster

이 명령어를 실행하면, 로컬에 Kubernetes 클러스터가 하나 생성됩니다.

(1) 내부적으로 일어나는 일

  • Docker 기반으로 Kubernetes 환경 생성

  • kubeconfig 자동 설정

  • kubectl이 해당 클러스터를 바라보도록 연결

(2) 결과

  • 결과적으로 별도 설정 없이 바로 kubectl, k9s를 사용할 수 있는 상태가 됩니다.

  • 내부적으로 Docker 기반 Kubernetes 생성되고, kubeconfig 자동 설정됩니다.

3) 클러스터 확인

아래는 클러스터가 잘 생성되었는지 확인하는 과정입니다.

code
kubectl get nodes
kubectl get pods -A

(1) 확인 포인트

  • Node 상태 → Ready

  • kube-system 네임스페이스의 Pod → Running

이 상태라면, 쿠버네티스 클러스터가 정상적으로 동작 중이라는 의미입니다.

4) K9s 실행

code
k9s

K9s를 실행하면, 쿠버네티스 상태를 터미널 UI 형태로 확인할 수 있습니다.

(1) 처음 실행 시 상황

: 처음 실행하면 다음과 같은 메시지가 보일 수 있습니다:

SQL
No resources found for v1/pods in "default"
  • 이는 아직 사용자가 만든 리소스가 없기 때문에 발생하는 자연스러운 상태이다.

(2) 전체 리소스 확인 방법

: 이 상태에서 “클러스터가 잘 떠 있는지” 확인하려면, 전체 namespace를 확인해야 합니다.

bash
// 방법1
k9s -A

// 방법
k9s에서 0 입력

이를 통해 kube-system namespace의 Pod들, Kubernetes 내부 시스템 컴포넌트를 확인할 수 있습니다.

| nginx 배포 실습

앞에서 로컬에 Kubernetes 클러스터를 구성했다면, 이제는 실제로 하나의 서비스를 배포해보는 단계입니다.

가장 간단하면서도 많이 사용하는 예제가 바로 nginx입니다.

1) nginx 배포

code
kubectl create deployment nginx --image=nginx
  • 이 명령어는 쿠버네티스에 “nginx 서버를 실행해줘”라고 요청하는 것입니다.

  • 중요한 포인트는 우리가 직접 컨테이너를 실행하는 것이 아니라, “원하는 상태를 선언하면, 쿠버네티스가 알아서 실행한다”는 점입니다.

  • 즉, nginx 이미지를 사용하고, Pod를 생성하고, 컨테이너를 실행하는 이 모든 과정을 쿠버네티스가 자동으로 처리합니다.

2) 확인

code
kubectl get pods
  • 이 명령어를 실행하면, nginx Pod가 생성된 것을 확인할 수 있습니다.

  • 확인 포인트

    • STATUS → Running

    • RESTARTS → 0

  • 이 상태라면, nginx 서버가 정상적으로 실행 중이라는 의미입니다.

3) k9s에서 확인

이제 터미널에 'k9s'를 실행해보면, default namespace에 nginx Pod가 생성된 것을 확인할 수 있습니다.

  • 이전에는 아무 것도 없엇지만, 이제는 내가 만든 서비스가 보입니다.

  • 이를 통해, 쿠버네티스가 단순 시스템이 아니라 서비스를 실행하는 플랫폼이라는 것을 체감할 수 있습니다.

4) 구조 이해

이 과정을 한 번 구조로 보면 이렇게 됩니다

code
내 맥북
 └ Docker
     └ Kubernetes (kind)
         └ Node
             └ Pod
                 └ nginx 컨테이너

| 중단 / 삭제 / 재실행

쿠버네티스를 사용할 때 처음 헷갈리는 부분 중 하나가 “서비스를 끄는 방법”입니다.

우리가 일반적으로 생각하는 것처럼 “프로세스를 종료한다”는 개념이 아니라, 쿠버네티스는 원하는 상태를 선언하는 방식으로 동작합니다.

1) nginx 삭제

code
kubectl delete deployment nginx
  • 이 명령어는 nginx를 완전히 삭제하는 방식입니다.

  • 이 명령어를 실행하면, 아래의 일들이 진행되고, 결과적으로 nginx 서비스 자체가 클러스터에서 사라집니다.

    • Deployment 삭제

    • 해당 Deployment가 관리하던 Pod 삭제

    • 실행 중이던 컨테이너도 함께 종료

  • 이 경우 다시 실행하려면 다시 생성해야 합니다.

2) 다시 실행

삭제 후에는 다시 이 명령어로 생성해야 합니다

code
kubectl create deployment nginx --image=nginx
  • delete → 완전 삭제

  • scale 0 → 중단

3) 클러스터 확인 방법

쿠버네티스를 사용할 때 “지금 상태가 정상인가?”를 빠르게 확인하는 것이 중요합니다.

아래 4가지 명령어는 기본적으로 반드시 알아두는 것이 좋습니다.

code
kubectl cluster-info
kubectl config current-context
kubectl get nodes
kubectl get pods -A

이 명령어들은 현재 클러스터 상태를 점검하는 기본적인 방법이며, 이 4개 명령어만으로도 대부분의 상태를 빠르게 파악할 수 있습니다.

명령어

역할

cluster-info

클러스터 전체 상태 확인

current-context

현재 연결된 클러스터 확인

get nodes

서버(Node) 상태 확인

get pods -A

전체 Pod 상태 확인

| nginx 활용 (로컬에서 할 수 있는 것)

앞에서 nginx를 쿠버네티스에 배포했다면, 이제는 단순히 “실행 상태”를 넘어서 실제로 접근하고, 동작을 확인하는 단계입니다.

1) 외부 접근 열기

code
kubectl expose deployment nginx --type=NodePort --port=80
  • 이 명령어는 쿠버네티스 내부에서 실행 중인 nginx에 외부 접근을 허용하는 작업입니다.

  • Pod는 기본적으로 외부에서 직접 접근할 수 없어서 “Service”라는 중간 레이어를 통해 접근해야 합니다.

쉽게 말하면, “nginx 서버에 들어갈 수 있는 입구를 하나 만들어준다”고 보면 됩니다.

2) 서비스 확인

code
kubectl get svc
  • 이 명령어로 nginx 서비스가 잘 생성되었는지 확인합니다.

  • nginx 서비스 존재 여부와 PORT / NODE-PORT 정보를 확인하는 것이 포인트입니다.

여기서 생성된 서비스가 외부와 Pod를 연결해주는 역할을 합니다.

3) 포트 포워딩

code
kubectl port-forward service/nginx 8080:80
  • 이는 로컬 환경에서 쉽게 접근하기 위해 포트를 연결하는 방법입니다.

  • NodePort는 접근이 번거로울 수 있지만, 포트포워딩은 가장 빠르게 테스트 가능합니다.

4) 브라우저 접속

code
http://localhost:8080
  • nginx 기본 화면이 보이면 성공입니다.

이 과정을 통해 쿠버네티스에서 실행된 서버를 실제로 외부에서 접근할 수 있음을 확인할 수 있다.

| 실습 (중요 기능 체험)

이제 쿠버네티스의 가장 중요한 특징들을 직접 체험해볼 수 있습니다.

이 단계에서는 단순히 명령어를 실행하는 것을 넘어서, “쿠버네티스가 어떻게 동작하는지”를 눈으로 확인하는 것이 핵심입니다.

1) Self-Healing (자동 복구)

code
kubectl get pods
kubectl delete pod <pod이름>
  • 먼저 현재 실행 중인 Pod를 확인한 뒤, 하나를 직접 삭제해봅니다.

    • 일반적인 환경이라면 프로세스를 종료하면 그대로 서비스가 중단되지만, 쿠버네티스에서는 전혀 다른 동작을 보입니다.

  • Pod를 삭제하면 잠시 후 동일한 역할을 하는 새로운 Pod가 자동으로 다시 생성됩니다.

    • 이는 Deployment가 “Pod를 항상 일정 개수로 유지해야 한다”는 상태를 가지고 있기 때문입니다.

  • 즉, 쿠버네티스는 단순히 컨테이너를 실행하는 것이 아니라, 서비스가 항상 정상 상태를 유지하도록 스스로 복구하는 시스템이라는 것을 확인할 수 있습니다.

2) 스케일링 (서버 개수 증가)

code
kubectl scale deployment nginx --replicas=3
  • 이번에는 nginx 서버의 개수를 직접 늘려봅니다.

    • 위 명령어를 실행하면 쿠버네티스는 자동으로 Pod를 추가로 생성하여, 총 3개의 nginx 서버가 실행되도록 상태를 맞춥니다.

3) 확인

code
kubectl get pods
  • 이후 다시 Pod 목록을 확인해보면, 실제로 동일한 역할을 하는 Pod가 여러 개 실행되고 있는 것을 확인할 수 있습니다.

  • 이 과정은 단순히 서버를 여러 개 띄운다는 의미를 넘어서, 트래픽 증가 상황에 맞춰 서비스 규모를 유연하게 확장할 수 있다는 것을 보여줍니다.

| 결론

이번 포스팅에서는 로컬 환경에서 Kubernetes 클러스터를 구성하고, nginx를 배포한 뒤, 이를 직접 확인하고 조작해보는 과정을 통해 Kubernetes의 핵심 동작을 살펴보았습니다.

단순히 컨테이너를 실행하는 것과는 다르게, Kubernetes는 서비스를 원하는 상태로 유지하고, 장애가 발생하면 자동으로 복구하며, 필요에 따라 유연하게 확장할 수 있는 환경을 제공합니다. 이번 실습에서 Pod를 삭제했을 때 자동으로 다시 생성되거나, 서버 개수를 늘렸을 때 즉시 반영되는 과정을 통해 이러한 특징을 직접 확인할 수 있습니다.

처음에는 명령어와 개념이 다소 많아 보일 수 있지만, 실제로 한 번씩 실행해보며 흐름을 따라가다 보면 Kubernetes가 단순한 도구가 아니라, 서비스를 안정적으로 운영하기 위한 플랫폼이라는 것을 자연스럽게 이해하게 됩니다.