@TOC
前言
rust-grpc-proxy
目前功能基本完善。是时候上环境开始应用了。
之前考虑是gateway模式或者sidecar模式。
思考良久之后,觉得两种模式都有使用场景,那就都支持。本次就带来sidecar模式的食用姿势。
原理
微服务几乎都是在k8s上搭建的。而rust-grpc-proxy
作为无侵入的grpc转http代理,当然也要实现自动部署在k8s上。所以我们的目标如下
rust-grpc-proxy
能够作为sidecar运行在各个pod中- 能够根据标签实现自动注入,基于k8s的webhook能力
sidecar
为什么会优先推荐sidecar(边车模式),这是因为能够避免在集群模式下,rust-grpc-proxy
受某个节点的拖累,从而导致整个代理的低效,甚至是不可用。
rust-grpc-proxy
镜像目前最新版只有20MB,拉起非常快,并且会持续扫描主容器,直到超时或者代理成功。
因为是使用rust开发的,你可以大胆且放心的使用,资源消耗很小,安全性也有足够保证。
镜像也能够单独拿出来作为pod使用,可以通过配置文件,或者环境变量指定配置,具体参考上一篇博文的内容。
webhook
k8s的扩展功能里,允许用户在准入阶段(图中3)修改和认证请求,所以我们可以用MutatingAdmissionWebhook实现代理自动注入。 更多参考:https://v1-23.docs.kubernetes.io/zh/docs/reference/access-authn-authz/extensible-admission-controllers/
实现
安装k8s
教程很多了,这里就不写了 我的 k8s 版本是 1.24.9 之后的操作都在命名空间:qa
设置webhook
首先下载代码:git地址:https://github.com/woshihaoren4/grpc-proxy 进入 deploy目录
//建证书
./webhook-create-signed-cert.sh
//生成 mutating_admission.yaml
cat ./webhook_mutating.yaml | ./webhook-patch-ca-bundle.sh > /tmp/mutating_admission.yaml
//添加权限
kubectl apply -f webhook_rbac.yaml
//生成service
kubectl apply -f webhook_service.yaml
//生成deployment
kubectl apply -f webhook_deployment.yaml
//生成admission
kubectl apply -f /tmp/mutating_admission.yaml
说明1:webhook的镜像是:registry.cn-hangzhou.aliyuncs.com/wshr/wd:sidecar-v4 代码位置:https://github.com/woshihaoren4/grpc-proxy/tree/main/webhook
说明2:这个webhook的作用是 在检测到创建或者更新pod时,如果存在 rustGrpcProxyEnable 标签,则自动将rust-grpc-proxy
注入到pod配置中,并将这个标签的value 作为目标服务的端口 从而进行代理。
说明3:如果你用的rancher,需要编辑集群的yaml文件,添加如下配置. 否则创建证书请求一直是Approved 而不Issued
services:
kube-controller:
extra_args:
cluster-signing-cert-file: "/etc/kubernetes/ssl/kube-ca.pem"
cluster-signing-key-file: "/etc/kubernetes/ssl/kube-ca-key.pem"
说明4:建议在webhook_mutating.yaml文件中开启这个选项namespaceSelector
让webhook只在特定命名空间中生效,如果开启了这个,则需要设置命名空间标签
kubectl label namespace <namespace> <key>=enabled
使用
创建一个带标签的pod 这里用到的镜像就是之前的echo测试程序打包成的
kubectl apply -f echo_deployment.yaml
重点内容是这个标签:rustGrpcProxyEnable: "1234"
只有存在这个标签才会添加代理。1234 是echo服务的grpc端口
spec:
template:
labels:
app: echo-server
rustGrpcProxyEnable: "1234"
等待一段时间后,可以看到pod已经创建成功。想要测试我们还需要开放一个外网端口
kubectl apply -f ./echo_service.yaml
echo_service.yaml
中的内容是创建一个node端口的service,并且映射到echo-server
服务上。大体如下配置
spec:
ports:
- name: http
nodePort: 30000
port: 6789
protocol: TCP
targetPort: 6789
selector:
app: echo-server
设置成功后,发起一个测试命令
- <NODE_HOST> 替换为节点地址
curl --location --request GET 'http://<NODE_HOST>:30000/api/v1/echo/hello/get?query=666' \
--header 'echo-hello: world' \
--header 'MD-hello: world'
然后就可以看到返回内容{"response": "GET [test-server]---> request=hello query=666"}
表明测试成功
尾语
本文涉及了很多非rust-grpc-proxy
相关的内容,需要和代码一起看。但容器化 微服务,云原生都是大势所趋,rust-grpc-proxy
本意就是基于云原生设计的。
评论区
写评论还没有评论