【rust-grpc-proxy】在k8s中,自动注入代理到pod中,再不必为grpc调试而烦恼
目录
- 前言
- 原理
- sidecar
- webhook
- 实现
- 安装k8s
- 设置webhook
- 使用
- 尾语
前言
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-serverrustGrpcProxyEnable: "1234"
等待一段时间后,可以看到pod已经创建成功。想要测试我们还需要开放一个外网端口
kubectl apply -f ./echo_service.yaml
echo_service.yaml 中的内容是创建一个node端口的service,并且映射到echo-server 服务上。大体如下配置
spec:ports:- name: httpnodePort: 30000port: 6789protocol: TCPtargetPort: 6789selector: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本意就是基于云原生设计的。
相关文章:
【rust-grpc-proxy】在k8s中,自动注入代理到pod中,再不必为grpc调试而烦恼
目录前言原理sidecarwebhook实现安装k8s设置webhook使用尾语前言 rust-grpc-proxy 目前功能基本完善。是时候上环境开始应用了。 之前考虑是gateway模式或者sidecar模式。 思考良久之后,觉得两种模式都有使用场景,那就都支持。本次就带来sidecar模式的食…...
VisualStudio2022制作多项目模板及Vsix插件
一、安装工作负载 在vs2022上安装“visual studio扩展开发 ”工作负载 二、制作多项目模板 导出项目模板这个我就不再多说了(项目→导出模板→选择项目模板,选择要导出的项目→填写模板信息→完成)。 1.准备模板文件 将解决方案中的多个…...
仿写简单IOC
目录 TestController类: UserService类: 核心代码SpringIOC: Autowired和Component注解 SpringIOCTest 类 编辑 总结: TestController类: Component public class TestController {Autowiredprivate UserService userService;public void test…...
liunx下安装node exporter
1 建立文件夹 cd /opt mkdir software 下载最新的包,并解压 https://prometheus.io/download/ 下载 curl -LO https://github.com/prometheus/node_exporter/releases/download/v0.18.1/node_exporter-0.18.1.linux-amd64.tar.gz 3.解压 tar -xvf node_exporter-0.…...
lambda函数
Lambda(函数指针)lambda 是c11非常重要也是最常用的特性之一,他有以下优点:可以就地匿名定义目标函数或函数对象,不需要额外写一个函数lambda表达式是一个匿名的内联函数lambda表达式定义了一个匿名函数,语法如下:[cap…...
【Python入门第二十七天】Python 日期
Python 日期 Python 中的日期不是其自身的数据类型,但是我们可以导入名为 datetime 的模块,把日期视作日期对象进行处理。 实例 导入 datetime 模块并显示当前日期: import datetimex datetime.datetime.now() print(x)运行实例 2023-0…...
C++基础知识【5】数组和指针
目录 一、概述 数组 指针 二、数组 2.1、数组的声明 2.2、数组的初始化 2.3、数组的访问 2.4、多维数组 2.5、数组作为函数参数 三、指针 3.1、指针的声明 3.2、指针的赋值 3.3、指针的访问 3.4、指针运算 3.5、指针数组和数组指针 3.6、二级指针 四、数组和指…...
Vim使用操作命令笔记
Vim使用操作命令笔记在普通模式下,输入 : help tutor 就可以进入vim的教学 在 terminal 中输入 vim 文件名 就可以打开文件 vim有两种模式 normal mode (普通模式)→ 指令操作 insert mode (输入模式&…...
【论文阅读】Robust Multi-Instance Learning with Stable Instances
1、摘要与引言 以往的MIL算法遵循i.i.d假设:训练样本与测试样本都分别来自于同一分布中,而这一假设往往与现实应用中有所出入。研究人员通过计算训练样本与测试样本之间的密度比对训练样本进行加权,以解决分布变化带来的问题。 分布的变化发…...
洛谷 P5116 [USACO18DEC]Mixing Milk B
题目链接:P5116 [USACO18DEC]Mixing Milk B - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 题目描述 农业,尤其是生产牛奶,是一个竞争激烈的行业。Farmer John 发现如果他不在牛奶生产工艺上有所创新,他的乳制品生意可能就会受…...
华为OD机试 - 最左侧冗余覆盖子串(C 语言解题)【独家】
最近更新的博客 华为od 2023 | 什么是华为od,od 薪资待遇,od机试题清单华为OD机试真题大全,用 Python 解华为机试题 | 机试宝典【华为OD机试】全流程解析+经验分享,题型分享,防作弊指南)华为od机试,独家整理 已参加机试人员的实战技巧文章目录 使用说明本期题目:最左侧冗…...
实验7 图像水印
本次实验大部分素材来源于山大王成优老师的讲义以及冈萨雷斯(MATLAB版),仅作个人学习笔记使用,禁止用作商业目的。 文章目录一、实验目的二、实验例题1. 数字图像水印技术2. 可见水印的嵌入3. 不可见脆弱水印4. 不可见鲁棒水印一、…...
如何实现大文件断点续传、秒传
大家先来了解一下几个概念: 「文件分块」:将大文件拆分成小文件,将小文件上传\下载,最后再将小文件组装成大文件; 「断点续传」:在文件分块的基础上,将每个小文件采用单独的线程进行上传\下载&…...
备战蓝桥python——完全平方数
完全平方数 链接: 完全平方数 暴力解法: n int(input()) for i in range(1, n1):if(((i*n)**0.5)%10.0):print(i)break运用数论相关知识求解 任意一个正整数都可以被分解成若干个质数乘积的形式,例如 :2022∗5120 \ 2^{2}*5^{1}\,20 22∗51 由此…...
WebRTC中的NAT穿透
NAT简介 我们知道,WebRTC会按照内网、P2P、中转的顺序来尝试连接。在大部分的情况下,实际是使用P2P或者中转的。这里P2P的场景主要使用的技术就是NAT穿透。 我们先简单了解下NAT。NAT在真实网络中是常见的,它的出现一是为了解决ipv4地址不够…...
SpringCloud-高级篇(一)
目录: (1)初识Sentinel-雪崩问题的解决方案 (2)服务保护Sentinel和Hystrix对比 (3)Sentinel初始-安转控制台 (4)整合微服务和Sentinel 微服务高级篇 (1&…...
电脑自动重启是什么原因?详细解说
案例:电脑自动重启是什么原因? “一台用了一年的电脑,最近使用,每天都会一两次莫名其妙自动重启,看了电脑错误日志,看不懂什么意思,一直找不到答案。有没有高手知道怎么解决这个问题的。” 当…...
2023美国大学生数学建模竞赛E题思路
problem 背景: 光污染用于描述过度或不良使用人造光。我们称之为光污染的一些现象包括光侵入、过度照明和光杂波。在大城市,太阳落山后,这些现象最容易在天空中看到:然而,它们也可能发生在更偏远的地区。 光污染会改变我们对夜空…...
蓝桥杯三月刷题 第五天
文章目录💥前言😉解题报告💥数的分解🤔一、思路:😎二、代码:💥前言 上午没写,下午写了会被朋友拉出去耍,被冷风吹到了,而且被他坑了,根本没有玩骑…...
零门槛NAS搭建:WinNAS如何让普通电脑秒变私有云?
一、核心优势:专为Windows用户设计的极简NAS WinNAS由深圳耘想存储科技开发,是一款收费低廉但功能全面的Windows NAS工具,主打“无学习成本部署” 。与其他NAS软件相比,其优势在于: 无需硬件改造:将任意W…...
【kafka】Golang实现分布式Masscan任务调度系统
要求: 输出两个程序,一个命令行程序(命令行参数用flag)和一个服务端程序。 命令行程序支持通过命令行参数配置下发IP或IP段、端口、扫描带宽,然后将消息推送到kafka里面。 服务端程序: 从kafka消费者接收…...
Mybatis逆向工程,动态创建实体类、条件扩展类、Mapper接口、Mapper.xml映射文件
今天呢,博主的学习进度也是步入了Java Mybatis 框架,目前正在逐步杨帆旗航。 那么接下来就给大家出一期有关 Mybatis 逆向工程的教学,希望能对大家有所帮助,也特别欢迎大家指点不足之处,小生很乐意接受正确的建议&…...
Java-41 深入浅出 Spring - 声明式事务的支持 事务配置 XML模式 XML+注解模式
点一下关注吧!!!非常感谢!!持续更新!!! 🚀 AI篇持续更新中!(长期更新) 目前2025年06月05日更新到: AI炼丹日志-28 - Aud…...
C++ 基础特性深度解析
目录 引言 一、命名空间(namespace) C 中的命名空间 与 C 语言的对比 二、缺省参数 C 中的缺省参数 与 C 语言的对比 三、引用(reference) C 中的引用 与 C 语言的对比 四、inline(内联函数…...
算法岗面试经验分享-大模型篇
文章目录 A 基础语言模型A.1 TransformerA.2 Bert B 大语言模型结构B.1 GPTB.2 LLamaB.3 ChatGLMB.4 Qwen C 大语言模型微调C.1 Fine-tuningC.2 Adapter-tuningC.3 Prefix-tuningC.4 P-tuningC.5 LoRA A 基础语言模型 A.1 Transformer (1)资源 论文&a…...
AI病理诊断七剑下天山,医疗未来触手可及
一、病理诊断困局:刀尖上的医学艺术 1.1 金标准背后的隐痛 病理诊断被誉为"诊断的诊断",医生需通过显微镜观察组织切片,在细胞迷宫中捕捉癌变信号。某省病理质控报告显示,基层医院误诊率达12%-15%,专家会诊…...
小智AI+MCP
什么是小智AI和MCP 如果还不清楚的先看往期文章 手搓小智AI聊天机器人 MCP 深度解析:AI 的USB接口 如何使用小智MCP 1.刷支持mcp的小智固件 2.下载官方MCP的示例代码 Github:https://github.com/78/mcp-calculator 安这个步骤执行 其中MCP_ENDPOI…...
基于Uniapp的HarmonyOS 5.0体育应用开发攻略
一、技术架构设计 1.混合开发框架选型 (1)使用Uniapp 3.8版本支持ArkTS编译 (2)通过uni-harmony插件调用原生能力 (3)分层架构设计: graph TDA[UI层] -->|Vue语法| B(Uniapp框架)B --&g…...
五、jmeter脚本参数化
目录 1、脚本参数化 1.1 用户定义的变量 1.1.1 添加及引用方式 1.1.2 测试得出用户定义变量的特点 1.2 用户参数 1.2.1 概念 1.2.2 位置不同效果不同 1.2.3、用户参数的勾选框 - 每次迭代更新一次 总结用户定义的变量、用户参数 1.3 csv数据文件参数化 1、脚本参数化 …...
