k8s 직접 해보기 (2) - 범용 서버(agnhost) 테스트

Endermaru·2025년 6월 22일

k8s 직접 해보기

목록 보기
3/11

Agnhost란?

쿠버네티스 프로젝트에서 개발한 테스트 전용 컨테이너 이미지
다양한 플랫폼과 운영체제에서 일관된 동작을 보장하는 CLI 도구
"agnostic"(불가지론적)과 "host"를 결합한 합성어로, 플랫폼에 관계없이 동일한 결과를 출력한다는 의미

1. 세팅 - minikube 컨테이너 재시작 & 대시보드 준비

$ minikube start
$ minikube dashboard

2. Deployment 생성

2-1. hello-node deployment 생성

  • 웹 서버를 포함하는 agnhost 이미지를 가져와 실행
  • netexec : agnhost에 포함된 HTTP 네트워크 서버 모드 → GET/POST 테스트, 라우팅, 네트워크 연결 확인 등에 유용
  • --http-port: Pod 내부 컨테이너가 실제로 받아들이는 포트
$ kubectl create deployment hello-node --image=registry.k8s.io/e2e-test-images/agnhost:2.39 -- /agnhost netexec --http-port=8080

k8s 포트 구조

  • Container Port: Pod 내부 컨테이너가 실제로 리스닝하는 포트
  • Target Port: Service가 Pod로 트래픽을 전달할 때 사용하는 포트
  • Service Port: 클러스터 내부에서 Service에 접근할 때 사용하는 포트
  • Node Port: 클러스터 외부에서 접근할 때 사용하는 노드의 포트

2-2. 리소스, 이벤트, 설정 확인

# deployment 리소스 목록 보기(default 네임스페이스)
# 원하는 수(1개)의 Pod이 실제로 실행 중(READY 1/1)
$ kubectl get deployments
NAME         READY   UP-TO-DATE   AVAILABLE   AGE
hello-node   1/1     1            1           30s

# pod 목록 보기(default 네임스페이스)
# Deployment가 자동으로 생성한 Pod(replicas: 1)
$ kubectl get pods
NAME                         READY   STATUS    RESTARTS   AGE
hello-node-c74958b5d-2ztsb   1/1     Running   0          2m22s

# 클러스터 내 이벤트 목록 보기(default 네임스페이스)
# pod이 node에 배치, 이미지 가져오기, 컨테이너 생성, pod 생성 등 확인 가능
$ kubectl get events
...
6m13s       Normal    Scheduled                           pod/hello-node-c74958b5d-2ztsb       Successfully assigned default/hello-node-c74958b5d-2ztsb to minikube
6m13s       Normal    Pulling                             pod/hello-node-c74958b5d-2ztsb       Pulling image "registry.k8s.io/e2e-test-images/agnhost:2.39"
6m4s        Normal    Pulled                              pod/hello-node-c74958b5d-2ztsb       Successfully pulled image "registry.k8s.io/e2e-test-images/agnhost:2.39" in 9.368s (9.368s including waiting). Image size: 126872991 bytes.
6m4s        Normal    Created                             pod/hello-node-c74958b5d-2ztsb       Created container: agnhost
6m4s        Normal    Started                             pod/hello-node-c74958b5d-2ztsb       Started container agnhost
6m14s       Normal    SuccessfulCreate                    replicaset/hello-node-c74958b5d      Created pod: hello-node-c74958b5d-2ztsb
6m14s       Normal    ScalingReplicaSet                   deployment/hello-node                Scaled up replica set hello-node-c74958b5d from 0 to 1

# kubectl 설정 보기(네임스페이스 관계 없음)
# kubectl이 "어느 클러스터에", "어떤 사용자 인증 정보로", "어떤 네임스페이스에" 접근할지 정의한 설정
# ~/.kube/config (Windows에선 C:\Users\endermaru\.kube\config)에 설정 파일이 위치
$ kubectl config view
apiVersion: v1
# 클러스터 정보
clusters:
- cluster:
    certificate-authority: C:\Users\endermaru\.minikube\ca.crt
    extensions:
    - extension:
        last-update: Tue, 15 Apr 2025 02:44:49 KST
        provider: minikube.sigs.k8s.io
        version: v1.35.0
      name: cluster_info
    server: https://127.0.0.1:2386  # minikube의 k8s API 주소(kubectl)
  name: minikube 
contexts:       # 작업환경(클러스터, 사용자, 네임스페이스)
- context:
    cluster: minikube
    extensions:
    - extension:
        last-update: Tue, 15 Apr 2025 02:44:49 KST
        provider: minikube.sigs.k8s.io
        version: v1.35.0
      name: context_info
    namespace: default
    user: minikube
  name: minikube
current-context: minikube  # kubectl이 현재 바라보고 있는 클러스터/사용자 조합
kind: Config
preferences: {}
users:  # 접속 시 사용자 인증 정보
- name: minikube
  user:
    client-certificate: C:\Users\endermaru\.minikube\profiles\minikube\client.crt
    client-key: C:\Users\endermaru\.minikube\profiles\minikube\client.key
    
# hello-node pod 내부 로그 보기
$ kubectl logs hello-node-c74958b5d-2ztsb
I0622 14:04:22.915513       1 log.go:195] Started HTTP server on port 8080
I0622 14:04:22.915820       1 log.go:195] Started UDP server on port  8081

cf. Kubernetes API 서버 주소(포트) vs. Deployment(Container)/Service 포트

  • k8s API 서버 주소(포트) : kubectl 같은 클라이언트가 minikube와 같은 클러스터와 통신하기 위해 접속하는 대상
    kubectl get pods 등 명령어를 입력 시 내부적으로 이 주소로 HTTPS 요청이 날아가 결과를 받아옴
  • Deployment/Service 포트 : Pod 안의 컨테이너가 제공하는 웹 서비스를 외부에서 접속할 수 있게 만드는 포트
    → 웹 앱, API 서버, echo 서버 등에 접속 가능

3. Service 생성 & 터널링

  • Deployment를 외부로 노출하기 위한 Service를 생성
    → 클러스터 외부에서 Node의 Pod으로 요청을 전달하는 역할
  • LoadBalancer 타입의 Service를 생성하지만, Minikube 내부에서는 NodePort와 동일하게 동작함

NodePort vs. LoadBalancer by GPT

  • 둘 모두 Service의 타입, minikube에서는 사실상 NodePort와 동일
Type실제 외부 IP 생성클라우드 전용Minikube 호환접속 방식
NodePort❌ (노드 IP + 포트만)minikube service / localhost:<포트>(VM 내부)
LoadBalancer✅ (클라우드 전용 외부 IP)⭕ (내부 NodePort로 대체)클라우드 IP / minikube service(minikube)
# service의 8080 포트를 외부로 노출
# --target-port는 자동으로 port와 동일한 값으로 설정됨
# = pod 내부의 8080 포트를 리스닝 중인 agnhost 앱으로 연결됨
$ kubectl expose deployment hello-node --type=LoadBalancer --port=8080

# 생성된 서비스 확인
# minikube는 LoadBalancer == NodePort -> EXTERNAL-IP가 계속 <pending> 상태
$ kubectl get services
NAME         TYPE           CLUSTER-IP      EXTERNAL-IP   PORT(S)          AGE
hello-node   LoadBalancer   10.108.56.157   <pending>     8080:31603/TCP   2m20s
kubernetes   ClusterIP      10.96.0.1       <none>        443/TCP          3d3h

# localhost에서 서비스에 접근
# 1. http://192.168.49.2:31603: VM 내부에서 접근할 수 있는 Node IP + Port
#   → Docker Desktop 네트워크 설정 상 직접 IP 접근이 차단됨
# 2. http://127.0.0.1:3022: minikube가 임시로 만든 터널링에 의한 localhost + 터널링 포트
#   → localhost로 접속 가능!
$ minikube service hello-node
|-----------|------------|-------------|---------------------------|
| NAMESPACE |    NAME    | TARGET PORT |            URL            |
|-----------|------------|-------------|---------------------------|
| default   | hello-node |        8080 | http://192.168.49.2:31603 |
|-----------|------------|-------------|---------------------------|
* hello-node 서비스의 터널을 시작하는 중
|-----------|------------|-------------|-----------------------|
| NAMESPACE |    NAME    | TARGET PORT |          URL          |
|-----------|------------|-------------|-----------------------|
| default   | hello-node |             | http://127.0.0.1:3022 |
|-----------|------------|-------------|-----------------------|

4. 테스트

$ curl http://127.0.0.1:3022
NOW: 2025-04-14 18:31:49.053045131 +0000 UTC m=+2197.396152444

5. 애드온(Addon) 활성화, 확인, 비활성화

  • 애드온: 클러스터에서 추가적인 기능을 제공하는 확장 모듈, 클러스터 단위의 기능을 제공하기 때문에 kube-system 네임스페이스에서 실행
  • kube-system: Kubernetes 내부 시스템 구성 요소들이 실행되는 네임스페이스
  • metrics-server: 클러스터의 리소스 사용량 확인용 애드온, CPU, 메모리 사용률 등을 수집, 전달
# 애드온 목록 보기 - metrics-server는 비활성화된 상태
$ minikube addons list
|-----------------------------|----------|--------------|--------------------------------|
|         ADDON NAME          | PROFILE  |    STATUS    |           MAINTAINER           |
|-----------------------------|----------|--------------|--------------------------------|
| ambassador                  | minikube | disabled     | 3rd party (Ambassador)         |
| amd-gpu-device-plugin       | minikube | disabled     | 3rd party (AMD)                |
| auto-pause                  | minikube | disabled     | minikube                       |
| cloud-spanner               | minikube | disabled     | Google                         |
| csi-hostpath-driver         | minikube | disabled     | Kubernetes                     |
| dashboard                   | minikube | disabled     | Kubernetes                     |
| default-storageclass        | minikube | enabled ✅   | Kubernetes                     |
...
| metrics-server              | minikube | disabled     | Kubernetes                     |
...

# metrics-server 애드온 활성화
$ minikube addons enable metrics-server
$ minikube addons list
...
| metrics-server              | minikube | enabled ✅   | Kubernetes                     |
...


# kube-system 네임스페이스 안에 있는 모든 Pod과 Service 목록을 확인
# 추가한 metric-server의 pod과 service 확인 가능
$ kubectl get pod,svc -n kube-system
NAME                                   READY   STATUS    RESTARTS      AGE
...
pod/metrics-server-7fbb699795-68sf6    1/1     Running   0             83s
...

NAME                     TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)                  AGE
...
service/metrics-server   ClusterIP   10.102.31.92   <none>        443/TCP                  83s


# metric-server 명령어 실행
$ kubectl top pods
NAME                         CPU(cores)   MEMORY(bytes)
hello-node-c74958b5d-2ztsb   1m           13Mi


# 애드온 비활성화 - top 명령어가 실행 불가능
$ minikube addons disable metrics-server
* "'metrics-server' 이 비활성화되었습니다
$ kubectl top pods
error: Metrics API not available

kubectl get pods(svc)

  • kubectl get pods : default 네임스페이스 조회
    → namespace를 별도로 지정하지 않은 사용자 앱들이 실행되는 공간
  • kubectl get pods -n kube-system : kube-system 네임스페이스 조회
    → Kubernetes 자체를 유지하고 관리하는 시스템 구성요소가 실행되는 공간
  • kubectl get pods -A : 모든 네임스페이스 조회

6. 정리

# 0) service 터널링 해제(ctrl+c)

# 1) 리소스 정리
$ kubectl delete service hello-node
$ kubectl delete deployment hello-node

# 2) 클러스터 중지
$ minikube stop

# 3) (필요 시) Minikube VM 삭제 - docker 컨테이너 삭제
$ minikube delete

0개의 댓글