레이트 리밋팅 구성
이 가이드에서는 HTTPLocalRateLimitPolicy 리소스를 배포해 특정 서비스로 가는 트래픽을 레이트 리밋하는 방법을 단계별로 알아봐요.
Linkerd의 레이트 리밋팅에 대한 자세한 내용은 Rate Limiting 기능 문서와 HTTPLocalRateLimitPolicy 레퍼런스 문서를 확인하세요.
레이트 리밋된 서비스 주변에서 클라이언트가 로드 밸런싱하도록 구성하는 방법은 Rate Limit Aware Load Balancing을 참고하세요.
본문
사전 요구 사항
이 가이드를 사용하려면 Linkerd 인스턴스가 실행 중인 Kubernetes 클러스터만 있으면 돼요. Installing Linkerd 가이드를 따라 설치할 수 있어요.
설정
먼저 Emojivoto 애플리케이션을 주입하고 설치한 뒤, 테스트를 방해하지 않도록 vote-bot 워크로드를 스케일 다운해요.
linkerd inject https://run.linkerd.io/emojivoto.yml | kubectl apply -f -
kubectl -n emojivoto scale --replicas 0 deploy/vote-bot
마지막으로 Ubuntu 이미지의 워크로드를 배포하고, 그 안에 셸을 열어 curl을 설치해요.
kubectl create deployment client --image ubuntu -- bash -c "sleep infinity"
kubectl exec -it client-xxx -- bash
root@client-xxx:/# apt-get update && apt-get install -y curl
아래에서 요청을 보낼 때 사용할 수 있도록 그 셸은 열어 둬요.
HTTPLocalRateLimitPolicy 리소스 생성
먼저 web-svc 서비스를 가리키는 Server 리소스를 만들어야 해요. 이 Server는 accessPolicy: all-unauthenticated를 가지는데, 이는 트래픽이 기본적으로 허용되며 이와 연관된 인증 정책을 선언할 필요가 없다는 뜻이에요.
kubectl apply -f -
---
apiVersion: policy.linkerd.io/v1beta3
kind: Server
metadata:
namespace: emojivoto
name: web-http
spec:
accessPolicy: all-unauthenticated
podSelector:
matchLabels:
app: web-svc
port: http
proxyProtocol: HTTP/1
EOF
이제 그 Server를 가리키는 HTTPLocalRateLimitPolicy 리소스를 적용해요. 지금은 아이덴티티당 4 RPS로 제한을 설정해 볼게요.
kubectl apply -f -
---
apiVersion: policy.linkerd.io/v1alpha1
kind: HTTPLocalRateLimitPolicy
metadata:
namespace: emojivoto
name: web-http
spec:
targetRef:
group: policy.linkerd.io
kind: Server
name: web-http
identity:
requestsPerSecond: 4
EOF
요청 보내기
Ubuntu 셸에서 web-svc.emojivoto로 10개의 동시 요청을 보내요.
root@client-xxx:/# results=$(for i in {1..10}; do curl -s -o /dev/null -w "%{http_code}\n" "http://web-svc.emojivoto" & done; wait)
root@client-xxx:/# echo $results
200 200 200 429 429 429 429 200 429 429
4개의 요청만 허용된 것을 볼 수 있어요. 레이트 리밋된 요청은 429 HTTP 상태 코드와 함께 응답을 받아요.
오버라이드(Overrides)
앞서 사용한 클라이언트는 기본 네임스페이스에 배포되어 아이덴티티가 없었어요. 기본적으로 네임스페이스의 워크로드는 주입되지 않기 때문이에요.
이제 emojivoto 네임스페이스에 새 Ubuntu 워크로드를 만들어요. 이 워크로드는 기본적으로 주입되며, 그 아이덴티티는 emojivoto 네임스페이스의 default ServiceAccount와 연결돼요.
kubectl -n emojivoto create deployment client --image ubuntu -- bash -c "sleep infinity"
kubectl -n emojivoto exec -it client-xxx -c ubuntu -- bash
root@client-xxx:/# apt-get update && apt-get install -y curl
요청을 보내기 전에, 이 특정 클라이언트에 대한 오버라이드를 추가하도록 HTTPLocalRateLimitPolicy 리소스를 확장해요. 이 오버라이드는 최대 6 RPS까지 요청을 보낼 수 있게 해줘요.
kubectl apply -f -
---
apiVersion: policy.linkerd.io/v1alpha1
kind: HTTPLocalRateLimitPolicy
metadata:
namespace: emojivoto
name: web-http
spec:
targetRef:
group: policy.linkerd.io
kind: Server
name: web-http
identity:
requestsPerSecond: 4
overrides:
- requestsPerSecond: 6
clientRefs:
- kind: ServiceAccount
namespace: emojivoto
name: default
EOF
마지막으로 셸로 돌아가서 요청을 실행해요.
root@client-xxx:/# results=$(for i in {1..10}; do curl -s -o /dev/null -w "%{http_code}\n" "http://web-svc.emojivoto" & done; wait)
root@client-xxx:/# echo $results
429 429 429 429 200 200 200 200 200 200
이제 6개의 요청이 허용된 것을 볼 수 있어요. 아까 그 클라이언트로 다시 시도하면 여전히 4개만 허용되는 것도 확인할 수 있을 거예요.