Предоставление сервиса в (GKE) Kubernetes только с внутренним ip

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

У нас есть развертывание, состоящее из около 20 микросервисов и 4 монолитов, которые в настоящее время полностью работают на виртуальных машинах в GoogleCloud. Я пытаюсь перенести эту инфраструктуру на GKE. Первым шагом проекта является создание частного кластера GKE (то есть без общедоступного IP-адреса) в качестве замены нашей промежуточной стадии. Поскольку это постановка, мне нужно открыть все конечные точки микросервисов вместе с конечными точками монолита внутри для целей отладки (то есть только для тех, которые подключены к VPC), и именно здесь я застрял. Я пробовал 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

введите здесь описание изображения

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

  1. а. Я попытался разместить контроллер входящего трафика перед всеми службами, который всегда предоставляет весь кластер с общедоступным 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

б. Я попытался использовать входной контроллер 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

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

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


person smaikap    schedule 25.02.2020    source источник


Ответы (1)


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

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

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

person amonaco    schedule 27.02.2020