|
| 1 | +--- |
| 2 | + |
| 3 | + |
| 4 | +title: 토폴로지 인지 힌트 |
| 5 | +content_type: concept |
| 6 | +weight: 45 |
| 7 | +--- |
| 8 | + |
| 9 | + |
| 10 | +<!-- overview --> |
| 11 | + |
| 12 | +{{< feature-state for_k8s_version="v1.23" state="beta" >}} |
| 13 | + |
| 14 | +_토폴로지 인지 힌트(Topology Aware Hints)_ 는 클라이언트가 엔드포인트를 어떻게 사용해야 하는지에 대한 제안을 포함시킴으로써 |
| 15 | +토폴로지 인지 라우팅을 가능하게 한다. |
| 16 | +이러한 접근은 엔드포인트슬라이스(EndpointSlice) 및 엔드포인트(Endpoint) 오브젝트의 소비자(consumer)가 이용할 수 있는 메타데이터를 추가하며, |
| 17 | +이를 통해 해당 네트워크 엔드포인트로의 트래픽이 근원지에 더 가깝게 라우트될 수 있다. |
| 18 | + |
| 19 | +예를 들어, 비용을 줄이거나 네트워크 성능을 높이기 위해, |
| 20 | +인접성을 고려하여 트래픽을 라우트할 수 있다. |
| 21 | + |
| 22 | +<!-- body --> |
| 23 | + |
| 24 | +## 동기(motivation) |
| 25 | + |
| 26 | +쿠버네티스 클러스터가 멀티-존(multi-zone) 환경에 배포되는 일이 점점 많아지고 있다. |
| 27 | +_토폴로지 인지 힌트_ 는 트래픽이 발생한 존 내에서 트래픽을 유지하도록 처리하는 메커니즘을 제공한다. |
| 28 | +이러한 개념은 보통 "토폴로지 인지 라우팅"이라고 부른다. |
| 29 | +{{< glossary_tooltip text="서비스" term_id="Service" >}}의 엔드포인트를 계산할 때, |
| 30 | +엔드포인트슬라이스 컨트롤러는 각 엔드포인트의 토폴로지(지역(region) 및 존)를 고려하여, |
| 31 | +엔드포인트가 특정 존에 할당되도록 힌트 필드를 채운다. |
| 32 | +그러면 {{< glossary_tooltip term_id="kube-proxy" text="kube-proxy" >}}와 같은 |
| 33 | +클러스터 구성 요소는 해당 힌트를 인식하고, |
| 34 | +(토폴로지 상 가까운 엔드포인트를 사용하도록) 트래픽 라우팅 구성에 활용한다. |
| 35 | + |
| 36 | +## 토폴로지 인지 힌트 사용하기 |
| 37 | + |
| 38 | +`service.kubernetes.io/topology-aware-hints` 어노테이션을 `auto`로 설정하여 |
| 39 | +서비스에 대한 토폴로지 인지 힌트를 활성화할 수 있다. |
| 40 | +이는 엔드포인트슬라이스 컨트롤러가 안전하다고 판단되는 경우 토폴로지 힌트를 설정하도록 지시하는 것이다. |
| 41 | +명심할 점은, 이를 수행한다고 해서 힌트가 항상 설정되는 것은 아니라는 것이다. |
| 42 | + |
| 43 | +## 동작 방법 {#implementation} |
| 44 | + |
| 45 | +이 기능을 동작시키는 요소는 |
| 46 | +엔드포인트슬라이스 컨트롤러와 kube-proxy 두 구성요소로 나눠져 있다. |
| 47 | +이 섹션에서는 각 구성요소가 어떻게 이 기능을 동작시키는지에 대한 고차원 개요를 제공한다. |
| 48 | + |
| 49 | +### 엔드포인트슬라이스 컨트롤러 {#implementation-control-plane} |
| 50 | + |
| 51 | +엔드포인트슬라이스 컨트롤러는 이 기능이 활성화되어 있을 때 |
| 52 | +엔드포인트슬라이스에 힌트를 설정하는 일을 담당한다. |
| 53 | +컨트롤러는 각 존에 일정 비율의 엔드포인트를 할당한다. |
| 54 | +이 비율은 해당 존에 있는 노드의 |
| 55 | +[할당 가능한(allocatable)](/docs/tasks/administer-cluster/reserve-compute-resources/#node-allocatable) CPU 코어에 의해 결정된다. |
| 56 | +예를 들어, 한 존에 2 CPU 코어가 있고 다른 존에 1 CPU 코어만 있는 경우, |
| 57 | +컨트롤러는 2 CPU 코어가 있는 존에 엔드포인트를 2배 할당할 것이다. |
| 58 | + |
| 59 | +다음 예시는 엔드포인트슬라이스에 힌트가 채워졌을 때에 대한 |
| 60 | +예시이다. |
| 61 | + |
| 62 | +```yaml |
| 63 | +apiVersion: discovery.k8s.io/v1 |
| 64 | +kind: EndpointSlice |
| 65 | +metadata: |
| 66 | + name: example-hints |
| 67 | + labels: |
| 68 | + kubernetes.io/service-name: example-svc |
| 69 | +addressType: IPv4 |
| 70 | +ports: |
| 71 | + - name: http |
| 72 | + protocol: TCP |
| 73 | + port: 80 |
| 74 | +endpoints: |
| 75 | + - addresses: |
| 76 | + - "10.1.2.3" |
| 77 | + conditions: |
| 78 | + ready: true |
| 79 | + hostname: pod-1 |
| 80 | + zone: zone-a |
| 81 | + hints: |
| 82 | + forZones: |
| 83 | + - name: "zone-a" |
| 84 | +``` |
| 85 | +
|
| 86 | +### kube-proxy {#implementation-kube-proxy} |
| 87 | +
|
| 88 | +kube-proxy 구성요소는 엔드포인트슬라이스 컨트롤러가 설정한 힌트를 기반으로 |
| 89 | +자신이 라우팅하는 엔드포인트를 필터링한다. |
| 90 | +대부분의 경우, 이는 kube-proxy가 동일 존 내에서 트래픽을 엔드포인트로 라우팅할 수 있음을 뜻한다. |
| 91 | +때때로 컨트롤러는 존 사이에 보다 균등한 엔드포인트 분배를 위해 다른 존으로부터 엔드포인트를 할당하기도 한다. |
| 92 | +이러한 경우 일부 트래픽은 다른 존으로 라우팅될 것이다. |
| 93 | +
|
| 94 | +## 보호 규칙 |
| 95 | +
|
| 96 | +쿠버네티스 컨트롤 플레인과 각 노드의 kube-proxy는 |
| 97 | +토폴로지 인지 힌트를 사용하기 전에 몇 가지 보호 규칙을 적용한다. |
| 98 | +이들이 만족되지 않으면, kube-proxy는 존에 상관없이 |
| 99 | +클러스터의 모든 곳으로부터 엔드포인트를 선택한다. |
| 100 | +
|
| 101 | +1. **엔드포인트 수가 충분하지 않음:** 존의 숫자보다 엔드포인트의 숫자가 적으면, |
| 102 | + 컨트롤러는 어떤 힌트도 할당하지 않을 것이다. |
| 103 | +
|
| 104 | +2. **균형잡힌 할당이 불가능함:** 일부 경우에, 존 간 균형잡힌 엔드포인트 할당이 불가능할 수 있다. |
| 105 | + 예를 들어, zone-a가 zone-b보다 2배 큰 상황에서, |
| 106 | + 엔드포인트가 2개 뿐이라면, |
| 107 | + zone-a에 할당된 엔드포인트는 zone-b에 할당된 엔드포인트보다 2배의 트래픽을 수신할 것이다. |
| 108 | + 컨트롤러는 이 "예상 과부하" 값을 각 존에 대해 |
| 109 | + 허용 가능한 임계값보다 작게 낮출 수 없는 경우에는 힌트를 할당하지 않는다. |
| 110 | + 명심할 점은, 이것이 실시간 피드백 기반이 아니라는 것이다. |
| 111 | + 개별 엔드포인트가 과부하 상태로 바뀔 가능성도 여전히 있다. |
| 112 | +
|
| 113 | +3. **하나 이상의 노드에 대한 정보가 불충분함:** `topology.kubernetes.io/zone` 레이블이 없는 노드가 있거나 |
| 114 | + 할당 가능한 CPU 값을 보고하지 않는 노드가 있으면, |
| 115 | + 컨트롤 플레인은 토폴로지 인지 엔드포인트를 설정하지 않으며 |
| 116 | + 이로 인해 kube-proxy는 존 별로 엔드포인트를 필터링하지 않는다. |
| 117 | + |
| 118 | +4. **하나 이상의 엔드포인트에 존 힌트가 없음:** 이러한 상황이 발생하면, |
| 119 | + kube-proxy는 토폴로지 인지 힌트로부터의 또는 토폴로지 인지 힌트로의 전환이 진행 중이라고 가정한다. |
| 120 | + 이 상태에서 서비스의 엔드포인트를 필터링하는 것은 위험할 수 있으므로 |
| 121 | + kube-proxy는 모든 엔드포인트를 사용하는 모드로 전환된다. |
| 122 | + |
| 123 | +5. **힌트에 존이 기재되지 않음:** kube-proxy가 실행되고 있는 존을 향하는 힌트를 갖는 엔드포인트를 |
| 124 | + 하나도 찾지 못했다면, |
| 125 | + 모든 존에서 오는 엔드포인트를 사용하는 모드로 전환된다. |
| 126 | + 이러한 경우는 기존에 있던 클러스터에 새로운 존을 추가하는 경우에 발생할 가능성이 가장 높다. |
| 127 | + |
| 128 | +## 제약사항 |
| 129 | + |
| 130 | +* 토폴로지 인지 힌트는 서비스의 `externalTrafficPolicy` 또는 |
| 131 | + `internalTrafficPolicy`가 `Local`로 설정된 경우에는 사용되지 않는다. |
| 132 | + 동일 클러스터의 서로 다른 서비스들에 대해 두 기능 중 하나를 사용하는 것은 가능하며, |
| 133 | + 하나의 서비스에 두 기능 모두를 사용하는 것은 불가능하다. |
| 134 | + |
| 135 | +* 이러한 접근 방법은 존의 일부분에서 |
| 136 | + 많은 트래픽이 발생하는 서비스에는 잘 작동하지 않을 것이다. |
| 137 | + 대신, 들어오는 트래픽이 |
| 138 | + 각 존 내 노드 용량에 대략 비례한다고 가정한다. |
| 139 | + |
| 140 | +* 엔드포인트슬라이스 컨트롤러는 각 존 내의 비율을 계산할 때 |
| 141 | + 준비되지 않은(unready) 노드는 무시한다. |
| 142 | + 이 때문에 많은 노드가 준비되지 않은 상태에서는 의도하지 않은 결과가 나타날 수도 있다. |
| 143 | + |
| 144 | +* 엔드포인트슬라이스 컨트롤러는 각 존 내의 비율을 계산할 때 |
| 145 | + {{< glossary_tooltip text="톨러레이션" term_id="toleration" >}}은 고려하지 않는다. |
| 146 | + 서비스를 구성하는 파드가 클러스터의 일부 노드에만 배치되어 있는 경우, |
| 147 | + 이러한 상황은 고려되지 않을 것이다. |
| 148 | + |
| 149 | +* 오토스케일링 기능과는 잘 동작하지 않을 수 있다. |
| 150 | + 예를 들어, 하나의 존에서 많은 트래픽이 발생하는 경우, |
| 151 | + 해당 존에 할당된 엔드포인트만 트래픽을 처리하고 있을 것이다. |
| 152 | + 이로 인해 {{< glossary_tooltip text="Horizontal Pod Autoscaler" term_id="horizontal-pod-autoscaler" >}}가 |
| 153 | + 이 이벤트를 감지하지 못하거나, |
| 154 | + 또는 새롭게 추가되는 파드가 다른 존에 추가될 수 있다. |
| 155 | + |
| 156 | +## {{% heading "whatsnext" %}} |
| 157 | + |
| 158 | +* [서비스와 애플리케이션 연결하기](/ko/docs/concepts/services-networking/connect-applications-service/)를 읽어본다. |
0 commit comments