네트워킹

GKE On-Prem은 서비스인그레스와 같은 Kubernetes 네트워킹 개념을 사용합니다. 이 문서는 GKE On-Prem 네트워킹이 어떻게 구성되어 있는지를 설명합니다.

클러스터 서비스 작업 및 섬(island) 모드

GKE On-Prem은 포드가 클러스터 내에서 서로 직접 통신할 수 있지만 클러스터 외부에서 연결할 수 없는 섬(island) 모드 구성을 사용합니다. 이 구성은 외부 네트워크에 연결되지 않은 네트워크 내에 '섬(island)'을 형성합니다. 클러스터는 BGP(Calco CNI 플러그인을 통해)를 사용하여 클러스터 노드에서 전체 노드 간 메시를 형성하므로 포드가 클러스터 내의 다른 포드에 직접 도달할 수 있습니다.

포드에서 클러스터 외부 대상으로 가는 모든 이그레스 트래픽은 노드 IP에 의해 NAT 처리됩니다. GKE On-Prem에는 클러스터 내에 배포된 ClusterIP 서비스의 인그레스 객체 규칙을 처리하는 Envoy 기반 인그레스 컨트롤러가 있는 L7 부하 분산기가 포함됩니다. 인그레스 컨트롤러 자체는 클러스터에서 NodePort 서비스로 노출됩니다.

인그레스 NodePort 서비스는 L3/L4 F5 부하 분산기를 통해 연결할 수 있습니다. 설치를 통해 부하 분산기에 포트 80 및 443으로 이루어진 가상 IP 주소(VIP)를 구성됩니다. VIP는 인그레스 컨트롤러의 NodePort 서비스에 있는 포트를 가리킵니다. 이는 외부 클라이언트가 클러스터의 서비스에 액세스하는 방법입니다.

서비스 사양의 loadBalancerIP 필드가 구성되었다면 사용자 클러스터는 LoadBalancer 유형의 서비스를 실행할 수 있습니다. loadBalancerIP 필드에 사용할 VIP를 제공해야 합니다. 이는 서비스의 NodePort를 가리키는 F5에서 구성됩니다.

F5 부하 분산기를 사용하는 대신 수동 부하 분산 모드를 사용 설정할 수 있습니다. 수동 부하 분산을 사용하는 경우 LoadBalancer 유형의 서비스를 실행할 수 없습니다. 대신 NodePort 유형의 서비스를 만들고 수동으로 부하 분산기를 구성하여 백엔드로 사용할 수 있습니다. 또한 인그레스 객체를 사용하여 서비스를 외부 클라이언트에 노출할 수 있습니다.

네트워킹 아키텍처

GKE On-Prem의 아키텍처를 설명하는 다이어그램 그림: GKE On-Prem 네트워킹

노드 IP 주소
DHCP 또는 노드에 고정으로 할당된 IP 주소이며(가상 머신 또는 VM이라고도 함), 데이터 센터 내에서 라우팅할 수 있어야 합니다. 수동으로 고정 IP를 할당할 수 있습니다.
포드 CIDR 블록
클러스터의 모든 포드에 대해 라우팅할 수 없는 CIDR 블록입니다. 이 범위에서 노드당 더 작은 /24 범위가 할당됩니다. N개의 노드 클러스터가 필요한 경우 /C가 N개의 /24 블록을 지원할 만큼 커야 합니다.
서비스 CIDR 블록
섬(island) 모드에서는 포드 CIDR 블록과 유사하게 클러스터 내에서만 사용됩니다. 노드, VIP 또는 포드 CIDR 블록과 겹치지 않는 모든 비공개 CIDR 블록입니다. 동일한 블록을 클러스터 간에 공유할 수 있으며, 블록 크기에 따라 서비스 수가 결정됩니다. 인그레스 서비스에는 서비스 IP가 1개 필요하고 클러스터 DNS 등과 같은 Kubernetes 서비스에는 IP가 10개 이상 필요합니다.
서비스 VIP
서비스를 노출할 때 F5에서 L4 인그레스에 대해 구성하는 라우팅 가능한 IP 주소의 N 수입니다. 이러한 VIP는 LoadBalancer 유형의 서비스를 만들 때 설정한 loadBalancerIP 값과 동일합니다.
제어 영역 VIP
Kubernetes API 서버의 F5 부하 분산기에서 구성하는 라우팅 가능한 IP 주소입니다.
인그레스 VIP
각 노드에서 실행하는 Envoy 프록시와 함께 F5 부하 분산기에서 L7 인그레스에 대해 구성하는 라우팅 가능한 IP 주소입니다.

네트워킹 구성 옵션

클러스터 네트워킹을 구성하는 몇 가지 옵션은 다음과 같습니다.

  • 하나의 전역 vCenter 네트워크를 선택하거나 관리자 및 사용자 클러스터에 다른 vCenter 네트워크를 사용할 수 있습니다.
  • HTTP 프록시를 사용할 수 있으며 프록시에서 제외할 주소를 선택할 수 있습니다.
  • DHCP 또는 고정 IP 할당을 선택할 수 있습니다.
  • 통합 또는 수동 부하 분산 모드를 선택할 수 있습니다.

설치 중에는 GKE On-Prem 구성 파일에 환경설정을 지정합니다.

vCenter 네트워크 구성

구성의 network 필드는 클러스터에 사용할 vCenter 네트워크를 결정합니다.

  • 전역 vcenter.network 필드는 하나의 특정 네트워크를 지정합니다.
  • admincluster.vcenter.network는 전역 필드를 재정의하고 관리자 클러스터에 사용할 네트워크를 지정합니다.
  • usercluster.vcenter.network는 전역 필드를 재정의하고 사용자 클러스터에 사용할 네트워크를 지정합니다.

예시: URL을 통해 웹 애플리케이션에 액세스

클러스터에서 frontend라는 배포로 방명록 웹 애플리케이션을 실행한다고 가정해 보겠습니다. URL(www.guestbook.com)을 사용하여 애플리케이션에 연결하려는 경우, 클러스터에서 실행 중인 배포에 URL을 매핑하는 방법이 필요합니다. 이 작업은 Kubernetes 인그레스 객체를 사용하여 수행할 수 있습니다.

시작하려면 먼저 클러스터의 기존 인그레스 VIP를 가리키는 *.guestbook.com의 와일드 카드 DNS 항목을 만듭니다.

*.guestbook.com    A   [INGRESS_VIP]

그런 다음 프런트엔드 배포를 위한 서비스를 만들어야 합니다. kubectl expose를 실행하면 배포 포드를 논리적으로 그룹화하고 클러스터 내의 공통 IP 주소를 제공하는 서비스가 생성됩니다.

kubectl expose deployment frontend

그러면 다음과 같이 ClusterIP 유형의 서비스가 생성됩니다.

apiVersion: v1
kind: Service
metadata:
  labels:
    app: guestbook
  name: frontend
spec:
  ports:
  - port: 80
    protocol: TCP
    targetPort: 80
  selector:
    app: guestbook
  type: ClusterIP

URL(www.guestbook.com)을 방금 만든 프런트엔드 서비스에 매핑해야 합니다. 아래 인그레스를 적용하면 매핑이 생성됩니다.

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: frontend
  labels:
    app: guestbook
spec:
  rules:
    - host: www.guestbook.com
      http:
        paths:
          - backend:
              serviceName: frontend   # name of the frontend Service
              servicePort: 80

이제 www.guestbook.com을 방문하여 브라우저에서 웹 애플리케이션을 엽니다.

다음은 이 기능이 비밀리에 작동하는 방식을 설명합니다.

  • 와일드 카드 DNS 항목을 만들었기 때문에 URL을 방문하면 클러스터의 인그레스 VIP에 액세스합니다.
  • 클러스터는 호스트 이름에 따라 올바른 인그레스 객체를 찾으며 이 경우에는 www.guestbook.com입니다.
  • 트래픽이 프런트엔드 포드로 포트 전달됩니다.

예시: IP 주소를 통해 웹 애플리케이션에 액세스

애플리케이션이 웹 애플리케이션이 아닐 경우 또는 네트워킹 제약이 있는 경우 서비스 전용 VIP를 만드는 것이 좋습니다. 이 작업을 수행하려면 LoadBalancer 유형의 Kubernetes 서비스를 사용하면 됩니다.

아래 서비스는 guestbook 애플리케이션 전용 VIP를 만듭니다.

apiVersion: v1
kind: Service
metadata:
  labels:
    app: guestbook
  name: frontend
spec:
  ports:
  - port: 80
    protocol: TCP
    targetPort: 80
  selector:
    app: guestbook
  type: LoadBalancer
  loadBalancerIP: [IP_ADDRESS]
  

이 서비스를 적용하면 F5 콘솔에 VIP가 표시되고 콘솔의 메뉴에 노드의 IP 주소가 표시됩니다. IP 주소를 방문하면 애플리케이션이 로드됩니다.