k8s 직접 해보기 (1) - 세팅 및 echo server 테스트

Endermaru·2025년 6월 19일

k8s 직접 해보기

목록 보기
2/11

개념 이해 by GPT

           [Kubernetes Cluster]
                 │
        ┌─────────┴─────────┐
        │                   │
   [Deployment]         [Service]
        ↓  (생성)           ↓ (접속)
        ↓                  [←→ 라우팅]
   [ Node ]───────────────┐
        │                 │
     [Pod]             [Pod]
       │                  │
 [Container: Image] [Container: Image]
용어설명
Cluster여러 노드(서버)들로 구성된 하나의 통합된 Kubernetes 실행 환경
모든 리소스(Pod, Service, Deployment 등)가 동작하는 공간
NodeKubernetes 클러스터 안에서 Pod을 실제로 실행하는 물리 머신 또는 가상 머신
클러스터는 여러 개의 노드들로 구성
되고, Pod은 실제로 이 노드들 안에서 실행
Deployment애플리케이션의 배포 방법을 정의함.
Pod을 몇 개 만들지, 어떤 이미지를 쓸지, 문제가 생기면 어떻게 복구할지 등을 자동으로 관리
ImageDocker로 만든 실행 가능한 컨테이너 프로그램.
예:
nginx:latest, kicbase/echo-server:1.0
PodKubernetes에서 가장 작은 실행 단위. 컨테이너 하나 이상을 실행하는 논리 단위. 보통은 하나의 컨테이너만 들어 있음.
ServicePod은 IP가 계속 바뀌므로, 고정된 접근 지점을 제공하는 네트워크 추상화 계층.즉, Pod들을 묶고 안정적인 주소(Cluster IP, NodePort 등)를 제공함.

minikube

로컬의 가상환경에서 하나의 노드로 구성된 클러스터로 작동하는 테스트용 k8s 환경이다.

1. minikube 설치파일 다운, 설치

2. 로컬에서 Kubernetes 클러스터를 실행

$ minikube start

  • Kubernetes 클러스터 생성 : Docker 컨테이너 안에 Kubernetes 클러스터를 설치
  • 클러스터 구성 요소 초기화 : 주요 컴포넌트가 자동으로 설치되고 실행
  • kubectl 설정 : kubectl이 Minikube 클러스터를 기본으로 사용할 수 있게 kubeconfig를 자동으로 구성

3. kubectl이 설치된 상태에서 클러스터 확인 - 모든 기본 pod 정보 보기

$ kubectl get po -A
NAMESPACE     NAME                               READY   STATUS    RESTARTS       AGE
kube-system   coredns-668d6bf9bc-j9b2q           1/1     Running   0              3m31s
kube-system   etcd-minikube                      1/1     Running   0              3m37s
kube-system   kube-apiserver-minikube            1/1     Running   0              3m35s
kube-system   kube-controller-manager-minikube   1/1     Running   0              3m37s
kube-system   kube-proxy-tfqps                   1/1     Running   0              3m31s
kube-system   kube-scheduler-minikube            1/1     Running   0              3m37s
kube-system   storage-provisioner                1/1     Running   1 (3m9s ago)   3m34s
Pod 이름역할
corednsDNS 기능 (클러스터 내부 서비스끼리 이름으로 통신 가능하게 해줌)
etcd클러스터 상태 저장용 DB
kube-apiserverAPI 요청 처리
kube-controller-manager리소스 상태 자동 조절
kube-proxy네트워크 트래픽 라우팅
kube-schedulerPod 배치 결정
storage-provisioner동적 스토리지 볼륨 생성 지원

4. 대시보드 활성화 가능

$ minikube dashboard
자동으로 열리는 브라우저 창에서 클러스터 상태 모니터링 & 리소스 관리 가능(터미널 열려 있어야 함)

5. 배포

5-1. Deployment 리소스 생성

$ kubectl create deployment hello-minikube --image=kicbase/echo-server:1.0
  • hello-minikube라는 이름의 Deployment 리소스 생성
  • 해당 Deployment는 kicbase/echo-server:1.0 이미지를 기반으로 하는 Pod을 실행

minikube vs. kubectl

  • minikube: 로컬에 k8s 클러스터를 생성/관리하는 도구
    → 클러스터 시작, 중지, 삭제, 조회 + 서비스 포트포워딩
  • kubectl: k8s API와 상호작용하는 CLI
    → 클러스터 내부의 리소스 생성, 조회, 삭제 수정

5-2. hello-minikube의 Service 리소스 생성

Service란?

생성, 삭제마다 IP가 바뀌는 Pod들의 앞단에서 네트워크 프록시 및 로드밸런서 역할을 수행하는 리소스

Service의 타입

  • ClusterIP: 기본 타입, 클러스터 내부 통신용
  • NodePort: ClusterIP + 노드 포트 노출
  • LoadBalancer: NodePort + 클라우드 로드밸런서
$ kubectl expose deployment hello-minikube --type=NodePort --port=8080
$ kubectl get services hello-minikube
NAME             TYPE       CLUSTER-IP      EXTERNAL-IP   PORT(S)          AGE
hello-minikube   NodePort   10.102.69.203   <none>        8080:31864/TCP   3m56s
  • -type=NodePort : 서비스의 타입을 NodePort로 설정
    • 자동으로 Node Port가 설정(31864)되고, 모든 노드의 해당 포트가 개방됨
    • 해당 포트로 들어오는 트래픽을 서비스로 전달
  • --port=8080: 서비스의 내부 포트 지정, Pod 간 내부 통신용(<CLUSTER-IP>:8080)

Service의 IP와 Port 정리

  • CLUSTER-IP: 클러스터 내부에서 서비스에 접근 가능한 가상 IP 주소
  • EXTERNAL-IP: 외부에서 서비스에 접근 가능한 IP
    • NodePort 타입의 서비스는 클라우드의 LoadBalancer와 달리 외부 IP가 설정되어 있지 않음
      → 외부 접근을 위해서는 5-3-a, 5-3-b처럼 터널링, 포트포워딩이 필요.
  • 내부 포트(SERVICE PORT): 컨테이너 내부에서 다른 Pod이 서비스에 접근하는데 사용됨
    • 서비스 생성 시 --port=8080 형태로 설정
    • <서비스 이름>:<내부 포트> 또는 <서비스 CLUSTER-IP>:<내부 포트>으로 접근
  • 외부 포트(NODE PORT): 서비스가 외부로 노출시키는 노드의 포트
    • 외부에서 <NODE-IP>:<외부 포트>로 접근 가능
    • '외부'는 minikube 컨테이너 내부이기 때문에 localhost 접속을 위해서는 추가적인 터널링, 포트포워딩이 필요
  • minkube의 터널링을 이용한 방식
        외부 클라이언트(localhost)
                ↓
              터널링(minikube, kubectl))
                ↓
192.168.49.2:31864 (NodePort)
                ↓
Service (10.102.69.203:8080) ← 클러스터 내부에서도 이 주소로 접근 가능
                ↓
Pod(들)의 8080 포트로 로드밸런싱
  • DashBoard에서도 서비스 리소스 목록을 확인 가능
    • kubernetes라는 이름의 서비스는 클러스터 내부에서 Kubernetes API 서버에 접근할 수 있도록 제공되는 ClusterIP 서비스
      → 클러스터 내부의 Pod들이 kubernetes 서비스를 통해 API 서버에 접속함

5-3-a. minikube 터널링

$ minikube service hello-minikube
|-----------|----------------|-------------|---------------------------|
| NAMESPACE |      NAME      | TARGET PORT |            URL            |
|-----------|----------------|-------------|---------------------------|
| default   | hello-minikube |        8080 | http://192.168.49.2:31864 |
|-----------|----------------|-------------|---------------------------|
* hello-minikube 서비스의 터널을 시작하는 중
|-----------|----------------|-------------|------------------------|
| NAMESPACE |      NAME      | TARGET PORT |          URL           |
|-----------|----------------|-------------|------------------------|
| default   | hello-minikube |             | http://127.0.0.1:11551 |
|-----------|----------------|-------------|------------------------|
* Opening service default/hello-minikube in default browser...
  • SSH 터널을 사용, Minikube의 전용 기능
  • 외부 접속 가능한 주소를 터미널에 출력 & 해당 주소로 브라우저가 열림
  • 2가지 IP를 확인 가능
    • http://192.168.49.2:31864 : Node IP + NodePort 조합
      → Minikube 가상 머신, 즉 docker 내부의 주소이기 때문에 직접 접근이 어려움
    • http://127.0.0.1:11551 : 터널링된 로컬호스트 주소, 외부 접근 가능
      • Minikube가 클러스터 내부 서비스를 로컬호스트로 터널링
      • 백그라운드 실행 불가능(터미널 열려 있어야 함)
      • 외부포트는 실행 시마다 변경됨

테스트

$ curl -X POST http://127.0.0.1:11551 -d "hello minikube"
Request served by hello-minikube-ffcbb5874-mhg7b

HTTP/1.1 POST /

Host: 127.0.0.1:6395
Accept: */*
Content-Length: 14
Content-Type: application/x-www-form-urlencoded
User-Agent: curl/8.11.1

hello minikube

5-3-b. kubectl을 이용한 포트포워딩

$ kubectl port-forward service/hello-minikube 7080:8080
  • 쿠버네티스 API 서버를 통한 직접 연결, 모든 쿠버네티스 환경에서 가능
  • 백그라운드 실행 불가능(터미널 열려 있어야 함)
  • 내 컴퓨터의 7080 포트 → 클러스터 안의 서비스 8080 포트로 연결
    http://localhost:7080/으로 접속 가능!

테스트

$ curl -X POST http://localhost:7080 -d "hello minikube"
Request served by hello-minikube-ffcbb5874-mhg7b

HTTP/1.1 POST /

Host: localhost:7080
Accept: */*
Content-Length: 14
Content-Type: application/x-www-form-urlencoded
User-Agent: curl/8.11.1

hello minikube

Minikube 터널링과 kubectl 포트포워딩 동작 방식 비교

  • Minikube 터널링:
localhost:11551 → SSH 터널 → 192.168.49.2:31864 (NodePort) → Service → Pod
  • kubectl 포트 포워딩:
localhost:7080 → API 서버 → kubelet → Service → Pod
  • cf.kubelet이란? by GPT
    • 각 노드에서 Pod과 컨테이너를 관리하는 역할을 담당
      • Pod 관리: Pod이 노드에서 올바르게 실행되도록 보장
      • 컨테이너 생명주기 관리(시작, 중지, 재시작)
      • API 서버와 통신: Control Plane과 노드 간 통신 담당(healthcheck 등)

cf. docker 상의 컨테이너와 클러스터 내부의 컨테이너는 다름!

  • docker 상의 컨테이너 : Minikube가 내부적으로 만든 Kubernetes 클러스터 자체를 위한 컨테이너
  • 클러스터 내부 컨테이너 : echo server 앱이 돌아가는 컨테이너
$ docker ps
CONTAINER ID   IMAGE                                 COMMAND                   CREATED          STATUS          PORTS                                                                                                                                  NAMES
394111bcf5ac   gcr.io/k8s-minikube/kicbase:v0.0.46   "/usr/local/bin/entr…"   38 minutes ago   Up 38 minutes   127.0.0.1:11291->22/tcp, 127.0.0.1:11292->2376/tcp, 127.0.0.1:11294->5000/tcp, 127.0.0.1:11295->8443/tcp, 127.0.0.1:11293->32443/tcp   minikube

$ kubectl get pods
NAME                             READY   STATUS    RESTARTS   AGE
hello-minikube-ffcbb5874-mhg7b   1/1     Running   0          30m

6. 클러스터 관리 명령어

  • Pause Kubernetes without impacting deployed applications:
    minikube pause
  • Unpause a paused instance:
    minikube unpause
  • Halt the cluster(Docker 컨테이너를 완전히 종료):
    minikube stop
  • Change the default memory limit (requires a restart):
    minikube config set memory 9001
  • Browse the catalog of easily installed Kubernetes services:
    minikube addons list
  • Create a second cluster running an older Kubernetes release
    minikube start -p aged --kubernetes-version=v1.16.1
  • Delete all of the minikube clusters:
    minikube delete --all

7. 리소스 정리

실행 중 프로세스 종료

  • 터널링/포트 포워딩 중지: 실행 중인 터미널에서 Ctrl + C로 종료

리소스 삭제

# Service 삭제
$ kubectl delete service hello-minikube
service "hello-minikube" deleted

# Deployment 삭제
$ kubectl delete deployment hello-minikube
deployment.apps "hello-minikube" deleted

# 또는 이름으로 여러 리소스 삭제
$ kubectl delete deployment,service hello-minikube
deployment.apps "hello-minikube" deleted
service "hello-minikube" deleted

# 또는 모든 리소스 일괄 삭제
$ kubectl delete deployment,pod,service --all

클러스터 중지/삭제

클러스터 일시 중지

$ minikube stop
  • 클러스터를 중지하지만 리소스 정보는 보존
  • 다음 minikube start 시 기존 리소스들이 복원됨

클러스터 완전 삭제

$ minikube delete
  • 클러스터와 모든 리소스를 완전히 삭제
  • 다음 minikube start 시 완전히 새로운 상태로 시작

0개의 댓글