Kubernetes 서비스용 프록시 로드 밸런싱
Kubernetes 서비스용 프록시 로드 밸런싱 (Proxy Load Balancing) (beta)
Cilium을 사용해 Kubernetes 서비스에 대한 프록시 로드 밸런싱을 구성하는 방법을 설명해요. 이 기능은 gRPC 로드 밸런싱 같은 사용 사례에 유용해요. 활성화하면 Kubernetes 서비스로 가는 트래픽이 로드 밸런싱을 위해 Cilium이 관리하는 Envoy 프록시로 리다이렉트돼요.
본문
이 가이드는 Cilium을 사용해 Kubernetes 서비스에 대한 프록시 로드 밸런싱을 구성하는 방법을 설명해요. gRPC 로드 밸런싱 같은 사용 사례에 유용해요. 활성화되면 Kubernetes 서비스로 가는 트래픽이 로드 밸런싱을 위해 Cilium이 관리하는 Envoy 프록시로 리다이렉트돼요. 이 기능은 Kubernetes Ingress Support 기능과는 독립적이에요.
Note 이는 베타 기능이에요. 문제가 발생하면 피드백을 주고 GitHub issue를 제출해 주세요.
테스트 애플리케이션 배포 (Deploy Test Applications)
$ kubectl apply -f https://raw.githubusercontent.com/cilium/cilium/1.20.2/examples/kubernetes/servicemesh/envoy/test-application-proxy-loadbalancing.yaml
테스트 워크로드는 다음으로 구성돼요:
- 하나의 클라이언트 deployment
client - 두 개의 백엔드 파드가 있는 하나의 서비스
echo-service.
이 파드들에 대한 정보를 확인하세요:
$ kubectl get pods --show-labels -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES LABELS
client-7dccb64ff6-t5gc7 1/1 Running 0 39s 10.244.0.125 minikube <none> <none> kind=client,name=client,pod-template-hash=7dccb64ff6
echo-service-744b6dd45b-487tn 2/2 Running 0 39s 10.244.0.71 minikube <none> <none> kind=echo,name=echo-service,other=echo,pod-template-hash=744b6dd45b
echo-service-744b6dd45b-mdjc2 2/2 Running 0 39s 10.244.0.213 minikube <none> <none> kind=echo,name=echo-service,other=echo,pod-template-hash=744b6dd45b
$ CLIENT=$(kubectl get pods -l name=client -o jsonpath='{.items[0].metadata.name}')
Hubble로 트래픽 관찰 시작 (Start Observing Traffic with Hubble)
Setting up Hubble Observability에 언급된 단계로 클러스터에서 Hubble을 활성화하세요.
두 번째 터미널을 시작한 후 hubble 포트 포워딩을 활성화하고 echo-service 서비스의 트래픽을 관찰하세요:
$ kubectl -n kube-system port-forward deployment/hubble-relay 4245:4245 &
$ hubble observe --service echo-service -f
client에서 두 백엔드 서비스 모두에 개별적으로 응답을 받을 수 있어야 해요:
$ kubectl exec -it $CLIENT -- curl -v echo-service:8080/
Hubble이 echo-service 서비스를 통해 클라이언트 파드와 백엔드 파드 사이의 모든 흐름을 보여주는 것을 볼 수 있어요.
Jan 16 04:28:10.690: default/client-7dccb64ff6-t5gc7 (ID:5152) <> default/echo-service:8080 (world) pre-xlate-fwd TRACED (TCP)
Jan 16 04:28:10.690: default/echo-service:8080 (world) <> default/client-7dccb64ff6-t5gc7 (ID:5152) post-xlate-rev TRANSLATED (TCP)
서비스에 프록시 로드 밸런싱 어노테이션 추가 (Add Proxy Load Balancing Annotations to the Services)
Layer 7 정책을 추가하면 이 트래픽의 경로에 Envoy 프록시가 도입돼요.
$ kubectl annotate service echo-service service.cilium.io/lb-l7=enabled
service/echo-service annotated
백엔드 서비스로 요청을 만들고 Hubble로 트래픽을 다시 관찰하세요:
$ kubectl exec -it $CLIENT -- curl -v echo-service:8080/
이제 요청은 Envoy 프록시를 거쳐 백엔드로 흘러가요.
Jan 16 04:32:27.737: default/client-7dccb64ff6-t5gc7:56462 (ID:5152) -> default/echo-service:8080 (world) to-proxy FORWARDED (TCP Flags: SYN)
Jan 16 04:32:27.737: default/client-7dccb64ff6-t5gc7:56462 (ID:5152) <- default/echo-service:8080 (world) to-endpoint FORWARDED (TCP Flags: SYN, ACK)
Jan 16 04:32:27.737: default/client-7dccb64ff6-t5gc7:56462 (ID:5152) -> default/echo-service:8080 (world) to-proxy FORWARDED (TCP Flags: ACK)
Jan 16 04:32:27.737: default/client-7dccb64ff6-t5gc7:56462 (ID:5152) -> default/echo-service:8080 (world) to-proxy FORWARDED (TCP Flags: ACK, PSH)
Jan 16 04:32:27.739: default/client-7dccb64ff6-t5gc7:56462 (ID:5152) <- default/echo-service:8080 (world) to-endpoint FORWARDED (TCP Flags: ACK, PSH)
Jan 16 04:32:27.740: default/client-7dccb64ff6-t5gc7:56462 (ID:5152) -> default/echo-service:8080 (world) to-proxy FORWARDED (TCP Flags: ACK, FIN)
Jan 16 04:32:27.740: default/client-7dccb64ff6-t5gc7:56462 (ID:5152) <- default/echo-service:8080 (world) to-endpoint FORWARDED (TCP Flags: ACK, FIN)
Jan 16 04:32:27.740: default/client-7dccb64ff6-t5gc7:56462 (ID:5152) -> default/echo-service:8080 (world) to-proxy FORWARDED (TCP Flags: ACK)
지원되는 어노테이션 (Supported Annotations)
| Name | Description | Applicable Values | Default Value |
|---|---|---|---|
service.cilium.io/lb-l7 |
Enable L7 Load balancing for kubernetes service. | enabled, disabled |
Defaults to disabled |
service.cilium.io/lb-l7-algorithm |
The LB algorithm to be used for services. | round_robin, least_request, random |
Defaults to Helm option loadBalancer.l7.algorithm value. |