前言

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本意就是基于云原生设计的。

Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐