k8s解决Http delete rc的时候未删除pod的问题

本文分享了一种在Kubernetes中优雅删除ReplicationController (RC) 及其关联Pod的方法,避免了因直接删除RC导致的残留Pod问题。通过将RC的副本数置零并监控状态,确保所有Pod被安全移除后再删除RC。

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

至此,问题解决

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值