Как подключиться к службе gRPC внутри кластера k8s извне клиента gRPC

У меня gRPC server работает на порту 9000 с gRPC-gateway на порту 9080. Я могу сделать запрос в мою службу с помощью почтальона, используя следующую ссылку: `` http: // cluster1.example.com / api / v1 / namespaces / default / services / my-service : 9080 / прокси

Как я могу подключиться к моей службе из gRPC client (на моем локальном компьютере, который находится вне кластера) с помощью grpc.Dial()?

Пример:

conn, err := grpc.Dial(...?, grpc.WithInsecure())
if err != nil {
    panic(err)
}

person Klimbo    schedule 17.03.2021    source источник
comment
Вы пробовали `cluster1.example.com:9000 '? (клиент go gRPC будет напрямую связываться с сервером gRPC). См. документ об именах для получения информации о поддерживаемых форматах. Если вам нужен инструмент для тестирования, попробуйте bloomRPC.   -  person Brits    schedule 17.03.2021
comment
@Brits Я пробовал cluster1.example.com:9000, но получил i/o timeout ошибку. Я думаю, это было ожидаемое поведение. Как он узнает, к какому сервису подключается grpc (в кластере k8s огромное количество сервисов)?   -  person Klimbo    schedule 18.03.2021
comment
@Brits Вот способ подключения к сервису k8s. Я сделал свой URL-адрес с помощью этой документации. Но я не понимаю, как подключиться к конкретной службе внутри кластера из клиента grpc ...   -  person Klimbo    schedule 18.03.2021


Ответы (2)


Вы должны иметь возможность подключаться к службам в кластере k8s локально с переадресацией портов:

kubectl port-forward --context <mycontext> -n <mynamespace> svc/my-service 9000:9000

А затем вы просто передаете цель gRPC в Dial с localhost и без схемы:

conn, err := grpc.Dial("localhost:9000", grpc.WithInsecure())
if err != nil {
    panic(err)
}

Я мог бы заявить очевидное, но, конечно, сервер также должен быть запущен в небезопасном режиме (без учетных данных), иначе вы можете получить Unavailable код ответа.

person blackgreen    schedule 19.03.2021

Короткий ответ:

В основном это не вопрос Голанга, это вопрос Kubernetes. Вы должны настроить часть Kubernetes и использовать ее, как когда-либо прежде, в Golang.

Вы можете обратиться к ответу @ blackgreen за простым и временным способом.

Подробности

Kubernetes использует оверлейную сеть, Flannel, в большинстве случаев связь внутри кластера настраивается по умолчанию, и он изолирован снаружи.

Конечно, есть такие проекты, как Calico, которые могут соединять внутреннюю и внешнюю сеть, но это уже другая история.

Есть несколько решений, если мы хотим получить доступ к модулям извне.

kubectl

https://kubernetes.io/docs/tasks/access-application-cluster/port-forward-access-application-cluster/

Kubectl использует socat для создания туннеля и перенаправления одного или нескольких локальных портов на модуль.

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

kubectl port-forward redis-master-765d459796-258hz 7000:6379

Услуга

https://kubernetes.io/docs/concepts/services-networking/service/#publishing-services-service-types

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

при доступе извне можно использовать разные Service, NodePort может быть хорошим выбором в большинстве случаев.

Он использует iptables или ipvs для создания Port Forward во всех узлах, пересылающих сеть на целевой порт.

apiVersion: v1
kind: Service
metadata:
  name: my-service
spec:
  type: NodePort
  selector:
    app: MyApp
  ports:
      # By default and for convenience, the `targetPort` is set to the same value as the `port` field.
    - port: 80
      targetPort: 80
      # Optional field
      # By default and for convenience, the Kubernetes control plane will allocate a port from a range (default: 30000-32767)
      nodePort: 30007

Ingress

https://kubernetes.io/docs/concepts/services-networking/ingress/ < / а>

Ingress - это прокси-сервер уровня 7, управляющий внешним сетевым доступом к Service, поскольку gRPC также построен на основе HTTP/2, Ingress работает отлично.

Если вы открываете производственное приложение, следует выбрать Ingress.

person PapEr    schedule 21.03.2021
comment
Спасибо за развернутый ответ! Попробую сделать с Ingress. - person Klimbo; 21.03.2021