2024年最全Kubernetes官方java客户端之八:fluent style,真香系列

分享

首先分享一份学习大纲,内容较多,涵盖了互联网行业所有的流行以及核心技术,以截图形式分享:

(亿级流量性能调优实战+一线大厂分布式实战+架构师筑基必备技能+设计思想开源框架解读+性能直线提升架构技术+高效存储让项目性能起飞+分布式扩展到微服务架构…实在是太多了)

其次分享一些技术知识,以截图形式分享一部分:

Tomcat架构解析:

算法训练+高分宝典:

Spring Cloud+Docker微服务实战:

最后分享一波面试资料:

切莫死记硬背,小心面试官直接让你出门右拐

1000道互联网Java面试题:

Java高级架构面试知识整理:

本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录

需要这份系统化的资料的朋友,可以点击这里获取

  1. 定义常量NAMESPACE作为本次实战的namespace:

private final static String NAMESPACE = “fluent”;

  1. 用@PostConstruct注解修饰setDefaultApiClient方法,令其在实例化时执行一次,里面做了一些全局性的初始化设置,注意kubeConfigPath变量对应的config文件路径要正确:

/**

  • 默认的全局设置

  • @return

  • @throws Exception

*/

@PostConstruct

private void setDefaultApiClient() throws Exception {

// 存放K8S的config文件的全路径

String kubeConfigPath = “/Users/zhaoqin/temp/202007/05/config”;

// 以config作为入参创建的client对象,可以访问到K8S的API Server

ApiClient client = ClientBuilder

.kubeconfig(KubeConfig.loadKubeConfig(new FileReader(kubeConfigPath)))

.build();

// 会打印和API Server之间请求响应的详细内容,生产环境慎用

client.setDebugging(true);

// 创建操作类

Configuration.setDefaultApiClient(client);

}

  1. 接下来是创建namespace的web服务,如下所示,由于namespace在kubernetes的apiVersion是v1,因此创建的是V1Namespace实例:

@RequestMapping(value = “/fluent/createnamespace”)

public V1Namespace createnamespace() throws Exception {

V1Namespace v1Namespace = new V1NamespaceBuilder()

.withNewMetadata()

.withName(NAMESPACE)

.addToLabels(“label1”, “aaa”)

.addToLabels(“label2”, “bbb”)

.endMetadata()

.build();

return new CoreV1Api().createNamespace(v1Namespace, null, null, null);

}

  1. 为了更清晰的展现fluent style效果,将上述代码与创建namespace的yaml文件内容放在一起对比,如下图所示,可见对照着yaml文件就能将代码写出来:

在这里插入图片描述

  1. 接下来是创建service的代码,为了便于和yaml对应起来,代码中特意加了缩进:

@RequestMapping(value = “/fluent/createservice”)

public V1Service createservice() throws Exception {

V1Service v1Service = new V1ServiceBuilder()

// meta设置

.withNewMetadata()

.withName(“nginx”)

.endMetadata()

// spec设置

.withNewSpec()

.withType(“NodePort”)

.addToPorts(new V1ServicePort().port(80).nodePort(30103))

.addToSelector(“name”, “nginx”)

.endSpec()

.build();

return new CoreV1Api().createNamespacedService(NAMESPACE, v1Service, null, null, null);

}

  1. 创建deployment的代码如下,因为内容较多所以相对复杂一些,请注意,由于deployment在kubernetes的apiVersion是extensions/v1beta1,因此创建的是ExtensionsV1beta1Deployment实例:

@RequestMapping(value = “/fluent/createdeployment”)

public ExtensionsV1beta1Deployment createdeployment() throws Exception {

ExtensionsV1beta1Deployment v1Deployment = new ExtensionsV1beta1DeploymentBuilder()

// meta设置

.withNewMetadata()

.withName(“nginx”)

.endMetadata()

// spec设置

.withNewSpec()

.withReplicas(1)

// spec的templat

.withNewTemplate()

// template的meta

.withNewMetadata()

.addToLabels(“name”, “nginx”)

.endMetadata()

// template的spec

.withNewSpec()

.addNewContainer()

.withName(“nginx”)

.withImage(“nginx:1.18.0”)

.addToPorts(new V1ContainerPort().containerPort(80))

.endContainer()

.endSpec()

.endTemplate()

.endSpec()

.build();

return new ExtensionsV1beta1Api().createNamespacedDeployment(NAMESPACE, v1Deployment, null, null, null);

}

  1. 从上述代码可见,withXXX和endXXX是成对出现的,请在编程的时候注意不要遗漏了endXXX,建议在写withXXX的同时就把endXXX写上;

  2. 最后一个方法是清理所有资源的,前面创建的deployment、service、namespace都在此一次性清理掉,实际操作中发现了一个尴尬的情况:删除deployment和namespace时,发送到API Server的删除请求都收到的操作成功的响应,但kubernetes客户端在反序列化响应内容时抛出异常(日志中显示了详细情况),鄙人能力有限暂未找到解决之道,因此只能用try catch来避免整个方法抛出异常,好在kubernetes实际上已经删除成功了,影响不大:

@RequestMapping(value = “/fluent/clear”)

public String clear() throws Exception {

// 删除deployment

try {

new ExtensionsV1beta1Api().deleteNamespacedDeployment(“nginx”, NAMESPACE, null, null, null, null, null, null);

} catch (Exception e)

{

log.error(“delete deployment error”, e);

}

CoreV1Api coreV1Api = new CoreV1Api();

// 删除service

coreV1Api.deleteNamespacedService(“nginx”, NAMESPACE, null, null, null, null, null, null);

// 删除namespace

try {

coreV1Api.deleteNamespace(NAMESPACE, null, null, null, null, null, null);

} catch (Exception e)

{

log.error(“delete namespace error”, e);

}

return "clear finish, " + new Date();

}

  1. 编码已完成,启动fluent工程,接下来开始验证功能是否正常;

验证

  1. 将fluent工程直接在IEDA环境启动;

  2. 浏览器访问:http://localhost:8080/fluent/createnamespace ,页面会展示API Server返回的完整namespace信息:

在这里插入图片描述

  1. 浏览器访问:http://localhost:8080/fluent/createservice ,页面会展示API Server返回的完整service信息:

在这里插入图片描述

  1. 浏览器访问:http://localhost:8080/fluent/createdeployment ,页面会展示API Server返回的完整deployment信息:

在这里插入图片描述

  1. 验证前面几个接口创建的服务是否可用,我这里kubernetes的IP地址是192.168.50.135,因此访问:http://192.168.50.135:30103 ,可以正常显示nginx首页:

在这里插入图片描述

  1. SSH登录kubernetes服务器查看,通过kubernetes的java客户端创建的资源都正常:

总结

谈到面试,其实说白了就是刷题刷题刷题,天天作死的刷。。。。。

为了准备这个“金三银四”的春招,狂刷一个月的题,狂补超多的漏洞知识,像这次美团面试问的算法、数据库、Redis、设计模式等这些题目都是我刷到过的

并且我也将自己刷的题全部整理成了PDF或者Word文档(含详细答案解析)

我的美团offer凉凉了?开发工程师(Java岗)三面结束等通知...

66个Java面试知识点

架构专题(MySQL,Java,Redis,线程,并发,设计模式,Nginx,Linux,框架,微服务等)+大厂面试题详解(百度,阿里,腾讯,华为,迅雷,网易,中兴,北京中软等)

我的美团offer凉凉了?开发工程师(Java岗)三面结束等通知...

算法刷题(PDF)

我的美团offer凉凉了?开发工程师(Java岗)三面结束等通知...

本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录

需要这份系统化的资料的朋友,可以点击这里获取

a,Redis,线程,并发,设计模式,Nginx,Linux,框架,微服务等)+大厂面试题详解(百度,阿里,腾讯,华为,迅雷,网易,中兴,北京中软等)**

[外链图片转存中…(img-5SvScsJU-1715086335446)]

算法刷题(PDF)

[外链图片转存中…(img-gizamoXi-1715086335446)]

本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录

需要这份系统化的资料的朋友,可以点击这里获取

  • 20
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值