GAMMA 지원
GAMMA 지원 (GAMMA Support)
GAMMA는 Gateway API 서브프로젝트 안의 전용 워크스트림으로, Gateway API를 사용해 서비스 메시를 구성하는 방법을 정의해요. Cilium은 Gateway API를 통해 GAMMA를 지원해서, 사용자가 Envoy를 직접 구성할 필요 없이 L7 트래픽 관리를 제공해요.
출처: GAMMA Support
본문
GAMMA란 무엇인가요? (What is GAMMA?)
(Gateway API 사이트의 GAMMA 페이지에서)
GAMMA 이니셔티브는 별도의 서브프로젝트가 아니라 Gateway API 서브프로젝트 안의 전용 워크스트림으로, GAMMA 리드들이 이끌어요. GAMMA의 목표는 Gateway API를 최소한으로 변경하고 Gateway API의 역할 중심적인 성격을 항상 유지하면서, Gateway API를 사용해 서비스 메시를 구성하는 방법을 정의하는 거예요. 또한 GAMMA는 기술 스택이나 프록시에 관계없이 서비스 메시 프로젝트들 사이에서 Gateway API 구현의 일관성을 지지하려고 노력해요.
Gateway API에서 GAMMA는 Route(HTTPRoute 또는 GRPCRoute)를 Gateway가 아니라 Service에 부모로 바인딩해서 Service에 추가 라우팅을 넣는 것을 지원해요 (북/남 방향 Gateway API 용법과는 반대예요).
이를 통해 Cilium은 부모 Service로 흐르는 레이어 7 트래픽을 가로채서 노드별 Envoy 프록시를 통해 라우팅할 수 있어요. 그래서 GAMMA는 사용자가 Envoy를 직접 구성하는 방법을 알 필요 없이 Cilium의 Layer 7 트래픽 관리와 같은 기능을 수행해요.
GAMMA 구성의 유형 (Types of GAMMA configuration)
GAMMA에는 "producer"(생산자)와 "consumer"(소비자) 두 가지 유형의 Route가 있어요.
"Producer" 라우트는 트래픽이 관리되는 Service의 소유자와 같은 네임스페이스에 있고 같은 소유자를 가진 Service에 바인딩되는 Route(HTTPRoute 또는 GRPCRoute)예요. 즉 네임스페이스 foo에 있는 애플리케이션 foo에 foo-svc라는 Service가 있다면, foo의 소유자는 foo 네임스페이스에 foo-svc를 부모로 나열한 HTTPRoute를 만들어요. 그러면 라우팅은 전체 클러스터에서 foo 서비스로 오는 모든 트래픽에 영향을 주며, foo 서비스의 "producer"인 소유자가 이를 제어해요.
"Consumer" 라우트는 해당 Service와 다른 네임스페이스에 있는 Service에 바인딩되는 Route예요. 이런 Route는 바인딩되는 Service의 consumer가 소유하기 때문에 "consumer" Route라고 불러요. 위 foo Service에 대해, bar 네임스페이스의 앱이 사용하는 bar 네임스페이스의 Route가 foo 네임스페이스의 foo-svc Service에 바인딩된다면, 이는 foo Service를 *소비(consume)*하는 bar 서비스의 라우팅을 바꾸므로 consumer Service예요.
Cilium은 현재 "Producer" Route만 지원하며, 따라서 HTTPRoute와 GRPCRoute는 바인딩하는 Service와 같은 네임스페이스에 있어야 해요.
Cilium GAMMA 지원 (Cilium GAMMA Support)
Cilium은 다음 리소스에 대해 GAMMA를 지원해요 (지원되는 Gateway API 버전 세부정보는 Gateway API Support 참고):
- HTTPRoute
- GRPCRoute
- ReferenceGrant
Cilium은 현재 "consumer" Route(HTTPRoute 또는 GRPCRoute)를 지원하지 않으므로, Mesh conformance profile의 MeshConsumerRoute 기능도 지원하지 않아요.
참고
워크로드 종료나 롤링 업데이트 중에 Hubble이 GAMMA 트래픽에 대해
DROP_EP_NOT_READY이벤트를 보고할 수 있어요. Envoy 업스트림 TCP 연결은 그 트래픽을 만든 소스 엔드포인트보다 오래 살아남을 수 있어요. Cilium이 해당 엔드포인트의 정책 프로그램을 제거한 뒤, 남은 연결을 닫는 패킷이 드롭될 수 있어요.이런 이벤트는 TCP 연결을 닫는 것으로 한정되고 애플리케이션 요청이 계속 성공한다면 대체로 무해해요. 새 연결에 영향을 주거나 요청 실패와 동시에 발생하는 드롭은 별도로 조사해야 해요.
사전 요구사항 (Prerequisites)
- Cilium은
kubeProxyReplacement=true로 kube-proxy 교체가 구성되어야 해요. 자세한 내용은 kube-proxy replacement를 참고해주세요. - Cilium은
l7Proxy=true(기본 활성화)로 L7 프록시가 활성화되어야 해요. - Gateway의 Service에 도착한 트래픽은
TPROXY커널 기능을 사용해 Envoy로 투명하게 전달돼요. 기본bpf.tproxy=false에서는TPROXY가 iptables로 구현되므로, 노드는 L7 프록시 시스템 요구사항에 나열된 netfilter 모듈과 함께 iptables를 제공해야 해요. 일부 배포판은 기본적으로 이를 제공하지 않아서, Gateway에 대한 연결이 Envoy에 도달하지 못한 채 타임아웃될 수 있어요. eBPF 기반bpf.tproxy=true(베타)는 이 iptables 의존성을 제거해요. - 기본적으로 Cilium Gateway API 컨트롤러는 LoadBalancer 유형의 서비스를 만들므로, 환경이 이를 지원해야 해요. 또는 Cilium 1.16부터 호스트 네트워크에서 Cilium L7 프록시를 직접 노출할 수 있어요.
설치 (Installation)
Gateway API v1.6.1의 아래 CRD들이 반드시 설치되어야 해요.
- GatewayClass
- Gateway
- HTTPRoute
- GRPCRoute
- BackendTLSPolicy
- ReferenceGrant
- TLSRoute
설치 단계는 이 문서들을 참고해주세요. 또는 아래 스니펫을 사용할 수도 있어요.
experimental 릴리스 채널에는 standard 릴리스 채널의 모든 것과 일부 실험 리소스/필드가 포함돼 있어요. 현재 experimental로 표시된 기능(예: HTTPRoute 리소스의 HTTPRoute Retry)이 필요하다면 해당 CRD를 설치해야 해요. 실험 기능 전체 목록은 experimental GEP 목록을 참고해주세요.
기존 설치를 업데이트하는 경우, 항상 먼저 Upgrade Guide를 확인해서 새 버전에 필요한 breaking changes, deprecated 기능, 중요한 구성 업데이트를 검토해주세요. Cilium 1.20 업그레이드의 경우, Gateway API CRD를 업데이트하기 전에 업그레이드 가이드의 Gateway API v1.6.1과 TLSRoute 참고 사항을 검토하세요.
필요한 CRD 집합은 다음과 같이 설치할 수 있어요:
kubectl apply --server-side -f https://raw.githubusercontent.com/kubernetes-sigs/gateway-api/v1.6.1/config/crd/standard/gateway.networking.k8s.io_gatewayclasses.yaml
kubectl apply --server-side -f https://raw.githubusercontent.com/kubernetes-sigs/gateway-api/v1.6.1/config/crd/standard/gateway.networking.k8s.io_gateways.yaml
kubectl apply --server-side -f https://raw.githubusercontent.com/kubernetes-sigs/gateway-api/v1.6.1/config/crd/standard/gateway.networking.k8s.io_httproutes.yaml
kubectl apply --server-side -f https://raw.githubusercontent.com/kubernetes-sigs/gateway-api/v1.6.1/config/crd/standard/gateway.networking.k8s.io_referencegrants.yaml
kubectl apply --server-side -f https://raw.githubusercontent.com/kubernetes-sigs/gateway-api/v1.6.1/config/crd/standard/gateway.networking.k8s.io_grpcroutes.yaml
kubectl apply --server-side -f https://raw.githubusercontent.com/kubernetes-sigs/gateway-api/v1.6.1/config/crd/standard/gateway.networking.k8s.io_backendtlspolicies.yaml
kubectl apply --server-side -f https://raw.githubusercontent.com/kubernetes-sigs/gateway-api/v1.6.1/config/crd/standard/gateway.networking.k8s.io_tlsroutes.yaml
kubectl apply --server-side -f https://raw.githubusercontent.com/kubernetes-sigs/gateway-api/v1.6.1/config/crd/experimental/gateway.networking.k8s.io_gatewayclasses.yaml
kubectl apply --server-side -f https://raw.githubusercontent.com/kubernetes-sigs/gateway-api/v1.6.1/config/crd/experimental/gateway.networking.k8s.io_gateways.yaml
kubectl apply --server-side -f https://raw.githubusercontent.com/kubernetes-sigs/gateway-api/v1.6.1/config/crd/experimental/gateway.networking.k8s.io_httproutes.yaml
kubectl apply --server-side -f https://raw.githubusercontent.com/kubernetes-sigs/gateway-api/v1.6.1/config/crd/experimental/gateway.networking.k8s.io_referencegrants.yaml
kubectl apply --server-side -f https://raw.githubusercontent.com/kubernetes-sigs/gateway-api/v1.6.1/config/crd/experimental/gateway.networking.k8s.io_grpcroutes.yaml
kubectl apply --server-side -f https://raw.githubusercontent.com/kubernetes-sigs/gateway-api/v1.6.1/config/crd/experimental/gateway.networking.k8s.io_backendtlspolicies.yaml
kubectl apply --server-side -f https://raw.githubusercontent.com/kubernetes-sigs/gateway-api/v1.6.1/config/crd/experimental/gateway.networking.k8s.io_tlsroutes.yaml
TCPRoute, UDPRoute 또는 ListenerSet CRD는 선택 사항이며, 이 기능을 사용하려면 해당 CRD 리소스를 설치해야 해요. 설치하지 않으면 Cilium은 이 기능들에 대한 지원을 비활성화해요.
선택적 CRD 집합은 다음과 같이 설치할 수 있어요:
kubectl apply --server-side -f https://raw.githubusercontent.com/kubernetes-sigs/gateway-api/v1.6.1/config/crd/standard/gateway.networking.k8s.io_listenersets.yaml
kubectl apply --server-side -f https://raw.githubusercontent.com/kubernetes-sigs/gateway-api/v1.6.1/config/crd/standard/gateway.networking.k8s.io_tcproutes.yaml
kubectl apply --server-side -f https://raw.githubusercontent.com/kubernetes-sigs/gateway-api/v1.6.1/config/crd/standard/gateway.networking.k8s.io_udproutes.yaml
kubectl apply --server-side -f https://raw.githubusercontent.com/kubernetes-sigs/gateway-api/v1.6.1/config/crd/experimental/gateway.networking.k8s.io_listenersets.yaml
kubectl apply --server-side -f https://raw.githubusercontent.com/kubernetes-sigs/gateway-api/v1.6.1/config/crd/experimental/gateway.networking.k8s.io_tcproutes.yaml
kubectl apply --server-side -f https://raw.githubusercontent.com/kubernetes-sigs/gateway-api/v1.6.1/config/crd/experimental/gateway.networking.k8s.io_udproutes.yaml
CRD가 설치되면 Helm 또는 Cilium CLI를 사용해 Cilium Gateway API 컨트롤러를 활성화해주세요.
최신 버전의 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}
전체 릴리스 페이지를 참고해주세요.
Helm으로 활성화하기 — Cilium Gateway API Controller는 helm 플래그 gatewayAPI.enabled를 true로 설정해서 활성화할 수 있어요. 새 설치에 대해서는 Installation using Helm을 참고해주세요.
helm upgrade cilium cilium/cilium --version 1.20.2 \
--namespace kube-system \
--reuse-values \
--set kubeProxyReplacement=true \
--set gatewayAPI.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 kubeProxyReplacement=true \
--set gatewayAPI.enabled=true
kubectl -n kube-system rollout restart deployment/cilium-operator
kubectl -n kube-system rollout restart ds/cilium
Cilium CLI로 활성화하기 — Cilium Gateway API Controller는 아래 명령으로 활성화할 수 있어요.
$ cilium upgrade 1.20.2 \
--set kubeProxyReplacement=true \
--set gatewayAPI.enabled=true
다음으로 Cilium agent와 operator의 상태를 확인할 수 있어요:
$ cilium status
더 알아보기 (Learn more)
- Cilium Gateway API — Cilium Gateway API 개요
- Gateway API 설치 — CRD 설치와 컨트롤러 활성화
- Layer 7 트래픽 관리 (L7-Aware Traffic Management) — L7 트래픽 관리