如何从外部 gRPC 客户端连接到 k8s 集群内部的 gRPC 服务

时间:2021-03-17 15:25:41

标签: go grpc grpc-go

我有一个 gRPC server 在端口 9000 上运行,而 gRPC-gateway 在端口 9080 上运行。 我可以使用以下链接通过邮递员向我的服务发出请求:```http://cluster1.example.com/api/v1/namespaces/default/services/my-service :9080/proxy

如何使用 gRPC clientgrpc.Dial()(在集群外的本地机器上)连接到我的服务?

示例:

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

2 个答案:

答案 0 :(得分:1)

您应该能够通过端口转发从本地连接到 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 响应代码。

答案 1 :(得分:1)

简答:

这主要不是 Golang 的问题,而是 Kubernetes 的问题。您必须像以前一样在 Golang 中设置 Kubernetes 部分并使用它。

您可以参考 @blackgreen's answer 获取一种简单且临时的方法。

详情

Kubernetes 使用覆盖网络,Flannel 在大多数情况下,集群内部的通信是默认设置的,并且与外部隔离。

当然有一些像Calico这样的项目可以连接内网和外网,但这又是另外一回事了。

如果我们想从外部访问 Pod,有几种解决方案。

kubectl

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

Kubectl 使用 socat 创建隧道并将一个或多个本地端口转发到 Pod。

当你停止命令时端口转发会结束,但如果你想临时访问pod进行调试,这是一个不错的选择。

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

服务

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

Service 是将在一组 Pod 上运行的应用程序公开为网络服务的抽象方法。

从外部访问时,有多种 Service 可供使用,NodePort 在大多数情况下可能是一个不错的选择。

它使用 iptablesipvs 在所有 Nodes 转发网络中创建一个 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

入口

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

Ingress 是第 7 层代理,管理对 Service 的外部网络访问,因为 gRPC 也构建在 HTTP/2Ingress work perfectly 之上。

如果您要公开生产应用程序,则应该选择 Ingress。