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
Documents
- http://nginx.org/en/docs/http/ngx_http_grpc_module.html
- https://www.nginx.com/blog/nginx-1-13-10-grpc/