Java api 操作 kubernetes
生活随笔
收集整理的這篇文章主要介紹了
Java api 操作 kubernetes
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
文章目錄
- Java api 操作 kubernetes
- 一、api接口訪問方式
- 授權方式
- 不授權方式
- 二、Java api 操作 k8s
- k8s初始化
- 創建命名空間
- 創建Deployment應用
- 創建Service服務
Java api 操作 kubernetes
一、api接口訪問方式
授權方式
調用k8s使用rest api形式一個是安全的地址https:127.0.0.1:6443,這個地址需要有認證權限的,可以是token方式或者是證書,這個也是我一開始使用的方式,無奈沒有辦法知道token什么時候過期,但是目前實驗只要K8s正常啟動一直沒有換token也還是可以使用
查看kubernetes的token
不授權方式
第二個方式是不安全的地址http😕/127.0.0.1:8008,就是說可以不用認證權限就可以直接訪問K8s了,因為真的不知道token什么時候過期,2是k8s不穩定老是重裝我就得需要換token
輸入如下命令:
vim /etc/kubernetes/manifests/kube-apiserver.yaml在下圖的地方添加以下,寫好以后保存退出,他就會重啟稍微等一下我們就可以訪問一下地址
- --enable-swagger-ui=true - --insecure-bind-address=0.0.0.0 - --insecure-port=8008我們就可以訪問了
二、Java api 操作 k8s
<dependency><groupId>io.kubernetes</groupId><artifactId>client-java</artifactId><version>12.0.0</version><scope>compile</scope></dependency>k8s初始化
private static ApiClient getApiClient(){String master = "https://127.0.0.1:6443";String oauthToken = "eyJhbGciOiJSUzI1NiIsImtpZCI6InNRRi1VVFpmUE9nQ3VNc25kcVFXV29nVGZWN0hJX1N5WndHX1p4STc2a3cifQ.eyJpc3MiOiJrdWJlcm5ldGVzL3NlcnZpY2VhY2NvdW50Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9uYW1lc3BhY2UiOiJrdWJlLXN5c3RlbSIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VjcmV0Lm5hbWUiOiJrOHMtdG9rZW4tN3pmajIiLCJrdWJlcm5ldGVzLmlvL3NlcnZpY2VhY2NvdW50L3NlcnZpYdC5uYW1lIjoiazhzIiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9zZXJ2aWNlLWFjY291bnQudWlkIjoiNWVlZjQ0MDQtYWY5OS00NDE4LTk2YTctZWFmYzlkNDJhNmYxIiwic3ViIjoic3lzdGVtOnNlcnZpY2VhY2NvdW50Omt1YmUtc3lzdGVtOms4cyJ9.npRtUn7_AM0yPmdHdwN76CKlNOkc8sWJcOuhCKHT-o58oRvg5_kDfCIZyfhV0UjepkLhq1xzP_mHbbUu8_u5SnTbpFhqslOoKywXsI17oDOIQk44nXyRkrGzsM4xNKN9kov4fzSpQqhHNGfXIMA1D0WGD2nZzh2CMklVhVzbWDDnLGgzhzBr9WNDuyBVXlJc40Tz_B0aTurxZ1yZ2P34VSK_vXW8mWWZxfCSRSf6L2vyHfKwhA4ogoqopHANwOpE0O1Fz8q50kclcyxc9a-GD3nPzYISLnGbDAsuKD4qEAi6QhnXVDdUEf9XYvzTvkBeTvL8g4YSGZrQ";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;}創建命名空間
@RequestMapping("/create/namespace")public Map<String, String> testNamespace(@RequestBody V1Namespace namespace){Map<String, String> message = new HashMap<>();//初始化k8sApiClient apiClient = getApiClient();CoreV1Api coreV1Api = new CoreV1Api(apiClient);try {V1Namespace result = coreV1Api.createNamespace(namespace, null, null, null);message.put("success", "應用命名空間創建成功!");} catch (ApiException e) {if (e.getCode() == 409) {message.put("error", "命名空間已重復!");}if (e.getCode() == 200) {message.put("success", "應用命名空間創建成功!");}if (e.getCode() == 201) {message.put("error", "命名空間已重復!");}if (e.getCode() == 401) {message.put("error", "無權限操作!");}message.put("error", "應用命名空間創建失敗!");}return message;}創建命名空間的參數值
{"apiVersion":"v1","kind":"Namespace","metadata":{"name":"test-namespace","labels":{"name":"test-namespace"}} }創建Deployment應用
@Data @AllArgsConstructor @NoArgsConstructor public class DeploymentDTO {private String metadata_name;private String metadata_namespace;private String labels_workLayer;private Integer spec_replicas;private String containers_name;private String containers_image;private String containers_imagePullPolicy;private String remark; } @PostMapping("/create/deployments")public Map<String, String> createDeployments(@RequestBody DeploymentDTO deploymentDTO){Map<String, String> messages = new HashMap<>();// 賦值操作V1Deployment deployment = new V1Deployment();deployment.setApiVersion("apps/v1");deployment.kind("Deployment");// 賦值metadataV1ObjectMeta objectMeta = new V1ObjectMeta();objectMeta.name(deploymentDTO.getMetadata_name());objectMeta.namespace(deploymentDTO.getMetadata_namespace());Map<String, String> labels = new HashMap<>();labels.put("app","nginx");objectMeta.labels(labels);// 賦值specV1DeploymentSpec deploymentSpec = new V1DeploymentSpec();//賦值spec-selectorV1LabelSelector selector = new V1LabelSelector();Map<String, String> matchLabels = new HashMap<>();matchLabels.put("app","nginx");selector.matchLabels(matchLabels);//賦值templateV1PodTemplateSpec templateSpec = new V1PodTemplateSpec();V1ObjectMeta metadata = new V1ObjectMeta();metadata.labels(labels);templateSpec.metadata(metadata);// spec-Template下的SpecV1PodSpec podSpec = new V1PodSpec();// spec-Template-spec-containerList<V1Container> listContainer = new ArrayList<>();V1Container container = new V1Container();container.setName(deploymentDTO.getContainers_name());container.setImage(deploymentDTO.getContainers_image());container.setImagePullPolicy(deploymentDTO.getContainers_imagePullPolicy());// spec-Template-spec-container-portsList<V1ContainerPort> ports = new ArrayList<>();V1ContainerPort v1ContainerPort = new V1ContainerPort();v1ContainerPort.setContainerPort(88);container.setPorts(ports);listContainer.add(container);podSpec.setContainers(listContainer);templateSpec.setSpec(podSpec);deploymentSpec.setReplicas(deploymentDTO.getSpec_replicas());deploymentSpec.setTemplate(templateSpec);deploymentSpec.setSelector(selector);deployment.setMetadata(objectMeta);deployment.setSpec(deploymentSpec);ApiClient client = getApiClient();AppsV1Api apiInstance = new AppsV1Api(client);try {V1Deployment result = apiInstance.createNamespacedDeployment(objectMeta.getNamespace(), deployment, null, null, null);messages.put("success", "工作負載創建成功!");} catch (ApiException e) {if (e.getCode() == 409) {messages.put("error", "工作負載創建已重復!");} else if (e.getCode() == 200) {messages.put("success", "工作負載創建成功!");} else if (e.getCode() == 201) {messages.put("error", "工作負載創建已重復!");} else if (e.getCode() == 401) {messages.put("error", "無權限操作!");} else {messages.put("error", "工作負載創建失敗!");}}return messages;}創建Deployment的參數值
{"metadata_name":"nginx-deployment","metadata_namespace":"test-hl2","labels_workLayer":"svc","spec_replicas":3,"containers_name":"ngninx-test","containers_image":"nginx:latest","containers_imagePullPolicy":"IfNotPresent","remark":"測試項目" }創建Service服務
@Data @AllArgsConstructor @NoArgsConstructor public class ServiceDTO {private String metadata_name;private String metadata_namespace;private String labels_workLayer;private String spec_type;private Integer spec_ports_port;private Integer spec_ports_targetPort;private String spec_ports_protocol; } @PostMapping("/create/service")public Map<String, String> createService(@RequestBody ServiceDTO serviceDTO) {Map<String, String> message = new HashMap<>();ApiClient client = getApiClient();CoreV1Api apiInstance = new CoreV1Api(client);//賦值V1Service body = new V1Service();body.setApiVersion("v1");body.setKind("Service");V1ObjectMeta objectMeta = new V1ObjectMeta();objectMeta.setName(serviceDTO.getMetadata_name());objectMeta.setNamespace(serviceDTO.getMetadata_namespace());//賦值specV1ServiceSpec serviceSpec = new V1ServiceSpec();//spec-typeserviceSpec.setType(serviceDTO.getSpec_type());//spec-portsList<V1ServicePort> servicePorts = new ArrayList<>();V1ServicePort servicePort = new V1ServicePort();servicePort.setPort(serviceDTO.getSpec_ports_port());servicePort.setProtocol(serviceDTO.getSpec_ports_protocol());servicePort.setTargetPort(new IntOrString(serviceDTO.getSpec_ports_targetPort()));servicePorts.add(servicePort);serviceSpec.ports(servicePorts);// spec-selectorMap<String, String> selector = new HashMap<>();selector.put("app","nginx");serviceSpec.setSelector(selector);body.setMetadata(objectMeta);body.setSpec(serviceSpec);try {V1Service result = apiInstance.createNamespacedService(serviceDTO.getMetadata_namespace(), body, null, null, null);message.put("success", "工作負載服務創建成功!");} catch (ApiException e) {if (e.getCode() == 409) {message.put("error", "工作負載服務創建已重復!");} else if (e.getCode() == 200) {message.put("success", "工作負載服務創建成功!");} else if (e.getCode() == 201) {message.put("error", "工作負載服務創建已重復!");} else if (e.getCode() == 401) {message.put("error", "無權限操作!");} else if (e.getCode() == 400) {message.put("error", "后臺參數錯誤!");} else if (e.getCode() == 400) {message.put("error", "沒有命名空間或沒有Deployment!");} else {message.put("error", "工作負載服務創建失敗!");}}return message;} }總結
以上是生活随笔為你收集整理的Java api 操作 kubernetes的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 《工程学导论》读后感
- 下一篇: FFMPEG视频编码 NVIDIA 和