如何在Minikube中運行gRPC服務
本文通過一個具體的例子介紹瞭如何在Minikube中運行gRPC服務。
本文使用了Ubuntu 16.04.3 LTS操作系統。
0.1 安裝並配置Docker、Minikube和kubectl。注意:Minicube的安裝和運行需要連接Google的網站
wget -qO- https://get.docker.com | sh
curl -Lo minikube https://storage.googleapis.com/minikube/releases/latest/minikube-linux-amd64
curl -Lo kubectl https://storage.googleapis.com/kubernetes-release/release/$(curl \
-s https://storage.googleapis.com/kubernetes-release/release/stable.txt)/bin/linux/amd64/kubectl
chmod +x *
mv * /usr/local/bin/
minikube start --vm-driver=none
0.2 在minikube中啓動一個gRPC的服務
kubectl run \
--image=caiofilipini/grpc-weather:master grpc-weather \
--port=9000 \
--env="OPEN_WEATHER_MAP_API_KEY=<your api key>" \
--env="WEATHER_UNDERGROUND_API_KEY=<your api key>"
在Kubernetes集羣內部訪問
1.1 暴露爲服務,默認爲ClusterIP類型
kubectl expose deployment grpc-weather --port=9000 --name=grpc-weather
用kubectl get svc命令查看服務的集羣IP,例如
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
grpc-weather ClusterIP 10.97.231.175 <none> 9000/TCP 48s
1.2 在Minikube中啓動一個客戶端服務Pod
echo '
apiVersion: v1
kind: Pod
metadata:
name: grpc-weather-client
spec:
containers:
- image: caiofilipini/grpc-weather:master
name: grpc-weather-client
command: ["sleep", "9999999"]
' | kubectl create -f -
1.3 連接到客戶端服務容器
kubectl exec -it grpc-weather-client bash
1.4 運行測試,注意將以下命令中的IP換爲在1.1中查到的CLUSTER-IP
make build-client
./weath_client/client --s 10.97.231.175 --p 9000 Santiago
顯示類似以下的信息,則表示gRPC服務調用成功
2018/03/06 02:39:12 It's currently 22.5°C, clear sky in Santiago
2.1 暴露爲一個NodePort類型的服務,以下命令將服務暴露於30123端口
echo "
apiVersion: v1
kind: Service
metadata:
name: grpc-weather-np
spec:
type: NodePort
ports:
- port: 80
targetPort: 9000
nodePort: 30123
selector:
app: weather
" | kubectl create -f -
使用minikube ip命令查看Node IP,本例中爲172.31.29.181
2.2 使用Docker在Kubernets之外運行一個客戶端
docker run \
--rm \
-it \
--name weather_service \
--entrypoint bash \
--net=host \
caiofilipini/grpc-weather:master
2.3 運行測試,注意將以下命令中的IP換爲在2.1中查到的Node Ip
make build-client
./weather_client/client --s 172.31.29.181 --p 30123 Santiago
顯示類似以下的信息,則表示gRPC服務調用成功
2018/03/06 02:39:12 It's currently 22.5°C, clear sky in Santiago
進一步的思考
3.1 如圖所示,使用NodePort暴露服務時,外部客戶端需要得知所有Node的IP,或者需要負載均衡器的支持,纔可以達到高可用的效果。是否有動態的方法支持高可用性?
3.2 如何調用Kubernetes集羣外部的gRPC服務?
參考文章
4.1 Add example using grpc and http2 (https://github.com/kubernetes/ingress-nginx/issues/39)
4.2 Kubernetes in Action (https://www.safaribooksonline.com/library/view/kubernetes-in-action/9781617293726/)