Information in this document may be out of date

This document has an older update date than the original, so the information it contains may be out of date. If you're able to read English, see the English version for the most up-to-date information: Use a SOCKS5 Proxy to Access the Kubernetes API

SOCKS5 프록시를 사용하여 쿠버네티스 API에 접근

기능 상태: Kubernetes v1.24 [stable]

이 문서는 SOCKS5 프록시를 사용하여 원격 쿠버네티스 클러스터의 API에 접근하는 방법을 설명한다. 이 기능은 접근하려는 클러스터의 API를 공용 인터넷에 직접 노출하지 않으려고 할 때 유용하다.

시작하기 전에

쿠버네티스 클러스터가 필요하고, kubectl 커맨드-라인 툴이 클러스터와 통신할 수 있도록 설정되어 있어야 한다. 이 튜토리얼은 컨트롤 플레인 호스트가 아닌 노드가 적어도 2개 포함된 클러스터에서 실행하는 것을 추천한다. 만약, 아직 클러스터를 가지고 있지 않다면, minikube를 사용해서 생성하거나 다음 쿠버네티스 플레이그라운드 중 하나를 사용할 수 있다.

쿠버네티스 서버의 버전은 다음과 같거나 더 높아야 함. 버전: v1.24. 버전 확인을 위해서, 다음 커맨드를 실행 kubectl version.

SSH 클라이언트 소프트웨어(ssh 도구)와 원격 서버에서 실행되는 SSH 서비스가 필요하다. 원격 서버의 SSH 서비스에 로그인할 수 있어야 한다.

작업 내용

그림 1은 이 작업에서 달성하고자 하는 목표를 나타낸다.

  • 우선 쿠버네티스 API와 통신을 시작하는 로컬 클라이언트 컴퓨터가 있다.
  • 쿠버네티스 서버/API는 원격 서버에서 호스팅된다.
  • SSH 클라이언트와 서버 소프트웨어를 사용하여 로컬 서버와 원격 서버 간에 보안 SOCKS5 터널을 생성한다. 클라이언트와 쿠버네티스 API 간의 HTTPS 트래픽은 SOCKS5 터널을 통해 전송되며, 터널은 SSH를 통해 터널링된다.

graph LR; subgraph local[로컬 클라이언트 머신] client([클라이언트])-- 로컬
트래픽 .-> local_ssh[로컬 SSH
SOCKS5 프록시]; end local_ssh[SSH
SOCKS5
프록시]-- SSH 터널 -->sshd subgraph remote[원격 서버] sshd[SSH
서버]-- 로컬 트래픽 -->service1; end client([클라이언트])-. 프록시된 HTTPs 트래픽
프록시를 통과 .->service1[쿠버네티스 API]; classDef plain fill:#ddd,stroke:#fff,stroke-width:4px,color:#000; classDef k8s fill:#326ce5,stroke:#fff,stroke-width:4px,color:#fff; classDef cluster fill:#fff,stroke:#bbb,stroke-width:2px,color:#326ce5; class ingress,service1,service2,pod1,pod2,pod3,pod4 k8s; class client plain; class cluster cluster;
그림 1. SOCKS5 튜토리얼 구성 요소

ssh를 사용하여 SOCKS5 프록시 생성하기

아래 커맨드(command)는 클라이언트 컴퓨터와 원격 서버 간에 SOCKS5 프록시를 시작한다. SOCKS5 프록시를 사용하여 클러스터의 API 서버에 연결할 수 있다.

# 아래 커맨드를 실행한 후 SSH 터널은 포그라운드(foreground)에서 실행된다.
ssh -D 1080 -q -N username@kubernetes-remote-server.example
  • -D 1080: SOCKS 프록시를 로컬 포트 1080으로 연다.
  • -q: quiet 모드. 경고 및 진단 메시지 대부분을 표시하지 않는다.
  • -N: 원격 커맨드를 실행하지 않는다. 포트 포워딩에 유용.
  • username@kubernetes-remote-server.example: 쿠버네티스 클러스터가 실행 중인 원격 SSH 서버.

클라이언트 환경 설정

쿠버네티스 API를 사용하려면 먼저, 클라이언트에게 앞에서 만든 SOCKS5 프록시를 통해 쿼리를 전송하도록 지시해야 한다.

https_proxy 환경 변수를 설정하고 실행하는 커맨드를 커맨드라인 툴에 전달한다.

export https_proxy=socks5h://localhost:1080

https_proxy 변수를 설정하면 curl과 같은 툴은 구성한 프록시를 통해 HTTPS 트래픽을 라우팅한다. 툴이 SOCKS5 프록시를 지원해야 이 기능이 동작한다.

curl -k -v https://localhost:6443/api

프록시와 함께 공식 쿠버네티스 클라이언트 kubectl을 사용하려면, ~/.kube/config 파일에서 관련 cluster 항목에 대한 proxy-url 요소를 설정한다. 예시:

apiVersion: v1
clusters:
- cluster:
    certificate-authority-data: LRMEMMW2 # 가독성을 위해서 축약함
    server: https://<API_SERVER_IP_ADRESS>:6443  # "쿠버네티스 API" 서버, 쿠버네티스-원격-서버의 IP 주소
    proxy-url: socks5://localhost:1080   # 위 다이어그램의 "SSH SOCKS5 프록시" (SOCKS를 통한 DNS 확인 기능 빌트-인)
  name: default
contexts:
- context:
    cluster: default
    user: default
  name: default
current-context: default
kind: Config
preferences: {}
users:
- name: default
  user:
    client-certificate-data: LS0tLS1CR== # 가독성을 위해서 축약함
    client-key-data: LS0tLS1CRUdJT=      # 가독성을 위해서 축약함

터널이 동작 중이고 이 클러스터를 사용하는 컨텍스트에서 kubectl을 사용하는 경우 프록시를 통해 클러스터와 상호 작용할 수 있다. 예시:

kubectl get pods
NAMESPACE     NAME                                     READY   STATUS      RESTARTS   AGE
kube-system   coredns-85cb69466-klwq8                  1/1     Running     0          5m46s

정리하기

SSH 포트 포워딩 프로세스가 실행 중인 터미널에서 CTRL+C를 눌러 프로세스를 중지한다.

터미널에 unset https_proxy를 입력하여 프록시를 통한 http 트래픽 전송을 중지한다.

더 읽어보기

최종 수정 September 06, 2022 at 12:49 AM PST: Translate socks5-proxy-access-api to korean (6b603f5d1f)