7.8. 포트 전달을 사용하여 컨테이너의 애플리케이션에 액세스
OpenShift Container Platform에서는 Pod로 포트를 전달할 수 있습니다.
7.8.1. 포트 전달 이해
CLI를 사용하여 하나 이상의 로컬 포트를 Pod로 전달할 수 있습니다. 이 경우 지정된 포트 또는 임의의 포트에서 로컬로 수신 대기하고 Pod의 지정된 포트와 데이터를 주고받을 수 있습니다.
포트 전달 기능을 위한 지원은 CLI에 빌드되어 있습니다.
$ oc port-forward <pod> [<local_port>:]<remote_port> [...[<local_port_n>:]<remote_port_n>]
CLI는 사용자가 지정한 각 로컬 포트에서 수신 대기하고 아래에 설명된 프로토콜을 사용하여 전달합니다.
포트는 다음 형식을 사용하여 지정할 수 있습니다.
| 클라이언트는 포트 5000에서 로컬로 수신 대기하고 Pod의 5000으로 전달합니다. |
| 클라이언트는 포트 6000에서 로컬로 수신 대기하고 Pod의 5000으로 전달합니다. |
| 클라이언트는 사용 가능한 로컬 포트를 선택하고 Pod의 5000으로 전달합니다. |
OpenShift Container Platform은 클라이언트의 포트 전달 요청을 처리합니다. 요청이 수신되면 OpenShift Container Platform에서 응답을 업그레이드하고 클라이언트에서 포트 전달 스트림을 생성할 때까지 기다립니다. OpenShift Container Platform에서 새 스트림을 수신하면 스트림과 Pod의 포트 간 데이터를 복사합니다.
구조적으로 Pod의 포트로 전달할 수 있는 옵션이 있습니다. 지원되는 OpenShift Container Platform 구현에서는 노드 호스트에서 직접 nsenter
를 호출하여 Pod의 네트워크 네임스페이스에 입력한 다음 socat
을 호출하여 스트림과 Pod 포트 사이의 데이터를 복사합니다. 그러나 사용자 정의 구현에는 nsenter
및 socat
을 실행하는 helper Pod 실행을 포함할 수 있으므로 이러한 바이너리를 호스트에 설치할 필요가 없습니다.
7.8.2. 포트 전달 사용
CLI를 사용하여 하나 이상의 로컬 포트를 Pod로 포트 전달할 수 있습니다.
프로세스
다음 명령을 사용하여 Pod의 지정된 포트에서 수신 대기합니다.
$ oc port-forward <pod> [<local_port>:]<remote_port> [...[<local_port_n>:]<remote_port_n>]
예를 들면 다음과 같습니다.
다음 명령을 사용하여 포트
5000
및6000
에서 로컬로 수신 대기하고 Pod의 포트5000
및6000
에서 또는 해당 포트로 데이터를 전달합니다.$ oc port-forward <pod> 5000 6000
출력 예
Forwarding from 127.0.0.1:5000 -> 5000 Forwarding from [::1]:5000 -> 5000 Forwarding from 127.0.0.1:6000 -> 6000 Forwarding from [::1]:6000 -> 6000
다음 명령을 사용하여 포트
8888
에서 로컬로 수신 대기하고 Pod의5000
으로 전달합니다.$ oc port-forward <pod> 8888:5000
출력 예
Forwarding from 127.0.0.1:8888 -> 5000 Forwarding from [::1]:8888 -> 5000
다음 명령을 사용하여 사용 가능한 포트에서 로컬로 수신 대기하고 Pod의
5000
으로 전달합니다.$ oc port-forward <pod> :5000
출력 예
Forwarding from 127.0.0.1:42390 -> 5000 Forwarding from [::1]:42390 -> 5000
또는 다음을 수행합니다.
$ oc port-forward <pod> 0:5000
7.8.3. 클라이언트에서 포트 전달을 시작하는 프로토콜
클라이언트는 Kubernetes API 서버에 대한 요청을 발행하여 Pod로의 포트 전달을 시작합니다.
/proxy/nodes/<node_name>/portForward/<namespace>/<pod>
위 URL에서
-
<node_name>
은 노드의 FQDN입니다. -
<namespace>
는 대상 Pod의 네임스페이스입니다. -
<pod>
는 대상 Pod의 이름입니다.
예를 들어 다음과 같습니다.
/proxy/nodes/node123.openshift.com/portForward/myns/mypod
클라이언트는 API 서버로 포트 전달 요청을 보낸 후 다중 스트림을 지원하는 연결로 연결을 업그레이드합니다. 현재 구현에서는 Hyptertext Transfer Protocol Version 2(HTTP/2) 를 사용합니다.
클라이언트는 Pod에 대상 포트가 포함된 port
헤더를 사용하여 스트림을 생성합니다. 스트림에 기록된 모든 데이터는 kubelet을 통해 대상 Pod 및 포트로 전달됩니다. 마찬가지로 이렇게 전달된 연결에 대해 Pod에서 전송되는 모든 데이터는 클라이언트의 동일한 스트림으로 다시 전달됩니다.
클라이언트는 포트 전달 요청을 완료하면 모든 스트림, 업그레이드된 연결, 기본 연결을 종료합니다.