Service Mesh - gRPC 本地联调远程服务
程序员文章站
2024-01-01 18:59:40
Description Service Mesh 架构下,服务间调用会通过服务名(Service Name)互相调用,比如在 Kubernetes 、Docker Swarm 集群中,服务 IP 均由集群动态分配,外部网络无法直接访问到集群内部的服务。对于大型系统,微服务的数量较多,服务间的调用关系 ......
description
service mesh 架构下,服务间调用会通过服务名(service name)互相调用,比如在 kubernetes 、docker swarm 集群中,服务 ip 均由集群动态分配,外部网络无法直接访问到集群内部的服务。对于大型系统,微服务的数量较多,服务间的调用关系也错综复杂,遇到问题时,本地启动整个服务集群去 debug,不仅需要本地电脑有很高的配置,而且操作起来也比较麻烦。比较优雅一点的做法是本地启动相应服务,grpc 调用都连接到远程集群。
nginx grpc module
nginx 版本 1.13.10
之后支持 grpc 反向代理,这样我们就能通过在集群中部署 nginx 服务,来连通外部网络和集群内的服务。
kubernetes demo
1、deploy grpc server in kubernetes cluster
- 首先,在 kubernetes 集群中部署镜像为
python:3
的容器,为下面的代码提供运行环境 - 然后,克隆项目 https://github.com/chinasilence/python-grpc,执行
pip install python-grpc
安装依赖 - 接着,在
python-grpc
目录下执行python server/server.py
,观察日志,等待 grpc server 启动成功 - 最后,创建 kubernetes service,暴露 grpc 服务
kind: service apiversion: v1 metadata: name: server-a-service namespace: default spec: ports: - port: 6565 targetport: 6565 selector: app: server-a
2、deploy nginx grpc proxy in kubernetes cluster
以下内容包含 nginx config、nginx deployment 和 nginx service,提供了 grpc 请求的转发能力:
apiversion: v1 kind: configmap metadata: name: nginx-grpc-proxy-config namespace: default data: grpc.conf: | server { listen 6565 http2; server_name server-a-service; location / { grpc_pass grpc://server-a-service.default:6565; } } --- apiversion: apps/v1 kind: deployment metadata: name: nginx-grpc-proxy-deployment namespace: default spec: replicas: 1 selector: matchlabels: app: nginx-grpc-proxy template: metadata: labels: app: nginx-grpc-proxy spec: containers: - name: nginx-grpc-proxy image: nginx:1.17 ports: - containerport: 6565 volumemounts: - mountpath: /etc/nginx/conf.d/ name: nginx-config volumes: - name: nginx-config configmap: name: nginx-grpc-proxy-config --- kind: service apiversion: v1 metadata: name: nginx-grpc-proxy-service namespace: default spec: ports: - port: 6565 targetport: 6565 nodeport: 30000 selector: app: nginx-grpc-proxy type: nodeport
3、test local client connect remote server
- 添加 host 记录:
<k8s 公网 ip> server-a-service
- 本地克隆项目 https://github.com/chinasilence/python-grpc,执行
pip3 install python-grpc
安装依赖(需要 python3 的环境) - 在
python-grpc
下修改文件client/client.py
servers = [server('test', '127.0.0.1', 6565)] # 变更为 servers = [server('test', 'server-a-service', 30000)]
- 执行
python3 client/client.py
测试远程调用是否正常(示例中包含正常调用和异常调用)
questions
多个远程 grpc 服务如何配置 nginx?
nginx 配置文件中添加多个 server 记录:
server { listen 6565 http2; server_name server-a-service; location / { grpc_pass grpc://server-a-service.default:6565; } } server { listen 6565 http2; server_name server-b-service; location / { grpc_pass grpc://server-b-service.default:6565; } }
本地 host 需要添加相应的记录:
<k8s 公网 ip> server-a-service <k8s 公网 ip> server-b-service