소개
이 랩에서는 Kubernetes 의 port-forward 명령어를 사용하여 로컬 포트를 파드 (pod) 의 포트로 전달하는 방법을 배우게 됩니다. 포트 포워딩은 클러스터에서 실행 중인 애플리케이션을 인터넷에 노출하지 않고 안전하게 접근할 수 있게 해주는 중요한 디버깅 도구입니다. 간단한 예시부터 시작하여 여러 포트, 여러 컨테이너, 그리고 서비스 (service) 를 사용하는 복잡한 시나리오까지 점차적으로 진행할 것입니다.
이 랩에서는 Kubernetes 의 port-forward 명령어를 사용하여 로컬 포트를 파드 (pod) 의 포트로 전달하는 방법을 배우게 됩니다. 포트 포워딩은 클러스터에서 실행 중인 애플리케이션을 인터넷에 노출하지 않고 안전하게 접근할 수 있게 해주는 중요한 디버깅 도구입니다. 간단한 예시부터 시작하여 여러 포트, 여러 컨테이너, 그리고 서비스 (service) 를 사용하는 복잡한 시나리오까지 점차적으로 진행할 것입니다.
리소스를 생성하기 전에, 실행 중인 Kubernetes 클러스터가 필요합니다. Minikube 는 로컬 머신에서 실행되는 가벼운 Kubernetes 환경입니다.
작업 디렉토리로 이동:
터미널을 열고 기본 프로젝트 폴더로 이동합니다:
cd /home/labex/project
Minikube 시작:
Kubernetes 클러스터를 초기화하기 위해 Minikube 를 시작합니다:
minikube start
Minikube 가 실행 중인지 확인:
Minikube 클러스터의 상태를 확인합니다:
minikube status
kubelet 및 apiserver와 같은 구성 요소가 Running으로 표시되는지 확인합니다.minikube start를 다시 실행합니다.Minikube 를 시작하는 데 문제가 발생하면 필요에 따라 minikube delete를 사용하여 환경을 재설정하십시오.
kubectl port-forward 명령어를 사용하면 Kubernetes 클러스터의 파드 (pod), 배포 (deployment), 또는 서비스 (service) 로 하나 이상의 로컬 포트를 전달할 수 있습니다. 이는 서비스를 외부로 노출하지 않고 테스트 및 디버깅하는 데 일반적으로 사용됩니다.
kubectl port-forward에 사용 가능한 옵션을 보려면 다음 명령을 실행하십시오:
kubectl port-forward -h
다음과 같은 출력을 볼 수 있습니다:
Forward one or more local ports to a pod.
Use resource type/name such as deployment/mydeployment to select a pod. Resource type defaults to 'pod' if omitted.
If there are multiple pods matching the criteria, a pod will be selected automatically. The forwarding session ends
when the selected pod terminates, and a rerun of the command is needed to resume forwarding.
Examples:
## Listen on ports 5000 and 6000 locally, forwarding data to/from ports 5000 and 6000 in the pod
kubectl port-forward pod/mypod 5000 6000
## Listen on ports 5000 and 6000 locally, forwarding data to/from ports 5000 and 6000 in a pod selected by the deployment
kubectl port-forward deployment/mydeployment 5000 6000
## Listen on port 8443 locally, forwarding to the targetPort of the service's port named "https" in a pod selected by the service
kubectl port-forward service/myservice 8443:https
## Listen on port 8888 locally, forwarding to 5000 in the pod
kubectl port-forward pod/mypod 8888:5000
## Listen on port 8888 on all addresses, forwarding to 5000 in the pod
kubectl port-forward --address 0.0.0.0 pod/mypod 8888:5000
## Listen on port 8888 on localhost and selected IP, forwarding to 5000 in the pod
kubectl port-forward --address localhost,10.19.21.23 pod/mypod 8888:5000
## Listen on a random port locally, forwarding to 5000 in the pod
kubectl port-forward pod/mypod :5000
이 단계에서는 로컬 포트를 파드의 포트로 전달하는 방법을 배웁니다. 이는 애플리케이션을 디버깅하거나 클러스터 외부에 노출되지 않은 서비스에 액세스하는 데 유용합니다.
터미널 관리에 대한 참고 사항:
kubectl port-forward 명령어는 터미널에서 계속 실행되며 다른 사용을 차단합니다.Ctrl+C를 누를 수 있습니다.하나의 레플리카 (replica) 와 Nginx 컨테이너 (container) 로 배포를 생성하여 시작합니다:
kubectl create deployment nginx --image=nginx --replicas=1
이 명령어는 공식 Nginx 컨테이너 이미지를 실행하는 배포를 생성합니다.
파드가 준비될 때까지 기다립니다:
kubectl wait --for=condition=Ready pod -l app=nginx
포트 전달에 사용할 파드 이름을 가져옵니다:
kubectl get pod -l app=nginx
다음과 유사한 출력을 볼 수 있습니다:
NAME READY STATUS RESTARTS AGE
nginx-66b6c48dd5-abcd1 1/1 Running 0 30s
kubectl port-forward 명령어를 사용하여 로컬 포트를 파드로 전달합니다:
먼저, 파드 이름을 가져옵니다:
export POD_NAME=$(kubectl get pods -l app=nginx -o jsonpath='{.items[0].metadata.name}')
echo $POD_NAME
다음과 같은 출력을 볼 수 있습니다:
nginx-748c667d99-pdhzs
이제 파드 이름을 사용하여 포트 전달을 설정합니다:
kubectl port-forward $POD_NAME 19000:80
다음과 같은 출력을 볼 수 있습니다:
Forwarding from 127.0.0.1:19000 -> 80
Forwarding from [::1]:19000 -> 80
새 터미널 창을 열고 (포트 전달이 현재 터미널에서 계속 실행되므로) 포트 전달을 확인합니다:
curl http://localhost:19000
Nginx 환영 페이지 HTML 콘텐츠를 볼 수 있습니다.
웹 브라우저를 열고 http://localhost:19000을 방문하여 페이지가 렌더링되는 것을 볼 수도 있습니다.
이 단계를 시작하기 전에 다음을 수행해야 합니다:
Ctrl+C를 누릅니다.이 단계에서는 여러 로컬 포트를 파드로 전달하는 방법을 배웁니다. 동일한 서비스에 대해 서로 다른 액세스 포인트를 제공하려는 경우 유용하게 사용할 수 있도록 두 개의 서로 다른 로컬 포트를 동일한 컨테이너 포트로 전달합니다.
다음 명령을 사용하여 포트 전달을 설정합니다:
먼저, 아직 하지 않았다면 파드 이름을 가져옵니다:
export POD_NAME=$(kubectl get pods -l app=nginx -o jsonpath='{.items[0].metadata.name}')
echo $POD_NAME
다음과 같은 출력을 볼 수 있습니다:
nginx-748c667d99-pdhzs
이제 두 개의 로컬 포트 (19080 및 19081) 를 컨테이너의 포트 80 에 매핑하도록 포트 전달을 설정합니다:
## The correct format is: kubectl port-forward POD_NAME LOCAL_PORT:CONTAINER_PORT [LOCAL_PORT:CONTAINER_PORT ...]
kubectl port-forward pod/$POD_NAME 19080:80 19081:80
다음과 같은 출력을 볼 수 있습니다:
Forwarding from 127.0.0.1:19080 -> 80
Forwarding from [::1]:19080 -> 80
Forwarding from 127.0.0.1:19081 -> 80
Forwarding from [::1]:19081 -> 80
이 명령어는 다음을 전달합니다:
두 로컬 포트 모두 동일한 Nginx 컨테이너 포트 80 에 매핑되어 동일한 웹 서버에 서로 다른 로컬 포트를 통해 액세스할 수 있습니다.
수신 대기 포트를 확인하여 포트 전달을 확인합니다:
ss -tulnp | grep 1908
다음과 유사한 출력을 볼 수 있습니다:
tcp LISTEN 0 4096 0.0.0.0:19080 0.0.0.0:*
tcp LISTEN 0 4096 0.0.0.0:19081 0.0.0.0:*
이제 두 포트 중 하나를 통해 Nginx 환영 페이지에 액세스할 수 있습니다:
curl http://localhost:19080
curl http://localhost:19081
두 URL 모두 동일한 Nginx 환영 페이지를 표시합니다. 이는 두 URL 모두 동일한 컨테이너 포트로 전달되기 때문입니다.
이 단계를 시작하기 전에 다음을 수행하십시오:
Ctrl+C를 눌러 중지합니다.이 단계에서는 여러 컨테이너가 있는 파드에서 특정 컨테이너로 로컬 포트를 전달하는 방법을 배웁니다. 이는 사이드카 (sidecar) 가 사용되는 마이크로서비스 (microservices) 아키텍처에서 흔히 볼 수 있는 시나리오입니다.
먼저, 이전 리소스를 정리합니다:
kubectl delete deployment nginx
두 개의 컨테이너 (Nginx 및 BusyBox) 가 있는 파드를 생성합니다:
cat << EOF | kubectl apply -f -
apiVersion: v1
kind: Pod
metadata:
name: nginx-busybox
labels:
app: nginx-multi
spec:
containers:
- name: nginx
image: nginx
ports:
- containerPort: 80
- name: busybox
image: busybox
command: ['sh', '-c', 'while true; do sleep 3600; done']
EOF
파드가 준비될 때까지 기다립니다:
kubectl wait --for=condition=Ready pod/nginx-busybox
두 컨테이너가 모두 실행 중인지 확인합니다:
kubectl get pod nginx-busybox -o wide
READY 열 아래에 2/2가 표시되어야 합니다.
kubectl port-forward 명령을 사용하여 로컬 포트를 Nginx 컨테이너로 전달합니다:
kubectl port-forward pod/nginx-busybox 19001:80
새 터미널에서 연결을 확인합니다:
curl http://localhost:19001
Nginx 환영 페이지 HTML 콘텐츠를 볼 수 있습니다.
이 단계를 시작하기 전에 다음을 수행하십시오:
Ctrl+C를 눌러 중지합니다.이 단계에서는 Kubernetes 서비스와 함께 kubectl port-forward 명령을 사용하는 방법을 배웁니다. 서비스로의 포트 전달은 파드로의 포트 전달과 다릅니다. 서비스는 서비스가 가리키는 모든 파드에 액세스할 수 있도록 하기 때문입니다.
먼저, 여러 레플리카 (replica) 가 있는 새로운 배포를 생성합니다:
kubectl create deployment nginx-service --image=nginx --replicas=3
모든 파드가 준비될 때까지 기다립니다:
kubectl wait --for=condition=Ready pod -l app=nginx-service
배포를 위한 서비스를 생성합니다:
kubectl expose deployment nginx-service --port=80 --type=ClusterIP --name=nginx-service
서비스가 생성되었는지 확인합니다:
kubectl get service nginx-service
다음과 같은 출력을 볼 수 있습니다:
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
nginx-service ClusterIP 10.96.123.456 <none> 80/TCP 10s
kubectl port-forward 명령을 사용하여 로컬 포트를 서비스로 전달합니다:
kubectl port-forward service/nginx-service 20000:80
새 터미널에서 연결을 테스트합니다:
curl http://localhost:20000
Nginx 환영 페이지 HTML 콘텐츠를 볼 수 있습니다. 이 명령을 여러 번 실행해 보십시오. 서비스 뒤에 있는 서로 다른 파드에서 응답이 오는 것을 확인할 수 있습니다.
이 랩 (lab) 에서는 다양한 시나리오에서 Kubernetes port-forward 명령을 효과적으로 사용하는 방법을 배웠습니다. 다음을 실습했습니다:
이러한 기술은 Kubernetes 클러스터에서 애플리케이션을 디버깅하고 테스트하는 데 필수적입니다. 포트 전달은 개발 및 문제 해결 중에 애플리케이션을 공용 인터넷에 노출하지 않고 안전하게 액세스할 수 있는 방법을 제공합니다.
몇 가지 주요 사항:
kubectl port-forward 명령이 실행되는 동안만 지속되는 임시 연결입니다.포트 전달은 주로 디버깅 도구이며, 애플리케이션에 대한 프로덕션 액세스에는 사용해서는 안 된다는 점을 기억하십시오. 프로덕션 시나리오에서는 적절한 Kubernetes 서비스 유형 (LoadBalancer, NodePort) 또는 Ingress 컨트롤러를 사용해야 합니다.