독립형 네트워크 엔드포인트 그룹

이 제품 또는 기능은 Traffic Director와 함께 사용하는 경우에 일반 안정화 버전으로 제공됩니다. 그 외의 모든 경우에는 다음 주의사항이 적용됩니다.

이 페이지에서는 네트워크 엔드포인트 그룹이 지원하는 Kubernetes 서비스를 만드는 방법을 보여줍니다.

개요

Google Cloud에는 다양한 부하 분산 구성요소가 있으며 이를 다양한 방식으로 결합하여 애플리케이션에 부하 분산을 제공할 수 있습니다. 이 주제의 단계에서는 다음 구성요소를 결합하여 Kubernetes 서비스에 부하 분산을 제공합니다.

다음 다이어그램은 각 구성요소 간의 연결 관계를 보여줍니다.

네트워크 엔드포인트 그룹의 부하 분산 구성요소 다이어그램

다음은 이 주제에서 수행하는 단계의 개요입니다.

  1. Pod가 세 개 있는 배포를 만듭니다. 각 Pod에는 TCP 포트 50000에서 리슨하는 컨테이너가 있습니다.

  2. 서비스를 만듭니다. 서비스 매니페스트에 cloud.google.com/neg 주석을 포함합니다. 이렇게 하면 GKE 컨트롤러가 네트워크 엔드포인트 그룹을 만듭니다.

  3. 상태 확인을 만듭니다.

  4. 백엔드 서비스를 만듭니다. 백엔드 서비스를 상태 확인 및 네트워크 엔드포인트 그룹에 연결합니다.

  5. TCP 프록시를 만듭니다. 백엔드 서비스에 TCP 프록시를 연결합니다.

  6. 전달 규칙을 만듭니다. TCP 프록시에 전달 규칙을 연결합니다.

  7. 전달 규칙을 테스트합니다.

시작하기 전에

Google Kubernetes Engine 버전 1.10 이상을 실행하는 클러스터가 있어야 합니다.

클러스터는 VPC 기반이어야 합니다. 자세한 내용은 별칭 IP를 사용하여 VPC 기반 클러스터 만들기를 참조하세요.

클러스터에서 HTTP 부하 분산을 사용 설정해야 합니다. GKE 클러스터에는 기본적으로 HTTP 부하 분산이 사용 설정되어 있으며 사용 중지하면 안 됩니다.

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

  • 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

네트워크 엔드포인트 그룹 만들기

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

apiVersion: apps/v1
kind: Deployment
metadata:
  name: my-deployment
spec:
  selector:
    matchLabels:
      purpose: demo
      topic: standalone-neg
  replicas: 3
  template:
    metadata:
      labels:
        purpose: demo
        topic: standalone-neg
    spec:
      containers:
      - name: hello
        image: debian
        command: ["/bin/bash"]
        args:
        - "-c"
        - "apt-get update && apt-get install -y netcat && while true; do echo Hello TCP | nc -l -p 50000; done"

배포에 3개의 pod가 있으며 각 pod에 컨테이너가 한 개씩 있습니다.

배포 매니페스트의 cmdargs 필드는 netcat(nc)을 사용하여 포트 50000의 연결을 수신 대기하는 간단한 TCP 서버를 구현합니다.

매니페스트를 my-deployment.yaml 파일에 저장하고 배포를 만듭니다.

kubectl apply -f my-deployment.yaml

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

apiVersion: v1
kind: Service
metadata:
  name: my-service
  annotations:
    cloud.google.com/neg: '{"exposed_ports": {"80":{}}}'
spec:
  type: ClusterIP
  selector:
    purpose: demo
    topic: standalone-neg
  ports:
  - name: my-service-port
    protocol: TCP
    port: 80
    targetPort: 50000

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

  • purpose: demo 라벨과 topic: standalone-neg 라벨이 모두 있는 pod는 서비스의 구성원입니다.

  • 서비스에는 이름이 my-service-port인 하나의 servicePort 구조가 있습니다. cloud.googe.com/neg 주석은 my-service-port가 네트워크 엔드포인트 그룹과 연결될 것임을 나타냅니다.

  • 각 구성원 pod에는 TCP 포트 50000에서 수신 대기하는 컨테이너가 있어야 합니다.

my-service.yaml라는 파일에 매니페스트를 저장하고 서비스를 만듭니다.

kubectl apply -f my-service.yaml

서비스를 만들면 GKE 컨트롤러가 네트워크 엔드포인트 그룹을 만듭니다.

네트워크 엔드포인트 그룹이 생성될 때까지 잠시 기다립니다. 그런 다음 gcloud 또는 Google Cloud Console을 사용하여 네트워크 엔드포인트 그룹을 검사할 수 있습니다.

gcloud

네트워크 엔드포인트 그룹을 나열합니다.

gcloud compute network-endpoint-groups list

출력에서 네트워크 엔드포인트 그룹에 엔드포인트가 세 개 있는 것으로 표시됩니다.

NAME                                          LOCATION       ENDPOINT_TYPE   SIZE
k8s1-70aa83a6-default-my-service-80-c9710a6f  us-central1-a  GCE_VM_IP_PORT  3

엔드포인트를 확인합니다.

gcloud compute network-endpoint-groups list-network-endpoints \
    [NETWORK_ENDPOINT_GROUP_NAME]

여기서, [NETWORK_ENDPOINT_GROUP_NAME]은 네트워크 엔드포인트 그룹의 이름입니다.

출력에서 엔드포인트 세 개가 표시됩니다. 각 엔드포인트는 (Pod IP 주소, 포트) 쌍입니다.

INSTANCE                                           IP_ADDRESS  PORT
gke-standard-cluster-3-default-pool-4cc71a15-qlpf  10.12.1.43  50000
gke-standard-cluster-3-default-pool-4cc71a15-qlpf  10.12.1.44  50000
gke-standard-cluster-3-default-pool-4cc71a15-w9nk  10.12.2.26  50000
````

Console

  1. Cloud Console의 네트워크 엔드포인트 그룹 목록을 방문합니다.

    네트워크 엔드포인트 그룹 방문

    프로젝트의 네트워크 엔드포인트 그룹 목록이 나타납니다.

  2. 네트워크 엔드포인트의 이름을 클릭합니다. 엔드포인트 개수, 서브넷, IP 주소, 포트와 같은 네트워크 엔드포인트 그룹의 세부정보가 표시됩니다.

방화벽 규칙 만들기

이 연습의 후반부에서는 상태 확인 및 TCP 프록시를 만듭니다.

상태 확인과 TCP 프록시의 TCP 트래픽을 허용하는 방화벽 규칙을 만듭니다.

gcloud compute firewall-rules create my-fwr --network default \
    --source-ranges 130.211.0.0/22,35.191.0.0/16 --allow tcp

상태 확인 및 백엔드 서비스 만들기

상태 확인을 만듭니다.

gcloud compute health-checks create tcp my-hc --use-serving-port --global

백엔드 서비스를 만듭니다.

gcloud compute backend-services create my-bes --global \
    --protocol tcp --health-checks my-hc

네트워크 엔드포인트 그룹을 백엔드 서비스에 추가합니다.

gcloud compute backend-services add-backend my-bes --global \
   --network-endpoint-group [NETWORK_ENDPOINT_GROUP_NAME] \
   --network-endpoint-group-zone [NETWORK_ENDPOINT_GROUP_ZONE] \
   --balancing-mode CONNECTION --max-connections-per-endpoint 5

각 항목의 의미는 다음과 같습니다.

  • [NETWORK_ENDPOINT_GROUP_NAME]은 네트워크 엔드포인트 그룹의 이름입니다.
  • [NETWORK_ENDPOINT_GROUP_ZONE]은 네트워크 엔드포인트 그룹의 영역입니다.

백엔드 서비스를 설명합니다.

gcloud compute backend-services describe my-bes --global

출력에서 백엔드 서비스가 상태 확인 및 네트워크 엔드포인트 그룹과 연결된 것으로 표시됩니다.

...
backends:
- balancingMode: CONNECTION
  capacityScaler: 1.0
  group: ... /networkEndpointGroups/k8s1-70aa83a6-default-my-service-80-c9710a6f
...
healthChecks:
- ... /healthChecks/my-hc
...
name: my-bes
...

백엔드 서비스가 구성될 때까지 5분 정도 기다립니다.

다음 명령어를 실행하여 백엔드 서비스 상태를 확인합니다.

gcloud compute backend-services get-health my-bes --global

출력에 각 엔드포인트의 상태가 표시됩니다.

...
status:
  healthStatus:
  - healthState: HEALTHY
    instance: ... gke-standard-cluster-3-default-pool-4cc71a15-qlpf
    ipAddress: 10.12.1.43
    port: 50000
  - healthState: HEALTHY
    instance: ... gke-standard-cluster-3-default-pool-4cc71a15-qlpf
    ipAddress: 10.12.1.44
    port: 50000
  - healthState: HEALTHY
    instance: ... gke-standard-cluster-3-default-pool-4cc71a15-w9nk
    ipAddress: 10.12.2.26
    port: 50000

TCP 프록시 및 전달 규칙 만들기

TCP 프록시를 만듭니다.

gcloud compute target-tcp-proxies create my-tp --backend-service my-bes

전달 규칙을 만듭니다.

gcloud compute forwarding-rules create my-for --global \
    --ip-protocol tcp --ports 25 --target-tcp-proxy my-tp

전달 규칙을 확인합니다.

gcloud compute forwarding-rules describe my-for --global

출력에 전달 규칙의 외부 IP 주소가 표시됩니다.

IPAddress: 203.0.113.1
IPProtocol: TCP
...
kind: compute#forwardingRule
loadBalancingScheme: EXTERNAL
name: my-for
...
portRange: 25 - 25

전달 규칙이 구성될 때까지 10분 정도 기다립니다.

netcat을 사용하여 전달 규칙을 테스트합니다.

nc -v [EXTERNAL_IP_ADDRESS] 25

여기서, [EXTERNAL_IP_ADDRESS]는 전달 규칙의 외부 IP 주소입니다.

결과에 컨테이너 중 하나의 응답이 표시됩니다.

Connection to 203.0.113.1 25 port [tcp/smtp] succeeded!
Hello TCP

삭제

이 페이지의 작업을 완료한 후에는 계정에서 원치 않는 요금이 부과되지 않도록 다음 명령어를 입력하여 리소스를 삭제합니다.

gcloud compute forwarding-rules delete my-for --global --quiet
gcloud compute target-tcp-proxies delete my-tp --quiet
gcloud compute backend-services delete my-bes --quiet --global
gcloud compute firewall-rules delete my-fwr --quiet
gcloud compute health-checks delete my-hc --quiet
kubectl delete service my-service
kubectl delete deployment my-deployment

다음 단계