k8s webhook实例,java springboot程序实现 对Pod创建请求添加边车容器 ,模拟istio实现日志文件清理

k8s webhook实例,java springboot程序实现 对Pod创建请求添加边车容器 ,模拟istio实现日志文件清理

大纲

  • 背景与原理
  • 实现流程
  • 开发部署my-docker-demo-sp-user服务模拟业务项目
  • 开发部署my-sidecar服务模拟边车程序
  • 开发部署服务my-docker-demo-k8s-operator 提供webhook功能
  • 创建MutatingWebhookConfiguration 动态准入配置
  • 测试边车注入效果

背景与原理

背景:

程序容器运行期间会大量产生日志文件,久而久之会消耗大量的硬盘空间(除非程序重新部署)
如果手动的去删除比较麻烦,如果把程序文件夹挂载到主机需要手动去配置磁盘卷挂载比较麻烦

原理:

由于业务程序镜像统一把日志写入到/data/service/logs, 所以在开发一个程序专门定时清理/data/service/logs文件夹下的文件,利用k8s webhook 把这个定时程序作为边车挂载到业务程序中
利用边车的方式还可以实现很多对业务增强的功能

涉及项目

  • my-docker-demo-sp-user 模拟业务项目
  • my-sidecar 模拟边车程序
  • my-docker-demo-k8s-operator 模拟webhook

实现流程

step1 开发部署my-docker-demo-sp-user服务模拟业务项目

my-docker-demo-sp-user是一个springboot项目主要代码如下

在这里插入图片描述

调用一个接口可以创建随机文件,模拟生成大量日志文件

my-docker-demo-sp-user 部署文件 deploy.yaml 如下

apiVersion: v1
kind: Namespace  #类型 指定为Namespace
metadata:
  name: my-sidecar-webhook  #namespace的名称 注意只能是英文小写和数字 
  labels: 
    my-sidecar-inject: enabled #注意: 命名空间需要带有namespaceSelector中匹配的标签
---

apiVersion: v1
kind: Pod
metadata: 
   name: user-service-pod
   namespace: my-sidecar-webhook
spec: 
   # 容器配置       
   containers: 
      - image: registry.cn-hangzhou.aliyuncs.com/jimliu/user-service:v5
        imagePullPolicy: IfNotPresent  #Always
        name: user-service
        ports: 
          - containerPort:  5588
            name: http
            protocol: TCP

可以看到这是一个极简的部署文件,创建一个命名空间和一个Pod, Pod只有一个容器user-service,执行部署文件deploy.yaml 可以看到只有一个容器在运行

在这里插入图片描述

测试发现功能正常并且Pod中只有一个容器

step2 开发部署my-sidecar服务模拟边车程序

my-sidecar (代码写在my-docker-demo-k8s-operator中打包的时候改了下jar包的名字)是一个springboot项目主要代码如下

在这里插入图片描述

有一个接口可以查看/data/service/logs文件夹下所有文件和一个接口和删除文件的接口
后续改造可以将删除功能做成定时任务执行

将my-sidecar服务打包制作成镜像推送到私库待用

在这里插入图片描述

step3 开发部署服务my-docker-demo-k8s-operator 提供webhook功能

本次实验webhook使用部署在k8s集群外部的方式 webhook可以参考(k8s Webhook 使用java springboot实现webhook 学习总结

   @RequestMapping("/mutate/v3")
	public String mutateV2(HttpServletRequest req ,HttpServletResponse rep) throws Exception {
		System.out.println("use mutate java k8s client lib [io.fabric8] @@@");
		InputStream in = req.getInputStream();
		/**
		 * io.fabric8库 内置AdmissionReview对象
		 * 使用 Serialization.unmarshal把输入流直接转化为对象
		 */
		AdmissionReview admissionReview = Serialization.unmarshal(in, AdmissionReview.class);
		System.out.println(Serialization.asJson(admissionReview));
		
		/**
		 * 需要给原始的Pod 添加一个边车容器用于管理原始容器中生成的文件
		 * Pod配置文件修改
		 * 1 添加一个空临时存储卷
		 * 2 添加一个边车容器并挂载存储卷
		 * 3 修改原始容器添加挂载存储卷
		 * 
		 */
		//1 准备一个空临时存储卷对象
		//Volume与EmptyDirVolumeSource对象是 io.fabric8库 内置对象
		Volume v = new Volume();
		v.setName("data");
		EmptyDirVolumeSource emptyDir = new EmptyDirVolumeSource();
		v.setEmptyDir(emptyDir);
		
		//2 准备一个边车容器并挂载存储卷对象
		//Container对象是 io.fabric8库 内置对象
		Container sidecar = new Container();
		sidecar.setImage("registry.cn-hangzhou.aliyuncs.com/jimliu/sidecar:v1"); //边车程序镜像
		sidecar.setImagePullPolicy("IfNotPresent");
		sidecar.setName("sidecar");
		
		ContainerPort cp = new ContainerPort();
		cp.setContainerPort(5533);
		cp.setName("http");
		cp.setProtocol("TCP");
		sidecar.setPorts(Arrays.asList(cp));
		//VolumeMount对象是 io.fabric8库 内置对象
		VolumeMount vm = new VolumeMount();
		vm.setMountPath("/data/service/logs"); //将容器内部的/data/service/logs 与 data 卷挂载
		vm.setName("data");
		sidecar.setVolumeMounts(Arrays.asList(vm));
		
		//3 修改原始容器添加挂载存储卷
		//Pod对象是 io.fabric8库 内置对象
		Pod pod = (Pod) admissionReview.getRequest().getObject();
		List<Container> containers =  pod.getSpec().getContainers();
		for(Container container : containers) {
			VolumeMount vmt = new VolumeMount();
			vmt.setMountPath("/data/service/logs");
			vmt.setName("data");
			container.getVolumeMounts().add(vmt);
		}
		//将边车容器加入
		containers.add(sidecar);
		/**
		 * 开始制作jsonpatch
		 * 对Pod的修改需要利用jsonpatch 提供的add 和 replace
		 * JsonPatchBean为自定义的一个对象
		 */
		List<JsonPatchBean> patchs = new ArrayList<>();
		//添加卷
		patchs.add(new JsonPatchBean("add","/spec/volumes",Arrays.asList(v)));
		//替换容器加入边车容器
		patchs.add(new JsonPatchBean("replace","/spec/containers",containers));
		
		/**
		 * patchs转换为字符串
		 * 需要把字符串转换为base64编码
		 */
		String patchStr = JSON.toJSONString(patchs);
		System.out.println(patchStr);
		Base64 base64= new Base64();  
		String patch = new String(base64.encode(patchStr.getBytes()));
		/**
		 * uid,从发送到 Webhook 的 request.uid 中复制而来
		 */
		String uid = admissionReview.getRequest().getUid();
		/**
		 * io.fabric8库 内置AdmissionResponse对象
		 */
		AdmissionResponse response = new AdmissionResponse();
		response.setAllowed(true);
		response.setUid(uid);
		response.setPatch(patch);
		response.setPatchType("JSONPatch");
		/**
		 * 填充Response
		 */
		admissionReview.setResponse(response);
		return Serialization.asJson(admissionReview);
	}
	
	/**
	 * 封装一个JsonPatch 操作对象
	 * @author liuyijiang
	 */
	public static class JsonPatchBean {
		private String op;
		private String path;
		private Object value;
		
		public JsonPatchBean(String op,String path,Object value) {
		   this.op = op;
		   this.path = path;
		   this.value = value;
		}
		
		... get set 省略
		
	}

这里 my-docker-demo-k8s-operator 项目需要使用https方式访问

如何配置证书与域名可参考 k8s Webhook 使用java springboot实现webhook 学习总结

这里默认相关的证书配置,k8s master节点的域名映射都完成,本地eclipse启动my-docker-demo-k8s-operator 成功

在这里插入图片描述

step4 创建MutatingWebhookConfiguration 动态准入配置

MutatingWebhookConfiguration 内容如下

apiVersion: admissionregistration.k8s.io/v1
kind: MutatingWebhookConfiguration
metadata: 
  name: my-test-webhook1 #创建MutatingWebhookConfiguration 的名称
webhooks:
- admissionReviewVersions:  #指定可接受的 AdmissionReview 对象版本 这里支持v1beta1 v1
  - v1beta1
  - v1
  clientConfig:
    # CA根证书内容
    caBundle: LS0tLS1CRUdJTiBDR...略
    # 只支持https请求
    url: "https://webhooktest.liuyijiang.com/mutate/v3"  #webhook web服务访问的地址
  failurePolicy: Fail
  matchPolicy: Exact #精确匹配
  name: webhooktest.liuyijiang.com #名称随意但是必须是域名格式
  namespaceSelector:
    matchLabels:
      my-sidecar-inject: enabled  #必须匹配标签为my-sidecar-inject=enabled的命名空间内的资源才会被拦截
  rules:
  - apiGroups:
    - ""
    apiVersions: #匹配的版本
    - v1
    operations:  #拦截CREATE操作
    - CREATE
    resources:  #拦截执行类型是pod
    - pods
    scope: '*'  #所有命名空间
  sideEffects: None  #配置是否有副作用,None表示调用 Webhook 没有副作用
  timeoutSeconds: 30 #请求超时时间

caBundle根证书内容生成 可参考 k8s Webhook 使用java springboot实现webhook 学习总结

部署MutatingWebhookConfiguration

在这里插入图片描述

step5 测试边车注入效果

再次部署my-docker-demo-sp-user项目 此时 我本机上已接收到k8s webhook请求

在这里插入图片描述

查看部署后的Pod 发现出现两个容器,边车容器与业务容器实现了共享存储空间,并可以清除日志文件,后续只需改造为定时任务即可

在这里插入图片描述

kubectl -n my-sidecar-webhook get pods -o json

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/53533.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Django快速上手

Django简介 Django 框架最初的诞生&#xff0c;主要是用来开发和管理 Lawrence Publishing Group&#xff08;劳伦斯出版集团&#xff09;旗下新闻网站的一款软件&#xff0c;是一款属于 CMS&#xff08;Content Management System&#xff0c;内容管理系统&#xff09;类的软…

面试典中典之线程池的七大参数

文章目录 一、七大元素解释1.corePoolSize&#xff08;核心线程数&#xff09;&#xff1a;2.maximumPoolSize&#xff08;最大线程数&#xff09;&#xff1a;3.keepAliveTime&#xff08;线程空闲时间&#xff09;&#xff1a;4.unit&#xff08;时间单位&#xff09;&#x…

Python 进阶(六):文件读写(I/O)

❤️ 博客主页&#xff1a;水滴技术 &#x1f338; 订阅专栏&#xff1a;Python 入门核心技术 &#x1f680; 支持水滴&#xff1a;点赞&#x1f44d; 收藏⭐ 留言&#x1f4ac; 文章目录 1. 打开文件2. 读取文件2.1 逐行读取文件2.2 读取所有行 3. 写入文件3.1 向文件中写入…

开放麒麟1.0发布一个月后,到底怎么样?另一款操作系统引发热议

具有里程碑意义 7月5日&#xff0c;国产首个开源桌面操作系统“开放麒麟1.0”正式发布。 标志着我国拥有了操作系统组件自主选型、操作系统独立构建的能力&#xff0c;填补了我国在这一领域的空白。 举国欢庆&#xff0c;算的上是里程碑意义了&#xff01; 发布后用着如何&a…

回归预测 | MATLAB实现WOA-ELM鲸鱼算法优化极限学习机多输入单输出回归预测

回归预测 | MATLAB实现WOA-ELM鲸鱼算法优化极限学习机多输入单输出回归预测 目录 回归预测 | MATLAB实现WOA-ELM鲸鱼算法优化极限学习机多输入单输出回归预测效果一览基本介绍程序设计参考资料 效果一览 基本介绍 Matlab实现WOA-ELM鲸鱼算法优化极限学习机多输入回归预测&#…

2.获取DOM元素

获取DOM元素就是利用JS选择页面中的标签元素 2.1 根据CSS选择器来获取DOM元素(重点) 2.1.1选择匹配的第一个元素 语法: document.querySelector( css选择器 )参数: 包含一个或多个有效的CSS选择器 字符串 返回值: CSS选择器匹配的第一个元素&#xff0c;一个HTMLElement对象…

分享一个赛车动画

先看效果&#xff08;动画太大了放不上来&#xff0c;甘心去复制代码运行即可&#xff09;&#xff1a; 再看代码&#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>赛车</title><…

一些网络知识总结(自用)

一些网络知识总结&#xff08;自用&#xff09; 1. 进制的转换 所有进制转换成十进制就是把字面值*权数 比如16进制 5AEF 转成10机制话就是 1* 151614321064 * 5 2. ip地址网段的概念&#xff0c;可用ip&#xff0c;广播地址 比如一个ip为10.1.1.1/24那么他的网络号就是前…

vue表单筛选

目录 筛选 HTML scss* filterComp 排序 表格 自定义数据样式 inner-table 分页 删除 default-modal 自定义元素的插槽-占位符 .search-wrap {height: 60px;display: flex;align-items: center;overflow: hidden;padding: 0 20px;.selected-options-wrap {flex: 1;.…

绝对定位的遮挡

<ul class"slide-nav leftfix"><li><!-- 一级菜单 --><a href"#">手机/运营商/数码</a><!-- 二级菜单 --><div class"second-menu"></div></li><li><a href"#">电…

TCP三次握手和四次挥手以及11种状态(二)

11种状态 1、一开始&#xff0c;建立连接之前服务器和客户端的状态都为CLOSED&#xff1b; 2、服务器创建socket后开始监听&#xff0c;变为LISTEN状态&#xff1b; 3、客户端请求建立连接&#xff0c;向服务器发送SYN报文&#xff0c;客户端的状态变味SYN_SENT&#xff1b; 4、…

操作系统_进程与线程(四)

目录 4. 死锁 4.1 死锁的概念 4.1.1 死锁的定义 4.1.2 死锁产生的原因 4.1.3 死锁的处理策略 4.2 死锁预防 4.3 死锁避免 4.3.1 系统安全状态 4.3.2 银行家算法 4.3.2.1 数据结构描述 4.3.2.2 银行家算法描述 4.3.2.3 安全性算法 4.3.3 安全性算法举例 4.3.4 银行…

【网络】应用层——HTTP协议

&#x1f431;作者&#xff1a;一只大喵咪1201 &#x1f431;专栏&#xff1a;《网络》 &#x1f525;格言&#xff1a;你只管努力&#xff0c;剩下的交给时间&#xff01; &#x1f3c0;认识HTTP协议 上篇文章中&#xff0c;本喵带着大家对HTTP有了一个初步的认识&#xff0…

大家做性能测试都用什么工具

在进行测试时&#xff0c;选择适合的测试工具至关重要&#xff0c;因为优秀的测试工具能够显著提高工作效率。对于性能测试和自动化测试而言&#xff0c;大多数人会选择传统的JMeter等工具&#xff0c;然而这些工具存在学习成本高、使用门槛高的问题。 因此&#xff0c;我在这…

Mr. Cappuccino的第52杯咖啡——Mybatis环境搭建与使用

Mybatis环境搭建与使用 Mybatis介绍Mybatis环境搭建与使用基于XML方式-原生方式开发创建数据库表项目准备项目结构项目代码实体类中添加有参构造方法产生的问题 基于XML方式-mapper代理开发项目准备项目结构项目代码SQL映射文件中namespace未设置为接口全限定名产生的问题 基于…

IO进程线程day3(2023.7.31)

一、Xmind整理&#xff1a; 文件描述符概念&#xff1a; 二、课上练习&#xff1a; 练习1&#xff1a;用fread和fwrite实现文件拷贝 #include <stdio.h> #include <string.h> #include <stdlib.h> #include <head.h> int main(int argc, const char…

Chapter 9: Lists | Python for Everybody 讲义笔记_En

文章目录 Python for Everybody课程简介ListsA list is a sequenceLists are mutableTraversing a listList operationsList slicesList methodsDeleting elementsLists and functionsLists and stringsParsing linesObjects and valuesAliasingList argumentsDebuggingGlossar…

Windows10系统还原操作

哈喽&#xff0c;大家好&#xff0c;我是雷工&#xff01; 复制了下虚拟机的Win10系统&#xff0c;但其中有一些软件&#xff0c;想实现类似手机的格式化出厂操作&#xff0c;下面记录Windows10系统的还原操作。 一、系统环境&#xff1a; 虚拟机内的Windows10&#xff0c;64…

R730服务器用光盘安装系统(Esxi系统)

准备阶段&#xff1a;dell R730服务器&#xff0c;本教程一般适用于dell所有服务器&#xff0c;移动光盘&#xff0c;光碟做好镜像系统。在这里我安装的系统是Esxi系统&#xff0c;其他操作系统类似&#xff0c;只是安装的步骤不一样而已。 1、将系统盘插入光驱(移动光盘)&…

测试|自动化测试(了解)

测试|自动化测试&#xff08;了解&#xff09; 1.什么是自动化测试☆☆☆☆ 自动化测试相当于把人工测试手段进行转换&#xff0c;让代码执行。 2.自动化测试的分类☆☆☆☆ 注&#xff1a;这里只是常见的自动化测试&#xff0c;并不全部罗列。 1.单元自动化测试 其中Java…