如何在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/)