SOCKS5 프록시를 사용하여 쿠버네티스 API에 접근
Kubernetes v1.24 [stable]
이 문서는 SOCKS5 프록시를 사용하여 원격 쿠버네티스 클러스터의 API에 접근하는 방법을 설명한다. 이 기능은 접근하려는 클러스터의 API를 공용 인터넷에 직접 노출하지 않으려고 할 때 유용하다.
시작하기 전에
쿠버네티스 클러스터가 필요하고, kubectl 커맨드-라인 툴이 클러스터와 통신할 수 있도록 설정되어 있어야 한다. 이 튜토리얼은 컨트롤 플레인 호스트가 아닌 노드가 적어도 2개 포함된 클러스터에서 실행하는 것을 추천한다. 만약, 아직 클러스터를 가지고 있지 않다면, minikube를 사용해서 생성하거나 다음 쿠버네티스 플레이그라운드 중 하나를 사용할 수 있다.
쿠버네티스 서버의 버전은 다음과 같거나 더 높아야 함. 버전: v1.24. 버전 확인을 위해서, 다음 커맨드를 실행kubectl version
.SSH 클라이언트 소프트웨어(ssh
도구)와 원격 서버에서 실행되는 SSH 서비스가 필요하다.
원격 서버의 SSH 서비스에 로그인할 수 있어야 한다.
작업 내용
참고:
아래 예시는 SSH 클라이언트 및 서버가 SOCKS 프록시 역할을 하는 SSH를 사용하여 트래픽을 터널링(tunnel)한다. 다른 종류의 SOCKS5 프록시를 대신 사용할 수 있다.그림 1은 이 작업에서 달성하고자 하는 목표를 나타낸다.
- 우선 쿠버네티스 API와 통신을 시작하는 로컬 클라이언트 컴퓨터가 있다.
- 쿠버네티스 서버/API는 원격 서버에서 호스팅된다.
- SSH 클라이언트와 서버 소프트웨어를 사용하여 로컬 서버와 원격 서버 간에 보안 SOCKS5 터널을 생성한다. 클라이언트와 쿠버네티스 API 간의 HTTPS 트래픽은 SOCKS5 터널을 통해 전송되며, 터널은 SSH를 통해 터널링된다.
그림 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 프록시를 지원해야 이 기능이 동작한다.
참고:
URL https://localhost:6443/api에서localhost
는 로컬 클라이언트 컴퓨터를 참조하지 않는다.
대신 localhost
라고 알려진 원격 서버의 엔드포인트(endpoint)를 가리킨다.
curl
툴은 호스트 이름을 HTTPS URL에서 SOCKS를 통해 전송하고,
원격 서버는 이것을 로컬(루프백 인터페이스에 속하는 주소)로 처리한다.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 트래픽 전송을 중지한다.