7.8. 포트 전달을 사용하여 컨테이너의 애플리케이션에 액세스
AWS의 Red Hat OpenShift Service는 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으로 전달합니다. |
AWS의 Red Hat OpenShift Service는 클라이언트의 포트 전달 요청을 처리합니다. 요청을 수신하면 AWS의 Red Hat OpenShift Service가 응답을 업그레이드하고 클라이언트가 포트 전달 스트림을 생성할 때까지 기다립니다. AWS의 Red Hat OpenShift Service가 새 스트림을 수신하면 스트림과 Pod 포트 간의 데이터를 복사합니다.
구조적으로 Pod의 포트로 전달할 수 있는 옵션이 있습니다. AWS 구현에서 지원되는 Red Hat OpenShift Service는 노드 호스트에서 직접 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에서 전송되는 모든 데이터는 클라이언트의 동일한 스트림으로 다시 전달됩니다.
클라이언트는 포트 전달 요청을 완료하면 모든 스트림, 업그레이드된 연결, 기본 연결을 종료합니다.