如何从外部 gRPC 客户端连接到 k8s 集群内的 gRPC 服务
How to connect to the gRPC service inside k8s cluster from outside gRPC client
我在端口 9000 上有一个 gRPC server
运行,在端口 9080 上有一个 gRPC-gateway
运行 。
我可以使用以下 link 向邮递员请求我的服务:```http://cluster1.example.com/api/v1/namespaces/default/services/我的服务:9080/代理
如何使用 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
使用本地主机并且没有方案:
conn, err := grpc.Dial("localhost:9000", grpc.WithInsecure())
if err != nil {
panic(err)
}
我可能会说的很明显,但当然服务器也必须以不安全模式(无凭据)启动,否则您可能会得到 Unavailable
响应代码。
简答:
这主要不是 Golang 问题,而是 Kubernetes 问题。您必须设置 Kubernetes 部分并像以前一样在 Golang 中使用它。
简单临时的方法可以参考
详情
Kubernetes使用overlay网络,Flannel大多数情况下,集群内部的通信是默认设置的,与外部是隔离的。
当然有Calico这样的项目可以连接内外网,但又是另外一回事了。
如果我们想从外部访问pods,有几种解决方案。
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
是一种将应用程序 运行 在一组 Pods 上公开为网络服务的抽象方法。
从外部访问时,有多种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 work perfectly.[=29= 之上的]
如果您要公开生产应用程序,应该选择 Ingress。
我在端口 9000 上有一个 gRPC server
运行,在端口 9080 上有一个 gRPC-gateway
运行 。
我可以使用以下 link 向邮递员请求我的服务:```http://cluster1.example.com/api/v1/namespaces/default/services/我的服务:9080/代理
如何使用 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
使用本地主机并且没有方案:
conn, err := grpc.Dial("localhost:9000", grpc.WithInsecure())
if err != nil {
panic(err)
}
我可能会说的很明显,但当然服务器也必须以不安全模式(无凭据)启动,否则您可能会得到 Unavailable
响应代码。
简答:
这主要不是 Golang 问题,而是 Kubernetes 问题。您必须设置 Kubernetes 部分并像以前一样在 Golang 中使用它。
简单临时的方法可以参考
详情
Kubernetes使用overlay网络,Flannel大多数情况下,集群内部的通信是默认设置的,与外部是隔离的。
当然有Calico这样的项目可以连接内外网,但又是另外一回事了。
如果我们想从外部访问pods,有几种解决方案。
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
是一种将应用程序 运行 在一组 Pods 上公开为网络服务的抽象方法。
从外部访问时,有多种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 work perfectly.[=29= 之上的]
如果您要公开生产应用程序,应该选择 Ingress。