이 페이지에서는 Kubernetes 인그레스 및 서비스 객체를 사용하여 백엔드 서비스와의 통신에 HTTP/2를 사용하도록 외부 애플리케이션 부하 분산기를 구성하는 방법을 보여줍니다.
개요
애플리케이션 부하 분산기는 클라이언트와 애플리케이션 사이의 프록시 역할을 합니다. 클라이언트는 HTTP/1.1 또는 HTTP/2를 사용하여 부하 분산기 프록시와 통신할 수 있습니다. 하지만 부하 분산기 프록시에서 애플리케이션까지의 연결은 기본적으로 HTTP/1.1을 사용합니다. Google Kubernetes Engine(GKE) 포드에서 실행되는 애플리케이션이 HTTP/2 요청을 수신할 수 있는 경우, 요청을 애플리케이션으로 전달할 때 HTTP/2를 사용하도록 외부 부하 분산기를 구성합니다.
이 연습에서는 배포, 서비스, 인그레스를 만듭니다. 부하 분산기가 HTTP/2를 사용하여 애플리케이션과 통신하도록 지정하기 위해 서비스 매니페스트에 cloud.google.com/app-protocols
주석을 추가합니다.
그런 다음 서비스를 호출하고 애플리케이션이 HTTP/2 요청을 수신했는지 확인합니다.
시작하기 전에
시작하기 전에 다음 태스크를 수행했는지 확인합니다.
- Google Kubernetes Engine API를 사용 설정합니다. Google Kubernetes Engine API 사용 설정
- 이 태스크에 Google Cloud CLI를 사용하려면 gcloud CLI를 설치한 후 초기화합니다. 이전에 gcloud CLI를 설치한 경우
gcloud components update
를 실행하여 최신 버전을 가져옵니다.
- Kubernetes 인그레스 및 서비스 리소스 관련 정보를 읽어보세요.
- 외부 애플리케이션 부하 분산기의 HTTP/2 제한사항에 대해 알아보세요.
배포 만들기
다음 매니페스트를
my-deployment.yaml
이라는 파일에 복사합니다.apiVersion: apps/v1 kind: Deployment metadata: name: echoheaders spec: replicas: 2 selector: matchLabels: app: echoheaders template: metadata: labels: app: echoheaders spec: containers: - name: echoheaders image: registry.k8s.io/echoserver:1.10 ports: - containerPort: 8443
이 매니페스트는
echoheaders
웹 애플리케이션의 두 복제본이 있는 배포를 설명합니다.매니페스트를 클러스터에 적용합니다.
kubectl apply -f my-deployment.yaml
서비스 만들기
다음 매니페스트를
my-service.yaml
이라는 파일에 복사합니다.apiVersion: v1 kind: Service metadata: annotations: cloud.google.com/app-protocols: '{"my-port":"HTTP2"}' name: echoheaders labels: app: echoheaders spec: type: NodePort ports: - port: 443 targetPort: 8443 protocol: TCP name: my-port selector: app: echoheaders
이 매니페스트는 다음 속성을 사용해서 서비스를 기술합니다.
type: NodePort
: NodePort 유형의 서비스임을 지정합니다.app: echoheaders
: 이 라벨이 있는 포드가 서비스의 구성원임을 지정합니다.cloud.google.com/app-protocols
:my-port
가 HTTP/2 프로토콜을 사용하도록 지정합니다.port: 443
,protocol: TCP
,targetPort: 8433
: TCP 포트 443의 서비스로 전달되는 트래픽이 구성원 포드 중 하나의 TCP 포트 8422로 라우팅되어야 한다고 지정합니다.
매니페스트를 클러스터에 적용합니다.
kubectl apply -f my-service.yaml
서비스를 확인합니다.
kubectl get service echoheaders --output yaml
출력은 다음과 비슷합니다.
apiVersion: v1 kind: Service metadata: annotations: cloud.google.com/app-protocols: '{"my-port":"HTTP2"}' ... labels: app: echoheaders name: echoheaders ... spec: clusterIP: 10.39.251.148 ... ports: - name: my-port nodePort: 30647 port: 443 protocol: TCP targetPort: 8443 selector: app: echoheaders ... type: NodePort ...
인그레스 만들기
다음 매니페스트를
my-ingress.yaml
이라는 파일에 복사합니다.apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: echomap spec: defaultBackend: service: name: echoheaders port: number: 443
이 매니페스트는 들어오는 요청이
echoheaders
서비스의 구성원인 포드로 전송되도록 지정하는 인그레스를 설명합니다. 요청은echoheaders
서비스 매니페스트에서 지정된targetPort
의 포드로 라우팅됩니다. 이 연습에서 포드targetPort
는8443
입니다.매니페스트를 클러스터에 적용합니다.
kubectl apply -f my-ingress.yaml
Kubernetes 인그레스 컨트롤러가 애플리케이션 부하 분산기를 구성하는 동안 이 명령어를 완료하는 데 몇 분 정도 걸릴 수 있습니다.
인그레스를 확인합니다.
kubectl get ingress echomap --output yaml
출력은 다음과 비슷합니다.
kind: Ingress metadata: ... name: echomap ... spec: backend: serviceName: echoheaders servicePort: 443 status: loadBalancer: ingress: - ip: 203.0.113.2
이 출력에서 인그레스의 IP 주소는
203.0.113.2
입니다.
부하 분산기 테스트
gcloud
백엔드 서비스를 나열합니다.
gcloud compute backend-services list
백엔드 서비스를 설명합니다.
gcloud beta compute backend-services describe BACKEND_SERVICE_NAME --global
BACKEND_SERVICE_NAME
을 백엔드 서비스의 이름으로 바꿉니다.출력에 따르면
protocol
은HTTP2
입니다.backends: ... description: '{...,"kubernetes.io/service-port":"443","x-features":["HTTP2"]}' ... kind: compute#backendService loadBalancingScheme: EXTERNAL protocol: HTTP2 ...
콘솔
Google Cloud 콘솔의 부하 분산 페이지로 이동합니다.
이름 아래에서 부하 분산기를 찾습니다.
부하 분산기의 이름을 클릭하여 백엔드 서비스를 확인합니다.
백엔드 서비스의 엔드포인트 프로토콜이 HTTP/2인지 확인합니다.
서비스 호출하기
GKE가 부하 분산기와 백엔드 서비스를 구성할 때까지 몇 분 정도 기다린 후 브라우저의 주소 표시줄에 부하 분산기의 외부 IP 주소를 입력합니다.
출력은 다음과 비슷합니다.
Hostname: echoheaders-7886d5bc68-xnrwj
...
Request Information:
...
method=GET
real path=/
query=
request_version=2
request_scheme=https
...
Request Headers:
...
x-forwarded-for=[YOUR_IP_ADDRESS], 203.0.113.2
x-forwarded-proto=http
...
다음은 부하 분산기에서 포드로 전송되는 요청에 대한 출력 정보입니다.
request_version=2
: 부하 분산기와 포드 사이의 요청이 HTTP/2를 사용했음을 나타냅니다.x-forwarded-proto=http
: 브라우저와 부하 분산기 간의 요청이 HTTP/2가 아닌 HTTP 1.1을 사용했음을 나타냅니다.
다음 단계
인그레스를 사용하여 애플리케이션의 고정 IP 주소 및 도메인 이름 구성하기
인그레스 부하 분산기의 SSL 인증서 구성하기