6.8. 포트 전달을 사용하여 컨테이너의 애플리케이션에 액세스

OpenShift Container Platform에서는 Pod로 포트를 전달할 수 있습니다.

6.8.1. 포트 전달 이해

CLI를 사용하여 하나 이상의 로컬 포트를 Pod로 전달할 수 있습니다. 이 경우 지정된 포트 또는 임의의 포트에서 로컬로 수신 대기하고 Pod의 지정된 포트와 데이터를 주고받을 수 있습니다.

포트 전달 기능을 위한 지원은 CLI에 빌드되어 있습니다.

$ oc port-forward <pod> [<local_port>:]<remote_port> [...[<local_port_n>:]<remote_port_n>]

CLI는 사용자가 지정한 각 로컬 포트에서 수신 대기하고 아래에 설명된 프로토콜을 사용하여 전달합니다.

포트는 다음 형식을 사용하여 지정할 수 있습니다.

5000

클라이언트는 포트 5000에서 로컬로 수신 대기하고 Pod의 5000으로 전달합니다.

6000:5000

클라이언트는 포트 6000에서 로컬로 수신 대기하고 Pod의 5000으로 전달합니다.

:5000 또는 0:5000

클라이언트는 사용 가능한 로컬 포트를 선택하고 Pod의 5000으로 전달합니다.

OpenShift Container Platform은 클라이언트의 포트 전달 요청을 처리합니다. 요청이 수신되면 OpenShift Container Platform에서 응답을 업그레이드하고 클라이언트에서 포트 전달 스트림을 생성할 때까지 기다립니다. OpenShift Container Platform에서 새 스트림을 수신하면 스트림과 Pod의 포트 간 데이터를 복사합니다.

구조적으로 Pod의 포트로 전달할 수 있는 옵션이 있습니다. 지원되는 OpenShift Container Platform 구현에서는 노드 호스트에서 직접 nsenter를 호출하여 Pod의 네트워크 네임스페이스에 입력한 다음 socat을 호출하여 스트림과 Pod 포트 사이의 데이터를 복사합니다. 그러나 사용자 정의 구현에는 nsentersocat을 실행하는 helper Pod 실행을 포함할 수 있으므로 이러한 바이너리를 호스트에 설치할 필요가 없습니다.

6.8.2. 포트 전달 사용

CLI를 사용하여 하나 이상의 로컬 포트를 Pod로 포트 전달할 수 있습니다.

프로세스

다음 명령을 사용하여 Pod의 지정된 포트에서 수신 대기합니다.

$ oc port-forward <pod> [<local_port>:]<remote_port> [...[<local_port_n>:]<remote_port_n>]

예를 들면 다음과 같습니다.

  • 다음 명령을 사용하여 포트 50006000에서 로컬로 수신 대기하고 Pod의 포트 50006000에서 또는 해당 포트로 데이터를 전달합니다.

    $ 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

6.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 2(HTTP/2) 를 사용합니다.

클라이언트는 Pod에 대상 포트가 포함된 port 헤더를 사용하여 스트림을 생성합니다. 스트림에 기록된 모든 데이터는 kubelet을 통해 대상 Pod 및 포트로 전달됩니다. 마찬가지로 이렇게 전달된 연결에 대해 Pod에서 전송되는 모든 데이터는 클라이언트의 동일한 스트림으로 다시 전달됩니다.

클라이언트는 포트 전달 요청을 완료하면 모든 스트림, 업그레이드된 연결, 기본 연결을 종료합니다.