
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/
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/12541.html
標籤:架構設計
