Доступ к службе порта узла в частном кластере GKE из другого частного кластера GKE - PullRequest
0 голосов
/ 26 марта 2020

Я использую облако Google, и у меня есть два частных кластера GKE.

Один из них содержит некоторые службы, установленные как nodePort. Другой кластер должен подключиться к этому и получить доступ к службам.

Кластер с службами имеет только один узел с частным IP. Я могу успешно пропинговать этот узел из другого кластера, используя этот частный IP-адрес.

Но как я могу получить доступ к сервисам?

Я также попытался настроить некоторые правила брандмауэра, но безуспешно.

1 Ответ

1 голос
/ 26 марта 2020

Пожалуйста, посмотрите на приведенный ниже пример, который показывает, как установить соединение со службой (NodePort) между двумя частными кластерами GKE:

В этом примере будут использоваться два кластера GKE:

  • gke-private-cluster-main - это будет кластер с простым hello-app
  • gke-private-cluster-europe - этот кластер сможет связываться с основным кластером

To упростить это все кластеры будут иметь только один узел.

Создание развертывания и службы на gke-private-cluster-main

Ниже приведен простой пример hello-app и службы, которая будет предоставлять hello-app для порта 30051:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: hello
spec:
  selector:
    matchLabels:
      app: hello
      version: 1.0.0
  replicas: 3
  template:
    metadata:
      labels:
        app: hello
        version: 1.0.0
    spec:
      containers:
      - name: hello
        image: "gcr.io/google-samples/hello-app:1.0"
        env:
        - name: "PORT"
          value: "50001"
---
apiVersion: v1
kind: Service
metadata:
  name: hello-service
spec:
  selector:
    app: hello
  ports:
    - name: hello-port
      port: 50001
      targetPort: 50001
      nodePort: 30051
  type: NodePort

Примените его и проверьте внутренний IP-адрес узла, который породил эти модули. Вы можете проверить это с помощью:

  • GCP -> Compute Engine -> VM Instances
  • kubectl get nodes -o wide

В моем случае это было 10.156.0.2

Попробуйте получить к нему доступ с gke-private-cluster-europe

Вы можете S SH к узлу gke-private-cluster-europe и попытаться вызвать команду с узла: curl 10.156.0.2:30051. Вы должны иметь возможность общаться с этим сервисом и получать вывод, как показано ниже:

Hello, world!
Version: 1.0.0
Hostname: hello-5d79ccdb55-vrrbs

Для проверки возможности подключения изнутри модуля вам потребуется изображение, уже встроенное curl. Inte rnet - это место для всевозможных удивительных вещей, и на самом деле есть изображение, которое доступно. Вы можете создать стручок с завитком ниже YAML:

apiVersion: v1
kind: Pod
metadata:
  name: curl
  namespace: default
spec:
  containers:
  - image: curlimages/curl
    command:
      - sleep
      - "infinity"
    imagePullPolicy: IfNotPresent
    name: curl
  restartPolicy: Always

После применения выше YAML, вы можете exe c в капсулу и проверить себя с помощью ниже команды:

  • $ kubectl exec -it curl -- /bin/sh
  • $ curl 10.156.0.2:30051

Выход из кластера будет выглядеть следующим образом:

curl: (28) Failed to connect to 10.156.0.2 port 30051: Operation timed out

Это работает для узла, но не работает для модуля.

Разрешить трафик c:

Чтобы разрешить вышеуказанное сетевое подключение, вы будете необходимо:

  • Открыть Google Cloud Platform
    • Проверить сетевой тег gke-private-cluster-main узла
      • Go до Compute Engine
      • Найдите узел gke-private-cluster-main
      • Нажмите на него, чтобы получить более подробную информацию
      • Скопируйте сетевой тег, который должен выглядеть примерно так: gke-gke-private-cluster-main-80fe50b2-node
    • Проверьте диапазон адресов из gke-private-cluster-europe:
      • Go до Kubernetes Engine
      • Найдите свой gke-private-cluster-europe
      • Нажмите на него, чтобы получить более подробную информацию
      • Скопируйте the диапазон адресов модуля, который должен выглядеть примерно так: 10.24.0.0/14

С помощью скопированного сетевого тега и диапазона модуля можно создать правило брандмауэра. Пожалуйста, go до:

VPC Network -> Firewall rules -> Create a firewall rule

Firewall rule

Пожалуйста, обратите внимание на детали, где Используется сетевой тег и диапазон pod, поскольку он будет другим для вас.

Примените его и проверьте еще раз, может ли модуль в gke-private-cluster-europe иметь доступ к 10.156.0.2:30051.

Это должно дать вам вывод ниже:

Hello, world!
Version: 1.0.0
Hostname: hello-5d79ccdb55-6s8xh

Пожалуйста, дайте мне знать, если у вас есть какие-либо вопросы по этому поводу.

...