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();
        }

至此,问题解决

Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐