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 트래픽 전송을 중지한다.

더 읽어보기

최종 수정 June 20, 2024 at 12:44 PM PST: Sync changest from andygol/k8s-website (36d05bc8a1)