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

这篇具有很好参考价值的文章主要介绍了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项目主要代码如下

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

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

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 可以看到只有一个容器在运行

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

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

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

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

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

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

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

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

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 成功

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

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

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

step5 测试边车注入效果

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

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

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

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

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

k8s webhook实例,java springboot程序实现 对Pod创建请求添加边车容器 ,模拟istio实现日志文件清理,docker+k8s,java,kubernetes,spring boot,docker文章来源地址https://www.toymoban.com/news/detail-614002.html

到了这里,关于k8s webhook实例,java springboot程序实现 对Pod创建请求添加边车容器 ,模拟istio实现日志文件清理的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • K8S篇之实现利用Prometheus监控pod的实时数据指标

    一、监控部署 1、将k8s集群中kube-state-metrics指标进行收集,服务进行部署 1.1 pod性能指标(k8s集群组件自动集成) k8s组件本身提供组件自身运行的监控指标以及容器相关的监控指标。通过cAdvisor 是一个开源的分析容器资源使用率和性能特性的代理工具,集成到 Kubelet中,当Ku

    2024年02月05日
    浏览(58)
  • Java操作k8s api示例:使用kubeconfig文件认证;获取所有pod;获取pod内应用容器的启动日志

    公司准备将应用容器化部署,先使用了华为云的 Kubernetes 服务,后面又使用阿里云的 Kubernetes 服务。并短期一个月内无法判断走哪个云商。而作为一个在公司内部用于应用发布,部署的应用。在对接完华为云的 Kubernetes 服务 Api 后。再对接阿里云发现阿里云并没用像华为云一

    2023年04月09日
    浏览(58)
  • 基于grpc-java开发的普通工程在k8s内部署多实例,如何实现客户端流量的负载均衡

    本文主要讨论通过grpc-java开发的普通的java grpc工程,以多实例的方式部署在容器编排平台kubernetes(以下简称k8s)上,如何能够实现让同样部署在k8s 集群内的客户端请求流量均衡的分发到多个grpc应用部署实例上去。 grpc服务端程序在k8s内部署的多个实例通过headless service暴露服

    2024年01月17日
    浏览(51)
  • 第15关 K8s HPA:自动水平伸缩Pod,实现弹性扩展和资源优化

    ------ 课程视频同步分享在今日头条和B站 大家好,我是博哥爱运维,这节课带来k8s的HPA 自动水平伸缩pod( 视频后面有彩蛋 : ) )。 我们知道,初始Pod的数量是可以设置的,同时业务也分流量高峰和低峰,那么怎么即能不过多的占用K8s的资源,又能在服务高峰时自动扩容pod的

    2024年02月05日
    浏览(50)
  • K8s:开源安全平台 kubescape 实现 Pod 的安全合规检查/镜像漏洞扫描

    生产环境中的 k8s 集群安全不可忽略,即使是内网环境 容器化的应用部署虽然本质上没有变化,始终是机器上的一个进程 但是提高了安全问题的处理的复杂性 分享一个开源的 k8s 集群安全合规检查/漏洞扫描 工具 kubescape 博文内容涉及: kubescape 简介介绍 kubescape 命令行工具安

    2024年02月15日
    浏览(42)
  • k8s、pod

    k8s中的port【端口:30000-32767】 port :为Service 在 cluster IP 上暴露的端口 targetPort:对应容器映射在 pod 端口上 nodePort:可以通过k8s 集群外部使用 node IP + node port 访问Service containerPort:容器内部使用的端口 k8s 集群内部流程: 客户端→clusterIP:port→通过 tagerport→pod IP:container

    2024年02月06日
    浏览(34)
  • 【Java】基于fabric8io库操作k8s集群实战(pod、deployment、service、volume)

    一开始了解到Java Api库操作k8s集群,有两个,分别为: kubernetes-client/java fabric8io/kubernetes-client 但个人对比使用了两个发现,还是 fabric8io更易用 ,用的人多是有道理的, fabric8io和yaml文件十分贴切 ,所以 通俗易懂 。本文前提是已配置好集群,已经熟悉了kubectl工具常用命令。

    2024年02月02日
    浏览(48)
  • k8s关于pod

      目录 1、POD 的创建流程 kubectl 发起创建 Pod 请求: API Server 接收请求并处理: 写入 Etcd 数据库: Kubelet 监听并创建 Pod: Pod 状态更新和汇报: 2、POD 的状态解析 1. Pending Pod 2. Running Pod 3. Succeeded Pod 4. Failed Pod 5. Unknown 6. CrashLoopBackOff 7. ImagePullBackOff Pod 8. Terminating 9. Evicted 10.

    2024年03月18日
    浏览(49)
  • K8s Pod详解

    每个Pod中都可以包含一个或者多个容器,这些容器可以分为两类: 用户程序所在的容器,数量可多可少 Pause容器,这是每个Pod都会有的一个 根容器 ,它的作用有两个: 可以以它为依据,评估整个Pod的健康状态 可以在根容器上设置Ip地址,其它容器都此Ip(Pod IP),以实现

    2024年02月01日
    浏览(40)
  • 【 K8S 】 Pod 进阶

    当定义 Pod 时可以选择性地为每个容器设定所需要的资源数量。 最常见的可设定资源是 CPU 和内存大小,以及其他类型的资源。 当为 Pod 中的容器指定了 request 资源时,代表容器运行所需的最小资源量,调度器就使用该信息来决定将 Pod 调度到哪个节点上。当还为容器指定了

    2024年02月13日
    浏览(32)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包