Agnhost란?
쿠버네티스 프로젝트에서 개발한 테스트 전용 컨테이너 이미지
다양한 플랫폼과 운영체제에서 일관된 동작을 보장하는 CLI 도구
"agnostic"(불가지론적)과 "host"를 결합한 합성어로, 플랫폼에 관계없이 동일한 결과를 출력한다는 의미
$ minikube start
$ minikube dashboard
--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: 클러스터 외부에서 접근할 때 사용하는 노드의 포트
# 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 서버 등에 접속 가능
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 |
|-----------|------------|-------------|-----------------------|
$ curl http://127.0.0.1:3022
NOW: 2025-04-14 18:31:49.053045131 +0000 UTC m=+2197.396152444
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: 모든 네임스페이스 조회
# 0) service 터널링 해제(ctrl+c)
# 1) 리소스 정리
$ kubectl delete service hello-node
$ kubectl delete deployment hello-node
# 2) 클러스터 중지
$ minikube stop
# 3) (필요 시) Minikube VM 삭제 - docker 컨테이너 삭제
$ minikube delete