提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
文章目录
前言
提示:这里可以添加本文要记录的大概内容:
在K8s平台上,我们可以使用kubectl命令对Deployment、pod、Service等资源进行增删改查。本文章将提供一些Java代码操作API方式实现与集群交互,来创建、更新、删除和查询资源。
一、准备工作
1、Maven依赖
<!--k8s集群依赖-->
<dependency>
<groupId>io.kubernetes</groupId>
<artifactId>client-java</artifactId>
<version>7.0.0</version>
</dependency>
<dependency>
<groupId>io.kubernetes</groupId>
<artifactId>client-java-api</artifactId>
<version>7.0.0</version>
</dependency>
2、配置文件
import io.kubernetes.client.openapi.ApiClient;
import io.kubernetes.client.util.ClientBuilder;
import io.kubernetes.client.util.credentials.AccessTokenAuthentication;
import java.io.IOException;
public class KubernetesConfig {
// 返回client,默认使用这个方法
public static ApiClient defaultClient() throws IOException {
/*
* 机器配置
* */
// IP:默认端口
String master = "https://192.168.0.200:6443";
// 会很长
String oauthToken = "eyJhbXXX...............XXXXXXXXXXXXXXXXX";
ApiClient apiClient = new ClientBuilder()
//设置 k8s 服务所在 ip地址
.setBasePath(master)
//是否开启 ssl 验证
.setVerifyingSsl(false)
//插入访问 连接用的 Token
.setAuthentication(new AccessTokenAuthentication(oauthToken))
.build();
io.kubernetes.client.openapi.Configuration.setDefaultApiClient(apiClient);
return apiClient;
}
}
2.1、tonken获取
可以借助dashboard用户token,获取同样的结果
# 创建用户
kubectl create serviceaccount dashboard-admin -n kube-system
# 用户授权
kubectl create clusterrolebinding dashboard-admin --clusterrole=cluster-admin --serviceaccount=kube-system:dashboard-admin
# # 获取用户Token
kubectl describe secrets -n kube-system $(kubectl -n kube-system get secret | awk '/dashboard-admin/{print $1}')
二、deployMent
1、创建deployment
import io.kubernetes.client.openapi.ApiClient;
import io.kubernetes.client.openapi.ApiException;
import io.kubernetes.client.openapi.Configuration;
import io.kubernetes.client.openapi.apis.AppsV1Api;
import io.kubernetes.client.openapi.models.*;
import io.kubernetes.client.util.Config;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
public class createNamespacedDeployment {
public static void createNamespacedDeployment() throws IOException {
// 连接交互
ApiClient client = Config.defaultClient();
Configuration.setDefaultApiClient(client);
AppsV1Api apiInstance = new AppsV1Api(client);
//命名空间
String namespace = "default";
String name = "depDemo";
// Service.Spec.Selector下的值
Map<String, String> selectLabels = new HashMap<>();
selectLabels.put("app", name);
// 构建deployment
V1Deployment body = new V1DeploymentBuilder()
.withMetadata(new V1ObjectMetaBuilder()
.withName(name) // 容器名称
.withNamespace(namespace) // 命名空间
.withLabels(selectLabels) // 标签参数
.build())
.withSpec(new V1DeploymentSpecBuilder()
.withReplicas(1) // 设置默认副本数
//设置选择器
.withSelector(new V1LabelSelectorBuilder()
.withMatchLabels(selectLabels)
.build())
.withTemplate(new V1PodTemplateSpecBuilder()
.withMetadata(new V1ObjectMetaBuilder()
.withLabels(selectLabels) //选择器
.build())
.withSpec(new V1PodSpecBuilder()
.withContainers(new V1ContainerBuilder()
.withName("redisDeployment") //设置docker名
.withImage("redis:latest") //docker镜像名
.withImagePullPolicy("IfNotPresent") // 镜像拉取策略
.build())
.build())
.build())
.build())
.build();
//定义返回结果
Map<String, String> messages = new HashMap<>();
try {
// 发送请求
V1Deployment result = apiInstance.createNamespacedDeployment(namespace, body, null, null, null);//调用createNamespacedDeployment方法创建容器部署
System.out.println(result);
} catch (ApiException e) {
if (e.getCode() == 409) {
messages.put("error", "工作负载创建已重复!");
} else if (e.getCode() == 200) {
messages.put("success", "工作负载创建成功!");
} else if (e.getCode() ==