Navisafe/Infrastructure

미니 PC 서버에 k3s 기반 Kubernetes 운영 환경 구성

jjaehyeok 2026. 5. 11. 20:27

1. 문제 배경

로컬 Kubernetes 환경(kind)에서 데이터 파이프라인과 공간 데이터 처리 기능 검증을 완료한 이후, 이제 실제 서버 환경에서 장시간 실행 가능한 구조로 전환할 필요가 있었다.

로컬 환경에서는 다음과 같은 한계가 있었다.

  • PC 종료 시 서비스 중단
  • 외부 네트워크 접근 제한
  • 장시간 스트리밍 처리 운영 어려움
  • 실제 서비스 환경과 차이 존재

따라서 항상 실행 가능한 미니 PC 서버에 SSH로 접속해 NaviSafe 서비스를 직접 배포하고 운영 환경을 구성하기로 했다.

 

또한 이후 AWS 기반 클라우드 환경으로 확장하기 전에, 우선 미니 PC 서버에서 실제 배포 및 운영 과정을 먼저 검증할 예정이다.

이를 통해

  • Kubernetes 기반 서비스 운영
  • 장시간 스트리밍 처리 안정성 확인
  • 네트워크 및 서비스 연결 검증
  • 서버 환경에서의 리소스 사용 확인

과정을 사전에 점검하고, 이후 클라우드 환경으로 확장할 계획이다.


2. 목표

  • 미니 PC 서버 SSH 접속
  • Kubernetes 환경 구성
  • NaviSafe 서비스 배포
  • 외부 네트워크에서 접근 가능한 구조 준비

3. kubectl 설치 및 서버 환경 구성

미니 PC 서버에 SSH로 접속한 이후, 먼저 Kubernetes 클러스터를 제어하기 위한 CLI 도구인 kubectl 설치를 진행했다.

 

 

3-1) Kubernetes 저장소 등록

이후 Kubernetes 공식 저장소를 등록했다.

sudo apt update
sudo apt install -y apt-transport-https ca-certificates curl

curl -fsSL https://pkgs.k8s.io/core:/stable:/v1.30/deb/Release.key | \
sudo gpg --dearmor -o /etc/apt/keyrings/kubernetes-apt-keyring.gpg

echo "deb [signed-by=/etc/apt/keyrings/kubernetes-apt-keyring.gpg] \
https://pkgs.k8s.io/core:/stable:/v1.30/deb/ /" | \
sudo tee /etc/apt/sources.list.d/kubernetes.list
 

3-2) kubectl 설치

sudo apt update
sudo apt install -y kubectl
 

설치 이후 버전을 확인했다.

kubectl version --client
 

이를 통해 미니 PC 서버에서도 Kubernetes 클러스터를 직접 제어할 수 있는 환경을 구성했다.


4. k3s 기반 Kubernetes 클러스터 구성

로컬 환경에서는 kind 기반으로 Kubernetes 구성을 테스트했지만, 미니 PC 서버에서는 장시간 실행과 실제 운영 환경 구성을 고려해 k3s 기반으로 전환했다.

kind는 Docker 컨테이너 내부에서 Kubernetes 클러스터를 실행하는 구조이기 때문에 로컬 테스트에는 적합하지만, 서버 환경에서 상시 운영하기에는 다소 무거운 구조였다.

반면 k3s는 경량 Kubernetes 배포판으로

  • 단일 서버 환경 운영에 적합
  • 리소스 사용량이 비교적 작음
  • 서버 재부팅 이후 자동 복구 가능
  • 실제 운영 환경과 유사한 구조 구성 가능

장점이 있었기 때문에 미니 PC 환경에서는 k3s를 선택했다.

4-1) k3s 설치

공식 설치 스크립트를 통해 k3s를 설치했다.

curl -sfL https://get.k3s.io | sh -

설치 이후 k3s 서비스 상태를 확인했다.

sudo systemctl status k3s

active(running)  정상 확인


5. kubectl과 k3s 클러스터 연결

5-1) k3s 설치 이후 노드 상태를 확인

kubectl get nodes

하지만 다음과 같은 오류가 발생했다.

The connection to the server localhost:8080 was refused
 

이는 Kubernetes 클러스터 문제가 아니라, 일반 kubectl이 k3s의 kubeconfig 파일을 찾지 못해 기본 주소(localhost:8080)로 접근한 상태였다.

5-2) k3s 전용 kubectl 확인

먼저 k3s 내부 kubectl을 사용해 클러스터 상태를 확인했다.

sudo k3s kubectl get nodes
정상적으로 노드가 조회되는 것을 확인했다. 이를 통해 k3s 클러스터 자체는 정상적으로 실행 중인 상태임을 확인했다.

5-3) kubeconfig 연결

이후 일반 kubectl에서도 동일하게 클러스터를 제어할 수 있도록 k3s kubeconfig 파일을 사용자 환경으로 복사했다.

 
mkdir -p ~/.kube
sudo cp /etc/rancher/k3s/k3s.yaml ~/.kube/config
sudo chown $USER:$USER ~/.kube/config
chmod 600 ~/.kube/config

5-4) 연결 확인

다시 노드 상태를 확인했다.

kubectl get nodes

정상적으로 k3s 노드가 조회되는 것을 확인했다.


왜 필요한가

k3s는 자체 kubeconfig를 /etc/rancher/k3s/k3s.yaml 경로에 생성한다.

하지만 일반 kubectl은 기본적으로 다음 경로를 참조한다.

~/.kube/config
 

따라서 kubeconfig를 사용자 환경으로 복사하지 않으면 kubectl이 클러스터 정보를 찾지 못하게 된다.

이번 과정은 단순 파일 복사가 아니라, k3s 클러스터와 일반 kubectl CLI를 연결하는 작업이었다.


6. k3s 기본 리소스 확인

k3s 설치 및 kubectl 연결 이후, 클러스터 내부 기본 리소스가 정상적으로 실행 중인지 확인했다.

kubectl get pods -A
kubectl get svc -A
kubectl get storageclass

6-1) Pod 상태 확인

kubectl get pods -A
 

k3s 설치 직후 기본적으로 생성되는 시스템 Pod들을 확인했다.

확인 결과:

  • CoreDNS
  • metrics-server
  • local-path-provisioner
  • traefik

등 주요 시스템 리소스가 정상적으로 Running 상태인 것을 확인했다.


왜 확인하는가

이 리소스들은 Kubernetes 클러스터의 기본 동작에 필요한 구성 요소들이다.

예를 들어

  • CoreDNS → Pod 간 DNS 통신
  • metrics-server → 리소스 모니터링
  • local-path-provisioner → PVC 동적 생성
  • traefik → Ingress 및 외부 접근 처리

역할을 담당한다. 즉, 이 리소스들이 정상 동작해야 이후 NaviSafe 서비스도 안정적으로 배포할 수 있다.

6-2) Service 확인

kubectl get svc -A
 

클러스터 내부 서비스 상태를 확인했다. 특히 traefik 서비스가 LoadBalancer 형태로 생성된 것을 확인했다.

이를 통해 이후 외부 네트워크 접근 구성이 가능한 상태임을 확인했다.

6-3) StorageClass 확인

kubectl get storageclass

확인 결과 기본 StorageClass로 local-path가 설정된 것을 확인했다.


왜 중요한가

NaviSafe에서는 다음 서비스들이 Persistent Volume을 사용한다.

  • PostgreSQL
  • Kafka
  • Redis 일부 구성
  • Airflow 로그 저장

따라서 PVC가 정상적으로 생성될 수 있는 StorageClass가 반드시 필요했다. k3s에서는 기본적으로 local-path-provisioner를 제공하기 때문에 별도 스토리지 설정 없이도 로컬 디스크 기반 PVC를 사용할 수 있었다.


이번 단계에서는 단순 설치 확인이 아니라

  • DNS
  • 네트워크
  • 스토리지
  • 시스템 Pod

등 Kubernetes 기본 구성 요소가 정상적으로 동작하는지를 검증했다는 점이 중요했다. 이를 통해 이후 NaviSafe 서비스를 실제로 배포할 수 있는 클러스터 상태를 확인했다.


7. 마치며

이번 과정에서는 로컬 kind 환경에서 검증했던 Kubernetes 구성을 실제 미니 PC 서버 환경으로 확장했다.

단순히 Kubernetes를 설치하는 수준이 아니라,

  • SSH 기반 서버 접근
  • Docker 리소스 정리 및 디스크 문제 해결
  • kubectl 설치
  • k3s 클러스터 구성
  • kubeconfig 연결
  • 기본 시스템 리소스 검증

과정을 순차적으로 진행하며 실제 운영 가능한 Kubernetes 환경을 준비했다.

특히 로컬 테스트 환경에서는 크게 드러나지 않았던

  • 디스크 사용량 관리
  • Kubernetes 저장소 설정
  • kubeconfig 연결
  • 서버 환경 리소스 관리

문제를 직접 확인하면서, 운영 환경에서는 단순 서비스 실행 외에도 인프라 상태를 함께 관리해야 한다는 점을 확인할 수 있었다.

또한 k3s 기반으로 전환하면서 단일 서버 환경에서도 비교적 가벼운 Kubernetes 구성이 가능했고,
이후 NaviSafe 서비스를 장시간 실행할 수 있는 기반 환경을 마련할 수 있었다.


다음 글

다음 단계에서는 실제 NaviSafe 서비스를 k3s 클러스터 위에 배포할 예정이다.

이를 위해

  • Namespace 구성
  • Secret / ConfigMap 적용
  • PostgreSQL / Redis / Kafka 배포
  • Spark Streaming 연결
  • Backend / Frontend 서비스 배포

등의 과정을 순차적으로 진행하며, 로컬 테스트 환경에서 검증했던 데이터 파이프라인을 실제 서버 환경에서 실행할 예정이다.