Выставление сервиса в (GKE) Kubernetes только с внутренним ip - PullRequest
0 голосов
/ 26 февраля 2020

TL; DR В частном кластере GKE я не могу предоставить службу с внутренним / частным IP-адресом.

У нас есть развертывание, состоящее из около 20 микросервисов и 4 монолитов, которые в настоящее время полностью работают на виртуальных машинах в GoogleCloud. Я пытаюсь перенести эту инфраструктуру в GKE. Первым шагом проекта является создание частного кластера GKE (т.е. без каких-либо общедоступных c IP) в качестве замены нашего этапа. Поскольку это стадия, мне нужно выставить все конечные точки микросервиса вместе с конечными точками монолита внутри для целей отладки (значит, только для тех, которые подключены к VP C), и именно здесь я застрял. Я попробовал 2 подхода:

  1. Поставьте внутренний балансировщик нагрузки (ILB) перед каждым сервисом и монолитом. Пример:
apiVersion: v1
kind: Service
metadata:
  name: session
  annotations:
    cloud.google.com/load-balancer-type: "Internal"
  labels:
    app: session
    type: ms
spec:
  type: LoadBalancer
  selector:
    app: session
  ports:
  - name: grpc
    port: 80
    targetPort: 80
    protocol: TCP

enter image description here

Это работает, хотя и с серьезными ограничениями. ILB создает правило пересылки, и GCP имеет ограничение , равное 75 правилам пересылки на сеть . Это означает, что мы не можем построить более 3 кластеров в сети. Неприемлемо для нас.

а. Я попытался разместить входной контроллер перед всеми службами, который всегда выставляет весь кластер с общедоступным c IP - абсолютным нет-нет.
apiVersion: extensions/v1beta1
kind: Ingress
hostNetwork: true
metadata:
  name: ingress-ms-lb
  annotations:
    nginx.ingress.kubernetes.io/rewrite-target: /
spec:
  rules:
  - host: gs03
    http:
      paths:
      - path: /autodelivery/*
        backend:
          serviceName: autodelivery
          servicePort: 80
      - path: /session/*
        backend:
          serviceName: session
          servicePort: 80

b. Я попытался использовать входной контроллер nginx, который вообще не имеет IP-адреса.


apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: ingress-ms-lb
  annotations:
    nginx.ingress.kubernetes.io/rewrite-target: /
    # cloud.google.com/load-balancer-type: "Internal"
    nginx.ingress.kubernetes.io/ingress.class: nginx
    kubernetes.io/ingress.class: "nginx"
    # nginx.ingress.kubernetes.io/whitelist-source-range: 10.100.0.0/16, 10.110.0.0/16
spec:
  rules:
  - host: svclb
    http:
      paths:
      - path: /autodelivery/*
        backend:
          serviceName: autodelivery
          servicePort: 80
      - path: /session/*
        backend:
          serviceName: session
          servicePort: 80

Третий вариант - настроить правила брандмауэра, которые отключат любой доступ к публичным c IP-адресам. , Это было отклонено внутри страны, учитывая проблемы с безопасностью.

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

1 Ответ

0 голосов
/ 27 февраля 2020

На скриншоте, который вы прикрепили, я мог видеть, что ваш кластер GKE является частным кластером.

Поскольку вы хотите получать доступ к своим службам и приложениям внутри кластера GKE из всех ресурсов в одном и том же VP C Сеть, я хотел бы предложить вам использовать NodePort [1].

[1] https://cloud.google.com/kubernetes-engine/docs/concepts/service#service_of_type_nodeport

...