本文通过一个具体的例子介绍了如何在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=" \
--env="WEATHER_UNDERGROUND_API_KEY="
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 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/)