QoS 컨트롤 구성
QoS 컨트롤 구성 (Configure QoS Controls)
QoS(Quality of Service) 컨트롤을 구성하면 Calico 워크로드가 네트워크 자원을 과도하게 사용하거나 과부하를 주는 것을 막을 수 있어요. 팟의 인그레스/이그레스 대역폭, 패킷 전송률, 연결 수를 제한하고, 이그레스 트래픽에 DiffServ 마킹까지 적용할 수 있어요. 이 문서는 Kubernetes 팟 어노테이션 기반 QoS 컨트롤을 다뤄요.
출처: 문서
본문
큰 그림 (Big picture)
Calico 워크로드가 네트워크 자원을 과도하게 사용하거나 과부하를 일으키지 않도록, 인그레스 및/또는 이그레스 대역폭, 패킷 전송률, 연결 수를 제한하는 QoS(Quality of Service) 컨트롤을 구성하세요. 추가로 Calico 워크로드와 호스트의 이그레스 트래픽에 차별화 서비스(Differentiated Services, DiffServ)를 구성할 수도 있어요.
참고 (SECONDARY): 이 페이지는 팟 어노테이션을 사용하는 Kubernetes 워크로드의 QoS 컨트롤을 다뤄요. OpenStack과 함께 Calico를 사용한다면 QoS는 Neutron 정책으로 구성하는 완전히 별개의 메커니즘이에요. OpenStack의 QoS 컨트롤을 참고하세요.
가치 (Value)
QoS 컨트롤을 사용하면 Calico가 Kubernetes 팟에 네트워크 자원 한도(대역폭, 패킷 전송률, 연결 수)를 강제해서 자원 배분의 공정성을 보장하고 다른 워크로드의 성능 저하를 막아줘요. Calico는 이그레스 트래픽에 DiffServ를 적용할 수도 있어서 업스트림 장비가 그에 맞춰 포워딩 우선순위를 정할 수 있어요.
사전 준비물
- eBPF 데이터플레인을 사용한다면, 대역폭 QoS 컨트롤을 구성하기 위해 Linux 노드가 커널 버전 6.6 이상에서 실행 중이어야 해요.
개념 (Concepts)
QoS(Quality of Service) 컨트롤
컴퓨터 네트워킹 분야에서 **QoS(Quality of Service)**는 트래픽 우선순위 지정과 자원 예약 제어 메커니즘을 가리켜요. 최소 수준의 네트워크 자원을 보장한다는 의미일 수도 있고, 소수 사용자가 자원을 독점해 다른 사람들이 몫을 쓰지 못하는 상황을 막기 위해 최대 사용량을 제한한다는 의미일 수도 있어요. 실용적인 목적에서는 후자를 다뤄요. Calico는 네트워크 자원 사용량의 최대치를 제한하는 방식으로 QoS 컨트롤을 구현하거든요.
Calico는 세 가지 유형의 QoS 컨트롤을 구현하고, Kubernetes 팟의 어노테이션으로 인그레스(팟으로 들어오는 트래픽), 이그레스(팟에서 나가는 트래픽), 또는 둘 다에 대해 구성할 수 있어요.
- 대역폭: 팟으로 들어오고/나가는 트래픽의 비트 전송률 제한
- 패킷 전송률: 팟이 초당 보내거나 받을 수 있는 패킷 수 제한
- 설정된 연결 수: 팟이 시작하거나 수락할 수 있는 연결의 절대 개수 제한
- 차별화 서비스(DiffServ): 클러스터 밖으로 또는 호스트 방향으로 나가는 이그레스 트래픽에 Differentiated Services Code Point(DSCP) 설정
어노테이션 (Annotations)
Kubernetes에서 Calico는 QoS 컨트롤 구성에 팟의 어노테이션을 사용해요.
QoS 컨트롤 어노테이션의 값에는 큰 수를 나타내는 k, M, G, T, P, E 같은 접미사가 붙을 수 있어요. 1Ki가 "1024"를 나타내는 것처럼 바이너리 접미사도 지원해요.
예를 들어 이그레스 대역폭을 100Mbps로, 최대 버스트 200Mb로 제한하려면 다음과 같이 해요.
apiVersion: apps/v1
kind: Deployment
metadata:
name: my-deployment
labels:
app: my-app
spec:
replicas: 3
template:
metadata:
annotations:
qos.projectcalico.org/egressBandwidth: "100M"
qos.projectcalico.org/egressBurst: "200M"
spec:
(...)
방법 (How to)
대역폭 제한 구성
팟으로 들어오거나 나가는 트래픽의 대역폭과 버스트 한도를 구성하려면 아래 어노테이션을 사용하세요. 대역폭을 제한하면 평균적으로 그 값이 최대 비트 전송률이 되도록 강제해요. 버스트 크기는 순간적으로 전송에 쓸 수 있는 데이터 양이에요. 버스트 구성은 선택 사항이고, 어노테이션으로 명시적으로 설정하지 않으면 기본값 4Gib가 사용돼요. 피크 전송률(peak rate) 제한을 설정하면 버스트 트래픽도 그 한도를 넘지 못해요. 설정하지 않으면 버스트 트래픽에는 제한이 없어요.
| 어노테이션 | 설명 |
|---|---|
qos.projectcalico.org/ingressBandwidth |
인그레스 대역폭 한도를 지정해요 (초당 비트). 최소값: 1k 최대값: 1P |
qos.projectcalico.org/ingressBurst |
인그레스 버스트 크기를 지정해요 (비트). 선택 사항이며 기본값은 4Gi예요. 최소값: 1k 최대값: 34359738360 |
qos.projectcalico.org/ingressPeakrate |
인그레스 피크 전송률 한도, 즉 버스트 상황에서의 대역폭 한도를 지정해요 (초당 비트). 선택 사항이며 기본값은 무제한이에요. 대역폭 한도보다 높아야 해요. 최소값: 1.01k 최대값: 1.01P |
qos.projectcalico.org/ingressMinburst |
인그레스 minburst, 즉 피크 전송률에 대한 버스트 크기를 지정해요 (바이트 단위). 선택 사항이며 기본값은 MTU 값이에요. 최소값: 1k 최대값: 100M |
qos.projectcalico.org/egressBandwidth |
이그레스 대역폭 한도를 지정해요 (초당 비트). 최소값: 1k 최대값: 1P |
qos.projectcalico.org/egressBurst |
이그레스 버스트 크기를 지정해요 (비트). 선택 사항이며 기본값은 4Gi예요. 최소값: 1k 최대값: 34359738360 |
qos.projectcalico.org/egressPeakrate |
이그레스 피크 전송률 한도, 즉 버스트 상황에서의 대역폭 한도를 지정해요 (초당 비트). 선택 사항이며 기본값은 무제한이에요. 대역폭 한도보다 높아야 해요. 최소값: 1.01k 최대값: 1.01P |
qos.projectcalico.org/egressMinburst |
이그레스 minburst, 즉 피크 전송률에 대한 버스트 크기를 지정해요 (바이트 단위). 선택 사항이며 기본값은 MTU 값이에요. 최소값: 1k 최대값: 100M |
Kubernetes 대역폭 플러그인의 어노테이션인 kubernetes.io/ingress-bandwidth 또는 kubernetes.io/egress-bandwidth가 설정되어 있고 qos.projectcalico.org 어노테이션이 없다면, 해당 어노테이션이 존중되고 Calico가 그 값을 기반으로 대역폭 한도를 구성해요. Calico 고유 어노테이션이 우선하기 때문에 둘 다 설정되어 있으면 Kubernetes 어노테이션은 무시돼요. 덕분에 대역폭 플러그인을 쓰던 Calico 버전에서 네이티브 대역폭 제한 버전으로 업그레이드해도 동작이 버전 간에 일관되게 유지돼요(이전에 Kubernetes 대역폭 플러그인이 제공하던 기능을 Calico가 대체해요).
대역폭 플러그인과 Calico 구현의 중요한 차이 하나는, Calico에서는 대역폭 한도가 즉시 적용되지만 대역폭 플러그인에서는 한도가 적용되려면 팟을 다시 만들어야 한다는 점이에요.
| 어노테이션 | 설명 |
|---|---|
kubernetes.io/ingress-bandwidth |
인그레스 대역폭 한도(초당 비트)를 위한 Kubernetes 대역폭 플러그인 어노테이션이에요. qos.projectcalico.org/ingressBandwidth가 있으면 무시돼요. 최소값: 1k 최대값: 1P |
kubernetes.io/egress-bandwidth |
이그레스 대역폭 한도(초당 비트)를 위한 Kubernetes 대역폭 플러그인 어노테이션이에요. qos.projectcalico.org/egressBandwidth가 있으면 무시돼요. 최소값: 1k 최대값: 1P |
패킷 전송률 제한 구성
팟으로 들어오거나 나가는 트래픽의 패킷 전송률 제한을 구성하려면 아래 어노테이션을 사용하세요. 패킷 전송률을 제한하면 평균적으로 그 값이 팟이 패킷을 보내고/받을 수 있는 최대 전송률이 되도록 강제해요. 패킷 버스트 크기는 순간적으로 전송에 쓸 수 있는 패킷 수예요. 패킷 버스트 구성은 선택 사항이고, 어노테이션으로 명시적으로 설정하지 않으면 기본값 5 패킷이 사용돼요.
| 어노테이션 | 설명 |
|---|---|
qos.projectcalico.org/ingressPacketRate |
인그레스 패킷의 최대 전송률을 지정해요 (초당 패킷). 최소값: 1 최대값: 10k |
qos.projectcalico.org/ingressPacketBurst |
인그레스 패킷 버스트 크기를 지정해요 (패킷 수). 선택 사항이며 기본값은 5예요. 최소값: 1 최대값: 10k |
qos.projectcalico.org/egressPacketRate |
이그레스 패킷의 최대 전송률을 지정해요 (초당 패킷). 최소값: 1 최대값: 10k |
qos.projectcalico.org/egressPacketBurst |
이그레스 패킷 버스트 크기를 지정해요 (패킷 수). 선택 사항이며 기본값은 5예요. 최소값: 1 최대값: 10k |
설정된 연결 수 제한 구성
팟으로 들어오거나 나가는 설정된(established) 연결 수 제한을 구성하려면 아래 어노테이션을 사용하세요. 연결 수를 제한하면 팟이 지정한 한도를 넘는 연결을 수락하거나 시작할 수 없게 강제돼요.
| 어노테이션 | 설명 |
|---|---|
qos.projectcalico.org/ingressMaxConnections |
인그레스 연결의 최대 개수를 지정해요. 최소값: 1 최대값: 4294967295 |
qos.projectcalico.org/egressMaxConnections |
이그레스 연결의 최대 개수를 지정해요. 최소값: 1 최대값: 4294967295 |
DiffServ 구성
아래 어노테이션을 사용하면 클러스터 밖의 엔드포인트나 클러스터 내 다른 호스트를 향하는 이그레스 트래픽에 DSCP를 설정할 수 있어요. 다른 QoS 컨트롤과 달리 이 어노테이션은 호스트 엔드포인트에도 설정할 수 있어요. 예를 들어 호스트 엔드포인트에 DSCP AF11을 설정하려면 다음과 같이 해요.
apiVersion: projectcalico.org/v3
kind: HostEndpoint
metadata:
name: my-hep
annotations:
qos.projectcalico.org/dscp: "AF11"
labels:
app: my-app
spec:
(...)
| 어노테이션 | 설명 |
|---|---|
qos.projectcalico.org/dscp |
클러스터 밖의 엔드포인트나 클러스터 내 다른 호스트를 향하는 이그레스 트래픽의 DSCP 값을 지정해요. 최소값: 0 최대값: 63 문자열 값: DF, EF, AF11, AF12, AF13, AF21, AF22, AF23, AF31, AF32, AF33, AF41, AF42, AF43, CS0, CS1, CS2, CS3, CS4, CS5, CS6 |
트러블슈팅
eBPF에서 대역폭이 강제되지 않는 경우
eBPF 데이터플레인을 사용하는데 대역폭 제한이 적용되지 않는다면, calico-node 로그에서 운영체제가 tcx를 지원하는지 확인하세요. tcx는 Linux 커널 6.6 이상에 포함되어 있고, eBPF 데이터플레인에서 대역폭 제한이 동작하려면 필요해요.
다음 예제는 지원되지 않는 커널 버전임을 나타내는 로그예요.
$ kubectl logs -n calico-system ds/calico-node | grep tcx
Found 4 pods, using pod/calico-node-j9z5d
Defaulted container "calico-node" out of: calico-node, flexvol-driver (init), ebpf-bootstrap (init), install-cni (init)
bird: libbpf: prog 'cali_tcx_test': failed to attach to tcx: Invalid argument
2025-10-15 16:31:48.522 [INFO][81] felix/bpf_ep_mgr.go 595: tcx is not supported. Falling back to tc
추가 리소스
더 알아보기 (Learn more)
QoS 컨트롤은 팟이 네트워크 자원을 독점하지 않도록 막아 주는 Calico의 자원 제한 기능이에요. 대역폭, 패킷 전송률, 연결 수를 팟 어노테이션으로 손쉽게 제한할 수 있어요. eBPF 데이터플레인에서는 커널 6.6 이상이 필요하다는 점만 기억하세요.