[英]How to connect to the gRPC service inside k8s cluster from outside gRPC client
我有一个gRPC server
在端口9000上运行, gRPC-gateway
在端口9080上运行。 我可以使用以下链接通过 postman 向我的服务提出请求:```http: //cluster1.example.com /api/v1/namespaces/default/services/ my-service:9080 /proxy
如何使用grpc.Dial()
从gRPC client
(在集群外部的本地计算机上)连接到我的服务?
例子:
conn, err := grpc.Dial(...?, grpc.WithInsecure())
if err != nil {
panic(err)
}
您应该能够通过端口转发从本地连接到 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)
}
我可能 state 很明显,但当然服务器也必须以不安全模式(无凭据)启动,否则您可能会收到Unavailable
的响应代码。
简短的回答:
这主要不是 Golang 问题,而是 Kubernetes 问题。 您必须设置 Kubernetes 部件并像以前在 Golang 中一样使用它。
您可以参考@blackgreen 的答案以获取简单而临时的方法。
Kubernetes使用overlay网络, Flannel大部分情况下,集群内部的通信默认设置,与外部隔离。
当然有一些像Calico这样的项目可以连接内部和外部网络,但它是另一回事。
如果我们想从外部访问 Pod,有几种解决方案。
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可能是一个不错的选择。
它使用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
https://kubernetes.io/docs/concepts/services-networking/ingress/
Ingress 是一个管理外部网络访问Service
的第 7 层代理,因为gRPC
也是建立在HTTP/2
之上的,因此Ingress 可以完美地工作。
如果您要公开生产应用程序,则应选择 Ingress。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.