我做的需求是界面设置了时间和副本数量,后台定时判断时间范围,在时间范围内设置最大副本数量,超过时间就设置最小副本量,但是一个问题就是定时以后就会频繁的去一直更改副本,后来想是不是需要获取k8s副本数量对比,一样的时候不更新副本,不一样的时候在更新。然后接下来就把读取副本也就是获取部署信息的接口和更新副本的Api给大家列在这里。
对了不同版本调用的接口有的是不一样的,我就入坑了,现场开发是1.14,本地是1.16,然后就发现调接口一直报404,后来想到应该是版本问题,还好都解决了。那接下来就讲两个版本的调用,再插一句,我maven用的k8s之前是5.0.0发现用不了更新副本的接口,后来改成了6.0.1就可以了。
1 1.14读取部署信息的代码
public ExtensionsV1beta1Deployment readNamespacedDeployment14(String namespace, String name) {
ExtensionsV1beta1Api apiInstance = new ExtensionsV1beta1Api(k8sInit.getConnection());
ExtensionsV1beta1Deployment result = null;
try {
result = apiInstance.readNamespacedDeployment(name, namespace, null, null, null);
} catch (ApiException e) {
System.err.println("Exception when calling ExtensionsV1beta1Api#readNamespacedDeployment");
System.err.println("Status code: " + e.getCode());
System.err.println("Reason: " + e.getResponseBody());
System.err.println("Response headers: " + e.getResponseHeaders());
e.printStackTrace();
}
return result;
}
2 1.16读取部署信息的代码
/**
* 获取指定部署信息
* k8s 1.16 版本获取
*
* @param namespace
* @param name
* @return
*/
@Override
public V1Deployment readNamespacedDeployment16(String namespace, String name) {
AppsV1Api apiInstance = new AppsV1Api(k8sInit.getConnection());
try {
V1Deployment result = apiInstance.readNamespacedDeployment(name, namespace, null, null, null);
return result;
} catch (ApiException e) {
System.err.println("Exception when calling AppsV1Api#readNamespacedDeployment");
System.err.println("Status code: " + e.getCode());
System.err.println("Reason: " + e.getResponseBody());
System.err.println("Response headers: " + e.getResponseHeaders());
e.printStackTrace();
}
return null;
}
就会返回当前的deployments部署信息
3 更新副本1.14版本代码
/**
* 更新Deployment副本,k8s是1.14版本
*/
public boolean patchNamespacedDeployment14(String namespace, String name, int replicas) {
ExtensionsV1beta1Api apiInstance = new ExtensionsV1beta1Api(k8sInit.getConnection());
String jsonPatchStr = "[{\"op\":\"replace\",\"path\":\"/spec/replicas\", \"value\": " + replicas + " }]";
V1Patch body = new V1Patch(jsonPatchStr);
try {
ExtensionsV1beta1Deployment result1 = apiInstance.patchNamespacedDeployment(name, namespace, body, null, null, null, null);
return true;
} catch (ApiException e) {
e.printStackTrace();
log.error("k8s副本更新失败!");
return false;
}
}
4.更新副本1.16版本代码
/**
* 更新Deployment副本,k8s是1.16版本
*/
public boolean patchNamespacedDeployment16(String namespace, String name, int replicas) {
AppsV1Api apiInstance = new AppsV1Api(k8sInit.getConnection());
// 更新副本的json串
String jsonPatchStr = "[{\"op\":\"replace\",\"path\":\"/spec/replicas\", \"value\": " + replicas + " }]";
V1Patch body = new V1Patch(jsonPatchStr);
try {
V1Deployment result1 = apiInstance.patchNamespacedDeployment(name, namespace, body, null, null, null, null);
return true;
} catch (ApiException e) {
e.printStackTrace();
log.error("k8s副本更新失败!");
return false;
}
}
这样就可以更改副本了,亲测可用!