L7 인지 트래픽 관리
L7 인지 트래픽 관리 (L7-Aware Traffic Management)
Cilium은 CRD(예: CiliumEnvoyConfig와 CiliumClusterwideEnvoyConfig)를 통해 L7 트래픽을 제어하는 방법을 제공해요. 사용 전 사전 요구사항과 caveat를 확인하고, 설치·지원 Envoy 확장을 파악하는 것이 중요해요.
본문
Cilium은 CRD(예: CiliumEnvoyConfig와 CiliumClusterwideEnvoyConfig)를 통해 L7 트래픽을 제어하는 방법을 제공해요.
사전 요구사항 (Prerequisites)
- Cilium은
kubeProxyReplacement=true로 kube-proxy 교체가 구성되어야 해요. 자세한 내용은 kube-proxy replacement를 참고해주세요.
Caveats (주의사항)
CiliumEnvoyConfig리소스는 최소한의 검증만 수행되며, 정의된 충돌 해결 동작이 없어요. 즉 Envoy 구성의 같은 부분을 수정하는 여러 CEC를 만들면 결과가 예측 불가능할 수 있어요.- 이 최소 검증에 더해
CiliumEnvoyConfig는 사용자에게 구성의 정확성에 대한 피드백이 거의 없어요. 그래서 CEC가 바람직하지 않은 결과를 만드는 경우, 문제 해결은 해당CiliumEnvoyConfig를 보는 대신 Envoy 구성과 로그를 검사해야 해요. CiliumEnvoyConfig와CiliumClusterwideEnvoyConfig리소스는 구현 세부사항이에요. 둘 다 클러스터 관리자 리소스로 취급해야 하며, 그 구성 권한을 다른 사용자에게 위임해서는 안 돼요.CiliumEnvoyConfig는 Cilium의 Ingress 및 Gateway API 지원이 노드별 Envoy 프록시를 통해 트래픽을 보내는 데 사용돼요. 자동 생성된 구성과 충돌하거나 수정하는 CEC를 만들면 결과가 예측 불가능할 수 있어요. 이런 사용 사례에 CEC를 사용할 때는 매우 주의해주세요. 위의 위험은 Cilium이 생성하는 모든 구성이 가능한 한 의미적으로 유효하도록 보장해 관리해요.CiliumEnvoyConfig리소스를 직접 만든다면(즉 Cilium Ingress 또는 Gateway API 컨트롤러를 통하지 않고), CEC가 동서(E/W) 트래픽을 관리하려는 경우cec.cilium.io/use-original-source-address: "false"어노테이션을 설정하세요. 그렇지 않으면 Envoy가 업스트림 연결 풀용 소켓을 원래 소스 주소/포트에 바인딩해요. 이는 파드가 동일한 파이프라인된 HTTP/1.1 또는 HTTP/2 연결을 통해 여러 요청을 보낼 때 5-tuple 충돌을 일으킬 수 있어요. (Cilium agent는 parentRefs가 Cilium Ingress 또는 Gateway API 컨트롤러를 가리키는 모든 CEC에cec.cilium.io/use-original-source-address가"false"로 설정돼 있다고 가정하지만, 다른 모든 CEC는 이 어노테이션이"true"로 설정돼 있다고 가정해요.)
설치 (Installation)
Helm으로 활성화하기 — Cilium Ingress Controller는 helm 플래그 ingressController.enabled를 true로 설정해서 활성화할 수 있어요. 새 설치에 대해서는 Installation using Helm을 참고해주세요.
helm upgrade cilium cilium/cilium --version 1.20.2 \
--namespace kube-system \
--reuse-values \
--set ingressController.enabled=true \
--set ingressController.loadbalancerMode=dedicated
kubectl -n kube-system rollout restart deployment/cilium-operator
kubectl -n kube-system rollout restart ds/cilium
helm upgrade cilium oci://quay.io/cilium/charts/cilium 1.20.2 \
--namespace kube-system \
--reuse-values \
--set ingressController.enabled=true \
--set ingressController.loadbalancerMode=dedicated
kubectl -n kube-system rollout restart deployment/cilium-operator
kubectl -n kube-system rollout restart ds/cilium
--set ingressController.default=true 플래그를 설정하면 Cilium이 기본 ingress 컨트롤러가 될 수 있어요. 그러면 ingressClass가 설정되지 않아도 ingress 항목이 생성돼요.
Ingress 지원 없이 envoy 트래픽 관리 기능만 사용하려면 --enable-envoy-config 플래그만 활성화하면 돼요.
helm upgrade cilium cilium/cilium --version 1.20.2 \
--namespace kube-system \
--reuse-values \
--set envoyConfig.enabled=true
kubectl -n kube-system rollout restart deployment/cilium-operator
kubectl -n kube-system rollout restart ds/cilium
helm upgrade cilium oci://quay.io/cilium/charts/cilium 1.20.2 \
--namespace kube-system \
--reuse-values \
--set envoyConfig.enabled=true
kubectl -n kube-system rollout restart deployment/cilium-operator
kubectl -n kube-system rollout restart ds/cilium
추가로 프록시 로드 밸런싱 기능은 loadBalancer.l7.backend=envoy 플래그로 구성할 수 있어요.
helm upgrade cilium cilium/cilium --version 1.20.2 \
--namespace kube-system \
--reuse-values \
--set loadBalancer.l7.backend=envoy
kubectl -n kube-system rollout restart deployment/cilium-operator
kubectl -n kube-system rollout restart ds/cilium
helm upgrade cilium oci://quay.io/cilium/charts/cilium 1.20.2 \
--namespace kube-system \
--reuse-values \
--set loadBalancer.l7.backend=envoy
kubectl -n kube-system rollout restart deployment/cilium-operator
kubectl -n kube-system rollout restart ds/cilium
다음으로 Cilium agent와 operator의 상태를 확인할 수 있어요:
$ cilium status
Cilium CLI로 활성화하기 — 최신 버전의 Cilium CLI를 설치해볼게요. Cilium CLI는 Cilium 설치, Cilium 설치 상태 검사, 다양한 기능(예: clustermesh, Hubble) 활성화/비활성화에 사용할 수 있어요.
CILIUM_CLI_VERSION=$(curl -s https://raw.githubusercontent.com/cilium/cilium-cli/main/stable.txt)
CLI_ARCH=amd64
if [ "$(uname -m)" = "aarch64" ]; then CLI_ARCH=arm64; fi
curl -L --fail --remote-name-all https://github.com/cilium/cilium-cli/releases/download/${CILIUM_CLI_VERSION}/cilium-linux-${CLI_ARCH}.tar.gz{,.sha256sum}
sha256sum --check cilium-linux-${CLI_ARCH}.tar.gz.sha256sum
sudo tar xzvfC cilium-linux-${CLI_ARCH}.tar.gz /usr/local/bin
rm cilium-linux-${CLI_ARCH}.tar.gz{,.sha256sum}
CILIUM_CLI_VERSION=$(curl -s https://raw.githubusercontent.com/cilium/cilium-cli/main/stable.txt)
CLI_ARCH=amd64
if [ "$(uname -m)" = "arm64" ]; then CLI_ARCH=arm64; fi
curl -L --fail --remote-name-all https://github.com/cilium/cilium-cli/releases/download/${CILIUM_CLI_VERSION}/cilium-darwin-${CLI_ARCH}.tar.gz{,.sha256sum}
shasum -a 256 -c cilium-darwin-${CLI_ARCH}.tar.gz.sha256sum
sudo tar xzvfC cilium-darwin-${CLI_ARCH}.tar.gz /usr/local/bin
rm cilium-darwin-${CLI_ARCH}.tar.gz{,.sha256sum}
전체 릴리스 페이지를 참고해주세요.
Cilium Ingress Controller는 아래 명령으로 활성화할 수 있어요:
$ cilium install 1.20.2 \
--set kubeProxyReplacement=true \
--set ingressController.enabled=true \
--set ingressController.loadbalancerMode=dedicated
--set ingressController.default=true 플래그를 설정하면 Cilium이 기본 ingress 컨트롤러가 될 수 있어요. 그러면 ingressClass가 설정되지 않아도 ingress 항목이 생성돼요.
Ingress 지원 없이 envoy 트래픽 관리 기능만 사용하려면 --enable-envoy-config 플래그만 활성화하면 돼요.
$ cilium install 1.20.2 \
--set kubeProxyReplacement=true \
--set envoyConfig.enabled=true
추가로 프록시 로드 밸런싱 기능은 loadBalancer.l7.backend=envoy 플래그로 구성할 수 있어요.
$ cilium install 1.20.2 \
--set kubeProxyReplacement=true \
--set envoyConfig.enabled=true \
--set loadBalancer.l7.backend=envoy
다음으로 Cilium agent와 operator의 상태를 확인할 수 있어요:
$ cilium status
또한 이후 단계에서 트래픽을 관찰하는 데 사용될 Hubble CLI를 설치하는 것도 권장해요.
지원되는 Envoy API 버전 (Supported Envoy API Versions)
현재로서는 Envoy API v3만 지원돼요.
지원되는 Envoy 확장 리소스 유형 (Supported Envoy Extension Resource Types)
Envoy 확장은 Envoy 빌드에 내장되거나 내장되지 않을 수 있는 리소스 유형이에요. Envoy 문서에 언급된 표준 유형(예: type.googleapis.com/envoy.config.listener.v3.Listener, type.googleapis.com/envoy.config.route.v3.RouteConfiguration)은 항상 사용 가능해요.
Cilium 노드는 Cilium HTTP 정책 적용과 관찰성을 지원하기 위해 Envoy 이미지를 배포해요. 이 Envoy 빌드는 Cilium Agent의 요구사항에 맞게 최적화되었으며, Envoy 코드베이스에서 사용할 수 있는 많은 Envoy 확장을 포함하지 않아요.
어떤 Envoy 확장이 사용 가능한지 보려면 Envoy 확장 구성 파일을 살펴보세요. #로 주석 처리되지 않은 확장만 Cilium Envoy 이미지에 내장돼요. 사용자 피드백에 따라 내장 확장 목록을 발전시킬 거예요.
예제 (Examples)
Cilium의 Ingress 기능을 사용하고 활용하는 방법은 아래 예제 중 하나를 참고해주세요:
- L7 Path Translation
- L7 Load Balancing and URL re-writing
- L7 Circuit Breaking
- Proxy Load Balancing for Kubernetes Services (beta)
- L7 Traffic Shifting
더 알아보기 (Learn more)
- L7 Load Balancing and URL re-writing — Envoy 기반 로드 밸런싱과 URL 재작성
- L7 Traffic Shifting — L7 트래픽 비율 전환
- Cilium Ingress — Cilium Ingress 컨트롤러