Skip to content

Commit

Permalink
Translate socks5-proxy-access-api to korean
Browse files Browse the repository at this point in the history
Apply suggestions from code review

https://deploy-preview-36614--k8s-dev-ko.netlify.app/ko/docs/tasks/extend-kubernetes/socks5-proxy-access-api/
미리보기 참조하여 자연스럽게 수정

Apply suggestions from code review

Co-authored-by: Seokho Son <shsongist@gmail.com>
  • Loading branch information
Seo-yul and seokho-son committed Sep 13, 2022
1 parent 71bd19d commit 6b603f5
Showing 1 changed file with 145 additions and 0 deletions.
145 changes: 145 additions & 0 deletions content/ko/docs/tasks/extend-kubernetes/socks5-proxy-access-api.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,145 @@
---
title: SOCKS5 프록시를 사용하여 쿠버네티스 API에 접근
content_type: task
weight: 42
min-kubernetes-server-version: v1.24
---
<!-- overview -->

{{< feature-state for_k8s_version="v1.24" state="stable" >}}

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

## {{% heading "prerequisites" %}}

{{< include "task-tutorial-prereqs.md" >}} {{< version-check >}}

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

<!-- steps -->

## 작업 내용

{{< note >}}
아래 예시는 SSH 클라이언트 및 서버가 SOCKS 프록시 역할을 하는 SSH를 사용하여 트래픽을 터널링(tunnel)한다.
다른 종류의 [SOCKS5](https://en.wikipedia.org/wiki/SOCKS#SOCKS5) 프록시를 대신 사용할 수 있다.
{{</ note >}}

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

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

{{< mermaid >}}
graph LR;

subgraph local[로컬 클라이언트 머신]
client([클라이언트])-- 로컬 <br> 트래픽 .-> local_ssh[로컬 SSH <br> SOCKS5 프록시];
end
local_ssh[SSH <br>SOCKS5 <br> 프록시]-- SSH 터널 -->sshd

subgraph remote[원격 서버]
sshd[SSH <br> 서버]-- 로컬 트래픽 -->service1;
end
client([클라이언트])-. 프록시된 HTTPs 트래픽 <br> 프록시를 통과 .->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;
{{</ mermaid >}}
그림 1. SOCKS5 튜토리얼 구성 요소

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

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

```shell
# 아래 커맨드를 실행한 후 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` 환경 변수를 설정하고 실행하는 커맨드를 커맨드라인 툴에 전달한다.

```shell
export https_proxy=socks5h://localhost:1080
```

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

{{< note >}}
URL https://localhost:6443/api에서 `localhost`는 로컬 클라이언트 컴퓨터를 참조하지 않는다.
대신 `localhost`라고 알려진 원격 서버의 엔드포인트(endpoint)를 가리킨다.
`curl` 툴은 호스트 이름을 HTTPS URL에서 SOCKS를 통해 전송하고,
원격 서버는 이것을 로컬(루프백 인터페이스에 속하는 주소)로 처리한다.
{{</ note >}}

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

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

```yaml
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`을 사용하는 경우 프록시를 통해 클러스터와 상호 작용할 수 있다. 예시:

```shell
kubectl get pods
```

```console
NAMESPACE NAME READY STATUS RESTARTS AGE
kube-system coredns-85cb69466-klwq8 1/1 Running 0 5m46s
```

## 정리하기

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

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

## 더 읽어보기

* [OpenSSH 원격 로그인 클라이언트](https://man.openbsd.org/ssh)

0 comments on commit 6b603f5

Please sign in to comment.