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

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

개요

Google Cloud Platform에는 다양한 부하 분산 구성요소가 있으며, 이러한 부하 분산 구성요소를 다양한 방법으로 결합하여 애플리케이션에 부하 분산을 제공할 수 있습니다. 이 주제의 단계에서는 다음 구성요소를 결합하여 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 네이티브 클러스터 만들기를 참조하세요.

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

  • 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"

배포에는 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 Platform Console을 사용하여 네트워크 엔드포인트 그룹을 검사할 수 있습니다.

gcloud

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

gcloud beta 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 beta 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
````

콘솔

  1. GCP Console에서 Google Kubernetes Engine TODO 메뉴로 이동합니다.

    작업 부하 메뉴로 이동

  2. 배포를 클릭합니다.

  3. 컨테이너 이미지에 컨테이너 이미지 및 해당 버전(예: nginx:latest)을 입력하거나 기존 Google Container Registry 이미지 선택을 클릭하고 이미지를 선택합니다.

  4. 환경 변수, 초기 명령어, 애플리케이션 이름, 네임스페이스, 라벨 추가 등 원하는 대로 컨테이너를 구성합니다.

  5. 클러스터 드롭다운 메뉴에서 원하는 클러스터를 선택합니다.

  6. 배포를 클릭합니다.

방화벽 규칙 만들기

이 연습의 후반부에서는 상태 확인 및 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 beta compute health-checks create tcp my-hc --use-serving-port

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

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

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

gcloud beta 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]은 네트워크 엔드포인트 그룹의 영역(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 beta 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.16
    port: 8080
  - healthState: HEALTHY
    instance: ... gke-standard-cluster-3-default-pool-4cc71a15-qlpf
    ipAddress: 10.12.1.17
    port: 8080
  - healthState: HEALTHY
    instance: ... gke-standard-cluster-3-default-pool-4cc71a15-w9nk
    ipAddress: 10.12.2.10
    port: 8080

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

다음 단계

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

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

Kubernetes Engine 문서