k8s解决Http delete rc的时候未删除pod的问题
使用k8s api删除rc遗留pod的问题解决
·
1.先删除Rc,再遍历pod后删除指定pod
之前用的比较笨的方法,先删除rc,完了遍历所有pod,取出属于本rc的pod,然后一一删除,
(因为pod的label是清楚的自己设置的,打上了rcName这个标签。所以可以取出指定rc所属pod。)
结果问题一大堆,因为删除rc只是发一条命令,什么时候k8s真正删除并不知道,所以存在重启pod的情况,久而久之,就会存在垃圾pod。
然后我又加了逻辑,删完rc后去get rc,直到返回Not Found我再去遍历pod删除对应的pod。这下基本上没问题了,但是跑久了还是偶有垃圾pod。
2.官方做法:先put rc副本数为0,再删除rc
佩服我身边这个牛人啊,看源码,抓包。轻松进行各种源码的深度分析。现在才发现抓包这个技能真NB!得找个时间学学了。
在服务器上执行kubectl delete rc就能删除rc及其pod.当时没想太多。就用restful api来删除了。
现在回过头来看一开始就应该把这个命令调用了什么API搞清楚的。
官方的做法是put rc即更新rc的副本数为0,然后再删除pod。
我改了之后也就搞定了,put rc的json
{
"kind": "Scale",
"apiVersion": "extensions/v1beta1",
"metadata": {
"name": "${rcName}",
"namespace":"default"
},
"spec": {
"replicas": ${replicas?c}
}
}
try {
//把副本数变为0
String deletePodJson = ToMetadata.toScaleJson(finalStackName, 0);
String scaleRcToZero = RequestK8S.scale(finalStackName, deletePodJson, finalClusterUuid);
logger.info(finalStackName + " : scale replicas to 0 = " + scaleRcToZero);
String rcResult = RequestK8S.get(K8STypeEnum.RC, finalStackName, finalClusterUuid);
JSONObject rcJson = JSONObject.parseObject(rcResult);
while (true) {
if (rcJson.getJSONObject("status").getString("replicas").equals("0")) {
break;
}
Thread.sleep(2000);//2秒后再查
}
//删除RC
String apiServerUrl = xxxxxxx"";
String deleteRcResult = HttpUtil.delete(apiServerUrl + "/api/v1/namespaces/default/replicationcontrollers/" + finalStackName);
logger.info(finalStackName + " : deleteRcResult = " + deleteRcResult);
} catch (Exception e) {
e.printStackTrace();
}
至此,问题解决
更多推荐
已为社区贡献2条内容
所有评论(0)