이 문서에서는 TCP 및 UDP 트래픽 모두에 혼합 프로토콜 외부 또는 내부 LoadBalancer 서비스를 사용하여 Google Kubernetes Engine (GKE) 클러스터에서 실행되는 애플리케이션을 노출하는 방법을 보여줍니다.
L4 부하 분산기에 대한 자세한 내용은 LoadBalancer 서비스 정보를 참조하세요.
개요
수동으로 조정된 공유 IP 주소가 있는 두 개의 별도 GKE LoadBalancer 서비스를 사용하여 TCP 및 UDP 프로토콜을 모두 사용하는 애플리케이션을 노출할 수 있습니다. 그러나 이 접근 방식은 단일 애플리케이션에 여러 서비스를 관리해야 하므로 비효율적이며 구성 오류 또는 IP 주소 할당량 소진과 같은 문제가 발생할 수 있습니다.
혼합 프로토콜 LoadBalancer 서비스를 사용하면 단일 서비스를 사용하여 TCP 및 UDP 트래픽을 모두 관리할 수 있습니다. 단일 서비스를 사용하면 두 프로토콜 모두에 단일 IP 주소와 통합된 전달 규칙 집합을 사용할 수 있으므로 구성을 간소화할 수 있습니다. 이 기능은 리전 외부 패스 스루 네트워크 부하 분산기와 내부 패스 스루 네트워크 부하 분산기 모두에서 지원됩니다.
GKE는 IPv4, IPv6, 이중 스택 구성으로 혼합 프로토콜 서비스를 지원합니다. 혼합 프로토콜 서비스는 계층 3 (L3) 전달 규칙을 사용합니다. 기본적으로 이러한 규칙은 부하 분산기의 가상 IP (VIP) 주소에 도착하는 모든 트래픽을 클러스터 노드로 직접 전달합니다.
보안을 유지하기 위해 GKE는 서비스 매니페스트에 정의된 특정 TCP 및 UDP 트래픽만 허용하는 우선순위 999의 방화벽 규칙을 자동으로 만들고 관리합니다. 부하 분산기의 VIP 주소로 전송되는 다른 모든 승인되지 않은 트래픽은 우선순위 1000을 사용하여 GKE 관리형 방화벽 규칙에 의해 차단됩니다. 우선순위가 더 높은 방화벽 규칙을 만드는 경우 규칙이 승인되지 않은 트래픽이 노드에 도달하도록 실수로 허용하지 않는지 확인합니다. 자세한 내용은 GKE 서비스 방화벽 규칙을 참조하세요.
시작하기 전에
시작하기 전에 다음 태스크를 수행했는지 확인합니다.
- Google Kubernetes Engine API를 사용 설정합니다. Google Kubernetes Engine API 사용 설정
- 이 태스크에 Google Cloud CLI를 사용하려면
설치한 후
초기화합니다.
gcloud CLI를 이전에 gcloud CLI를 설치했으면 최신
버전을
gcloud components update명령어를 실행하여 가져옵니다. 이전 gcloud CLI 버전에서는 이 문서의 명령어를 실행하지 못할 수 있습니다.
- 기존 Autopilot 또는 Standard 클러스터가 있는지 확인합니다. 새 클러스터를 만들려면 Autopilot 클러스터 만들기를 참조하세요.
요구사항
혼합 프로토콜을 사용하는 LoadBalancer 서비스를 만들려면 클러스터가 다음 요구사항을 충족해야 합니다.
- 혼합 프로토콜 부하 분산은 일반적으로 GKE 버전 1.36.2-gke.1498000 이상에서 사용할 수 있습니다. 일반적으로 사용 가능한 버전은 IPv4, IPv6, 이중 스택 구성으로 외부 및 내부 부하 분산기를 모두 지원합니다.
- 버전 1.34.1-gke.2190000~1.36.2-gke.1498000의 경우 혼합 프로토콜 부하 분산은 IPv4 주소를 사용하는 외부 부하 분산기에서만 지원됩니다.
- 클러스터에서
HttpLoadBalancing부가기능이 사용 설정되어 있어야 합니다. - 내부 부하 분산기의 경우 클러스터에서 GKE 하위 설정 이 사용 설정되어 있어야 합니다.
- 새 내부 LoadBalancer 서비스의 경우 서비스 매니페스트에서
spec.loadBalancerClass필드의 값을networking.gke.io/l4-regional-internal로 설정합니다. 기존 내부 서비스의 경우 매니페스트에 이미networking.gke.io/load-balancer-type: "Internal"주석이 있으므로 주석을 그대로 둘 수 있습니다. - 새 외부 LoadBalancer 서비스의 경우 서비스 매니페스트에서
spec.loadBalancerClass필드를networking.gke.io/l4-regional-external로 설정합니다. 기존 외부 서비스의 경우 매니페스트에 이미cloud.google.com/l4-rbs: "enabled"주석이 있으므로 주석을 그대로 둘 수 있습니다.
제한사항
- 버전 1.34.1-gke.2190000~1.36.2-gke.1498000에서 혼합 프로토콜 부하 분산기는 IPv4 주소만 지원합니다.
gke.networking.io/l4-ilb-v1또는gke.networking.io/l4-netlb-v1종료자가 있는 기존 서비스는 혼합 프로토콜 부하 분산에 사용할 수 없습니다. 이러한 서비스에서 혼합 프로토콜을 사용하려면 이전 요구사항에 따라 서비스를 삭제하고 다시 만들어야 합니다.- 서비스에서 포트를 업데이트하면 부하 분산기를 통해 라우팅되는 모든 트래픽이 잠시 중단될 수 있습니다.
- 혼합 프로토콜 서비스에 Private Service Connect를 연결할 수 없습니다.
가격 책정
Cloud de Confiance 전달 규칙, 외부 IP 주소, 전송된 데이터에 따라 요금이 청구됩니다. 다음 표에서는 지정된 구성에 사용되는 전달 규칙 및 외부 IP 주소의 수를 설명합니다. 자세한 내용은 VPC 네트워크 가격 책정을 참조하세요.
| 유형 | 전송 계층 | 인터넷 계층 | 전달 규칙 수 | 외부 IP 주소 수 |
|---|---|---|---|---|
| 내부 | 단일 또는 혼합 (TCP, UDP 또는 둘 다) | IPv4 | 1 | 0 |
| IPv6 | 1 | 0 | ||
| IPv4 및 IPv6 (이중 스택) | 2 | 0 | ||
| 외부 | 단일 또는 혼합 (TCP, UDP 또는 둘 다) | IPv4 | 1 | 1 |
| IPv6 | 1 | 1 | ||
| IPv4 및 IPv6 (이중 스택) | 2 | 2 |
워크로드 배포
이 섹션에서는 TCP 및 UDP 포트 모두에서 수신 대기하는 샘플 워크로드를 배포하는 방법을 보여줍니다. 혼합 프로토콜 LoadBalancer 서비스를 사용하는지 아니면 두 개의 별도 단일 프로토콜 LoadBalancer 서비스를 사용하는지에 관계없이 배포 구성은 동일합니다.
다음 매니페스트는 TCP 및 UDP 트래픽 모두에 포트 8080에서 수신 대기하는 샘플 애플리케이션용입니다. 다음 매니페스트를
mixed-app-deployment.yaml로 저장합니다.apiVersion: apps/v1 kind: Deployment metadata: name: mixed-app-deployment spec: replicas: 3 selector: matchLabels: app: mixed-app template: metadata: labels: app: mixed-app spec: containers: - image: gcr.io/kubernetes-e2e-test-images/agnhost:2.6 name: agnhost args: ["serve-hostname", "--port=8080", "--tcp=true", "--udp=true", "--http=false"] ports: - name: tcp8080 protocol: TCP containerPort: 8080 - name: udp8080 protocol: UDP containerPort: 8080매니페스트를 클러스터에 적용합니다.
kubectl apply -f mixed-app-deployment.yaml
혼합 프로토콜 부하 분산기 만들기
배포를 TCP 및 UDP 트래픽 모두에 노출하는 LoadBalancer 유형의 서비스를 만듭니다. 외부 또는 내부 부하 분산기를 만들 수 있습니다.
외부 부하 분산기를 만들려면 다음 매니페스트를
mixed-protocol-lb.yaml로 저장합니다.apiVersion: v1 kind: Service metadata: name: mixed-protocol-external-lb spec: loadBalancerClass: "networking.gke.io/l4-regional-external" type: LoadBalancer selector: app: mixed-app ports: - name: tcp-port protocol: TCP port: 8080 - name: udp-port protocol: UDP port: 8080내부 부하 분산기를 만들려면
spec.loadBalancerClass필드의 값을networking.gke.io/l4-regional-internal로 설정합니다.이전 서비스에는 포트 8080에 TCP용 포트 하나와 UDP용 포트 하나가 있습니다.
매니페스트를 클러스터에 적용합니다.
kubectl apply --server-side -f mixed-protocol-lb.yaml
혼합 프로토콜 부하 분산기 확인
서비스를 만든 후 GKE가 부하 분산기를 성공적으로 만들었는지 확인합니다.
서비스를 검사합니다.
kubectl describe service SERVICE_NAMESERVICE_NAME을 서비스 이름 (예:mixed-protocol-lb)으로 바꿉니다.출력에 부하 분산기의 IP 주소와 전달 규칙이 표시됩니다. 출력에서 다음 세부정보를 확인합니다.
status.loadBalancer.ingress.ip필드가 채워져 있습니다.- 버전 1.34.1-gke.2190000~1.36.2-gke.1498000의 클러스터의 경우 외부 부하 분산기에 다음 주석이 있는지 확인합니다.
service.kubernetes.io/tcp-forwarding-ruleservice.kubernetes.io/udp-forwarding-rule
- 1.36.2-gke.1498000 이후 버전에서 생성된 클러스터의 경우 구성에 따라 부하 분산기에 다음 주석이 있는지 확인합니다.
- IPv4의 경우:
service.kubernetes.io/l3-forwarding-rule - IPv6의 경우:
service.kubernetes.io/l3-forwarding-rule-ipv6 - 이중 스택의 경우: 두 주석 모두
- IPv4의 경우:
Events섹션에 오류 메시지가 없습니다.
혼합 프로토콜 부하 분산기 업데이트
서비스 매니페스트를 수정하여 혼합 프로토콜 부하 분산기의 포트를 업데이트할 수 있습니다. 서비스를 수정하려면 다음 명령어를 실행합니다.
kubectl edit service SERVICE_NAME
SERVICE_NAME을 서비스 이름으로 바꿉니다.
포트 업데이트
혼합 프로토콜 부하 분산기의 포트를 업데이트하려면 서비스 매니페스트의 ports 섹션을 수정합니다. 포트를 추가, 삭제 또는 수정할 수 있습니다.
다음 예시에서는 스트리밍을 위한 UDP 포트와 게임 서버 메타데이터를 위한 TCP 포트를 추가합니다.
apiVersion: v1
kind: Service
metadata:
name: mixed-protocol-lb
spec:
loadBalancerClass: "networking.gke.io/l4-regional-external" # for internal LB, use: "networking.gke.io/l4-regional-internal"
type: LoadBalancer
selector:
app: mixed-app
ports:
- name: tcp-port
protocol: TCP
port: 8080
- name: streaming
protocol: UDP
port: 10100
- name: gameserver-metadata
protocol: TCP
port: 10400
- name: https
protocol: TCP
port: 443
단일 프로토콜 부하 분산기를 혼합 프로토콜로 업데이트
단일 프로토콜 부하 분산기를 혼합 프로토콜 부하 분산기로 변경하려면 TCP 및 UDP 프로토콜 모두의 포트를 포함하도록 서비스를 수정합니다.
다음 예시에서는 DNS용 UDP 포트를 기존 TCP 전용 부하 분산기에 추가합니다.
apiVersion: v1
kind: Service
metadata:
name: already-existing-single-protocol-lb
spec:
loadBalancerClass: "networking.gke.io/l4-regional-external" # for internal LB, use: "networking.gke.io/l4-regional-internal"
type: LoadBalancer
selector:
app: mixed-app
ports:
- name: http
protocol: TCP
port: 80
- name: https
protocol: TCP
port: 443
- name: dns
protocol: UDP
port: 53
혼합 프로토콜 부하 분산기를 단일 프로토콜로 업데이트
혼합 프로토콜 부하 분산기를 단일 프로토콜 부하 분산기로 변경하려면 프로토콜 중 하나의 모든 포트를 삭제합니다.
다음 예시에서는 DNS용 UDP 포트를 삭제하여 부하 분산기를 TCP 전용으로 변환합니다.
apiVersion: v1
kind: Service
metadata:
name: already-existing-mixed-protocol-lb
spec:
loadBalancerClass: "networking.gke.io/l4-regional-external" # for internal LB, use: "networking.gke.io/l4-regional-internal"
type: LoadBalancer
selector:
app: mixed-app
ports:
- name: http
protocol: TCP
port: 80
- name: https
protocol: TCP
port: 443
혼합 프로토콜 LoadBalancer 삭제
혼합 프로토콜 LoadBalancer 서비스를 삭제하려면 다음 명령어를 실행합니다.
kubectl delete service SERVICE_NAME
SERVICE_NAME을 서비스 이름 (예: mixed-protocol-external-lb)으로 바꿉니다.
GKE는 서비스에 대해 생성된 모든 부하 분산기 리소스를 자동으로 삭제합니다.
문제 해결
이 섹션에서는 혼합 프로토콜 LoadBalancer 서비스의 일반적인 문제를 해결하는 방법을 설명합니다.
오류 이벤트 확인
문제 해결의 첫 번째 단계는 서비스와 연결된 이벤트를 확인하는 것입니다.
서비스의 세부정보를 가져옵니다.
kubectl describe service SERVICE_NAMESERVICE_NAME을 서비스 이름으로 바꿉니다.출력 끝에 있는
Events섹션에서 오류 메시지를 검토합니다.
오류: LoadBalancer에 혼합 프로토콜이 지원되지 않음
cloud.google.com/l4-rbs: "enabled"
주석으로 서비스를 만든 경우 혼합 프로토콜 부하 분산기를 만든 후 원래 서비스 컨트롤러
에서 mixed-protocol is not
supported for LoadBalancer 경고 이벤트가 표시될 수 있습니다.
혼합 프로토콜을 지원하는 새 컨트롤러가 부하 분산기를 올바르게 프로비저닝하므로 이 메시지는 무시해도 됩니다.
업데이트 후 포트 정의가 누락됨
증상:
TCP 및 UDP 모두에 동일한 포트 (예: 포트 8080)를 사용하는 서비스를 업데이트하면 업데이트된 서비스에서 포트 정의 중 하나가 누락됩니다.
원인:
이는 Kubernetes의 알려진 문제입니다. 동일한 포트에서 여러 프로토콜로 서비스를 업데이트하면 클라이언트 측 패치 계산이 포트 목록을 잘못 병합하여 포트 정의 중 하나가 삭제될 수 있습니다.
이 문제는 kubectl apply 및 병합 패치가 있는 Go 클라이언트와 같은 클라이언트 측 패치를 사용하는 클라이언트에 영향을 미칩니다.
해결책:
이 문제의 해결 방법은 클라이언트에 따라 다릅니다.
kubectl의 경우:
--server-side플래그를kubectl apply와 함께 사용합니다.kubectl apply --server-side -f YOUR_SERVICE_MANIFEST.yamlYOUR_SERVICE_MANIFEST를 서비스 매니페스트 이름으로 바꿉니다.go-client의 경우: 병합 패치를 사용하지 마세요. 대신 업데이트 호출을 사용하여 서비스를 바꿉니다. 이렇게 하려면 전체 서비스 객체 사양이 포함된 HTTP
PUT요청이 필요합니다.
다음 단계
- 서비스를 사용하여 애플리케이션 노출에 대해 자세히 알아봅니다.
- LoadBalancer 서비스에 대해 알아봅니다.