Ingress를 통한 부하 분산 구성

이 페이지에서는 Kubernetes Ingress 객체를 만들어 HTTP(S) 부하 분산기를 구성하는 방법을 보여줍니다. Ingress 객체는 각각 하나의 포드 세트와 연결된 하나 이상의 서비스 객체와 연결되어야 합니다.

서비스 객체는 하나 이상의 servicePort 구조체를 갖습니다. Ingress가 타겟팅하는 각 servicePort는 Google Cloud Platform 백엔드 서비스 리소스와 연결됩니다.

시작하기 전에

이 작업을 준비하려면 다음 단계를 수행하세요.

  • Google Kubernetes Engine API가 사용 설정되었는지 확인합니다.
  • Google Kubernetes Engine API 사용 설정
  • Cloud SDK가 설치되었는지 확인합니다.
  • 기본 프로젝트 ID를 설정합니다.
    gcloud config set project [PROJECT_ID]
  • 영역 클러스터를 사용하는 경우 기본 컴퓨팅 영역을 설정합니다.
    gcloud config set compute/zone [COMPUTE_ZONE]
  • 지역 클러스터를 사용하는 경우 기본 컴퓨팅 지역을 설정합니다.
    gcloud config set compute/region [COMPUTE_REGION]
  • gcloud를 최신 버전으로 업데이트합니다.
    gcloud components update

여러 백엔드 서비스

HTTP(S) 부하 분산기는 다양한 백엔드 서비스로 요청을 라우팅하는 데 사용할 수 있는 안정적인 IP 주소 하나를 제공합니다.

이 연습에서는 URL 경로에 따라 서로 다른 백엔드 서비스로 요청을 라우팅하도록 부하 분산기를 구성합니다. 경로가 /인 요청은 특정 백엔드 서비스로 라우팅되고, 경로가 /kube인 요청은 다른 백엔드 서비스로 라우팅됩니다.

이 연습의 대략적인 단계는 다음과 같습니다.

  1. 배포를 만들고 hello-world라는 서비스로 노출합니다.
  2. 두 번째 배포를 만들고 hello-kubernetes라는 서비스로 노출합니다.
  3. 요청의 URL 경로에 따라 서로 다른 서비스로 요청을 라우팅하는 규칙을 지정하는 Ingress를 만듭니다. Ingress를 만들면 GKE Ingress 컨트롤러가 HTTP(S) 부하 분산기를 만들고 구성합니다.
  4. HTTP(S) 부하 분산기를 테스트합니다.

첫 번째 배포의 매니페스트는 다음과 같습니다.

apiVersion: apps/v1
kind: Deployment
metadata:
  name: hello-world-deployment
spec:
  selector:
    matchLabels:
      greeting: hello
      department: world
  replicas: 3
  template:
    metadata:
      labels:
        greeting: hello
        department: world
    spec:
      containers:
      - name: hello
        image: "gcr.io/google-samples/hello-app:2.0"
        env:
        - name: "PORT"
          value: "50000"

이름이 hello-world-deployment.yaml인 파일에 매니페스트를 복사하고 배포를 만듭니다.

kubectl apply -f hello-world-deployment.yaml

다음은 첫 번째 배포를 노출하는 서비스의 매니페스트입니다.

apiVersion: v1
kind: Service
metadata:
  name: hello-world
spec:
  type: NodePort
  selector:
    greeting: hello
    department: world
  ports:
  - protocol: TCP
    port: 60000
    targetPort: 50000

이 연습을 진행하면서 서비스에 대해 꼭 알아둘 점은 다음과 같습니다.

  • greeting: hello 라벨과 department: world 라벨을 모두 갖는 포드는 서비스의 구성원입니다.

  • TCP 포트 60000의 서비스에 전송된 요청은 TCP 포트 50000의 구성원 포드 중 하나로 전달됩니다.

이름이 hello-world-service.yaml인 파일에 매니페스트를 복사하고 서비스를 만듭니다.

kubectl apply -f hello-world-service.yaml

두 번째 배포의 매니페스트는 다음과 같습니다.

apiVersion: apps/v1
kind: Deployment
metadata:
  name: hello-kubernetes-deployment
spec:
  selector:
    matchLabels:
      greeting: hello
      department: kubernetes
  replicas: 3
  template:
    metadata:
      labels:
        greeting: hello
        department: kubernetes
    spec:
      containers:
      - name: hello-again
        image: "gcr.io/google-samples/node-hello:1.0"
        env:
        - name: "PORT"
          value: "8080"

이름이 hello-kubernetes-deployment인 파일에 매니페스트를 복사하고 배포를 만듭니다.

kubectl apply -f hello-kubernetes-deployment.yaml

다음은 두 번째 배포를 노출하는 서비스의 매니페스트입니다.

apiVersion: v1
kind: Service
metadata:
  name: hello-kubernetes
spec:
  type: NodePort
  selector:
    greeting: hello
    department: kubernetes
  ports:
  - protocol: TCP
    port: 80
    targetPort: 8080

이 연습을 진행하면서 서비스에 대해 꼭 알아둘 점은 다음과 같습니다.

  • greeting: hello 라벨과 department: kubernetes 라벨을 모두 갖는 포드는 서비스의 구성원입니다.

  • TCP 포트 80의 서비스에 전송된 요청은 TCP 포트 8080의 구성원 포드 중 하나로 전달됩니다.

이름이 hello-kubernetes-service.yaml인 파일에 매니페스트를 복사하고 서비스를 만듭니다.

kubectl apply -f hello-kubernetes-service.yaml

Ingress의 매니페스트는 다음과 같습니다.

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: my-ingress
spec:
  rules:
  - http:
      paths:
      - path: /*
        backend:
          serviceName: hello-world
          servicePort: 60000
      - path: /kube
        backend:
          serviceName: hello-kubernetes
          servicePort: 80

Ingress 매니페스트에는 두 개의 (serviceName, servicePort) 쌍이 있습니다. 각 (serviceName, servicePort)는 GCP 백엔드 서비스와 연결됩니다.

이름이 my-ingress.yaml인 파일에 매니페스트를 복사하고 Ingress를 만듭니다.

kubectl apply -f my-ingress.yaml

Ingress를 만들면 GKE Ingress 컨트롤러가 HTTP(S) 부하 분산기를 만들고 다음과 같이 구성합니다.

  • 클라이언트가 URL 경로 /의 부하 분산기로 전송한 요청은 포트 60000의 hello-world 서비스로 전달됩니다.

  • 클라이언트가 URL 경로 /kube의 부하 분산기로 전송한 요청은 포트 80의 hello-kubernetes 서비스로 전달됩니다.

부하 분산기가 구성될 때까지 5분 정도 기다립니다.

Ingress를 확인합니다.

kubectl get ingress my-ingress --output yaml

출력에 HTTP(S) 부하 분산기의 외부 IP 주소가 표시됩니다.

status:
  loadBalancer:
    ingress:
    - ip: 203.0.113.1

/ 경로를 테스트합니다.

curl [LOAD_BALANCER_IP]/

여기에서 [LOAD_BALANCER_IP]는 부하 분산기의 외부 IP 주소입니다.

출력에 Hello, world! 메시지가 표시됩니다.

Hello, world!
Version: 2.0.0
Hostname: ...

/kube 경로를 테스트합니다.

curl [LOAD_BALANCER_IP]/kube

출력에 Hello Kubernetes 메시지가 표시됩니다.

Hello Kubernetes!

클라이언트와 부하 분산기 간 HTTPS

HTTP(S) 부하 분산기는 클라이언트와 애플리케이션 사이의 프록시 역할을 합니다. 클라이언트의 HTTPS 요청을 수락하려는 경우 부하 분산기에 인증서가 있어야 부하 분산기가 클라이언트에게 ID를 증명할 수 있습니다. 또한 부하 분산기에 비공개 키가 있어야 HTTPS 핸드셰이크를 완료할 수 있습니다. 자세한 내용은 다음을 참조하세요.

HTTP 사용 중지

HTTP를 사용 중지하면 클라이언트와 부하 분산기 간의 모든 트래픽에 HTTPS를 사용할 수 있습니다. 자세한 내용은 HTTP 사용 중지를 참조하세요.

부하 분산기와 클라이언트 간 HTTPS

GKE 포드에서 실행되는 애플리케이션이 HTTPS 요청을 수신할 수 있는 경우, 요청을 애플리케이션으로 전달할 때 HTTPS를 사용하도록 부하 분산기를 구성할 수 있습니다. 자세한 내용은 부하 분산기와 애플리케이션 간 HTTPS(TLS)를 참조하세요.

클라이언트와 부하 분산기 간 HTTP/2

클라이언트는 HTTP/2를 사용하여 부하 분산기에 요청을 보낼 수 있습니다. 별도로 구성할 필요는 없습니다.

부하 분산기와 애플리케이션 간 HTTP/2

GKE 포드에서 실행되는 애플리케이션이 HTTP/2 요청을 수신할 수 있는 경우, 요청을 애플리케이션으로 전달할 때 HTTP/2를 사용하도록 부하 분산기를 구성할 수 있습니다. 자세한 내용은 Ingress를 사용한 부하 분산용 HTTP/2를 참조하세요

네트워크 엔드포인트 그룹

클러스터가 컨테이너 기본 부하 분산을 지원하는 경우 네트워크 엔드포인트 그룹을 사용하도록 부하 분산기를 구성할 수 있습니다. 자세한 내용은 컨테이너 기본 부하 분산 사용을 참조하세요.

Ingress 주석 요약

kubernetes.io/ingress.allow-http
클라이언트와 HTTP(S) 부하 분산기 간에 HTTP 트래픽을 허용할지 여부를 지정합니다. 가능한 값은 'true', 'false'입니다. 기본값은 'true'입니다. HTTP 사용 중지를 참조하세요.
ingress.gcp.kubernetes.io/pre-shared-cert
GCP 프로젝트에 인증서와 키를 업로드할 수 있습니다. 이 주석을 사용하여 인증서와 키를 참조합니다. HTTP(S) 부하 분산에서 여러 SSL 인증서 사용을 참조하세요.
kubernetes.io/ingress.global-static-ip-name
이 주석을 사용하여 부하 분산기가 이전에 만든 정적 외부 IP 주소를 사용하도록 지정합니다. HTTP(S) 부하 분산기용 정적 IP 주소를 참조하세요.
service.alpha.kubernetes.io/app-protocols
이 주석을 사용하여 부하 분산기와 애플리케이션 간의 통신 프로토콜을 설정합니다. 가능한 프로토콜은 HTTP, HTTPS, HTTP/2입니다. 부하 분산기와 애플리케이션 간 HTTPSIngress를 사용한 부하 분산용 HTTP/2를 참조하세요.
beta.cloud.google.com/backend-config
이 주석을 사용하여 servicePort와 연결된 백엔드 서비스를 구성합니다. BackendConfig 커스텀 리소스를 참조하세요.
cloud.google.com/neg
이 주석을 사용하여 부하 분산기가 네트워크 엔드포인트 그룹을 사용하도록 지정합니다. 컨테이너 기본 부하 분산 사용을 참조하세요.

다음 단계

이 페이지가 도움이 되었나요? 평가를 부탁드립니다.

다음에 대한 의견 보내기...

Kubernetes Engine