如何使用 golang 客户端从 Kubernetes 中驱逐或删除 Pod

我想使用 client-go 包从 Kubernetes 节点中逐出所有 pod。类似于kubectl drain <Node>。可能会忽略kube-system命名空间 pod。


我通过以下方式从节点获取了 pod 列表:


func evictNodePods(nodeInstance string, client *kubernetes.Clientset) {


    pods, err := client.CoreV1().Pods("").List(metav1.ListOptions{

        FieldSelector: "spec.nodeName=" + nodeInstance,

    })


    if err != nil {

        log.Fatal(err)

    }

    for _, i := range pods.Items {

        if i.Namespace == "kube-system" {

            continue

        } else {

            //evict

        }

    }

}

但我不清楚如何发送 POST 请求以驱逐给定节点实例上的 pod


摇曳的蔷薇
浏览 385回答 2
2回答

慕神8447489

要删除 pod:err := client.CoreV1().Pods(i.Namespace).Delete(i.Name, metav1.DeleteOptions{})if err != nil {&nbsp; log.Fatal(err)}如果您升级client-go到最新版本,您还需要添加上下文作为参数。err := client.CoreV1().Pods(i.Namespace).Delete(context.TODO(), i.Name, metav1.DeleteOptions{})if err != nil {&nbsp; log.Fatal(err)}

慕后森

尽管Delete可能大部分时间都可以工作,但它并不能保证新的 Pod 不会被安排在同一个节点上。以下是人们应该如何处理这个问题:污染节点并使其不可调度,以便将该节点从调度池中取出。import (&nbsp; "context"&nbsp; "k8s.io/client-go/kubernetes"&nbsp; meta_v1 "k8s.io/apimachinery/pkg/apis/meta/v1")func CordonNode(client *kubernetes.Clientset, name string) error {&nbsp; # Fetch node object&nbsp; node, err := client.CoreV1().Nodes().Get(context.TODO(), name, meta_v1.GetOptions{})&nbsp; if err != nil {&nbsp; &nbsp; return err&nbsp; }&nbsp; node.Spec.Unschedulable = true&nbsp; # Update the node&nbsp; _, err = client.CoreV1().Nodes().Update(context.TODO(), node, meta_v1.UpdateOptions{})&nbsp; return err}现在你有两个选择:添加NoExecuteon 节点的 taint,kubelet 会为你从节点中驱逐所有工作负载。但是,容忍这种污点的 pod 仍将继续在节点上运行。import (&nbsp; "context"&nbsp; "k8s.io/client-go/kubernetes"&nbsp; meta_v1 "k8s.io/apimachinery/pkg/apis/meta/v1"&nbsp; v1 "k8s.io/api/core/v1")func TaintNode(client *kubernetes.Clientset, name string) error {&nbsp; # Fetch node object&nbsp; node, err := client.CoreV1().Nodes().Get(context.TODO(), name, meta_v1.GetOptions{})&nbsp; node.Spec.Taints = append(node.Spec.Taints, v1.Taint{&nbsp; &nbsp; Key: "someKey"&nbsp; &nbsp; Value: "someValue"&nbsp; &nbsp; Effect: v1.TaintEffectNoExecute&nbsp; })&nbsp; # Update the node&nbsp; _, err = client.CoreV1().Nodes().Update(context.TODO(), node, meta_v1.UpdateOptions{})&nbsp; return err}逐个逐出在该节点上运行的工作负载 pod。import (&nbsp; "context"&nbsp; "k8s.io/client-go/kubernetes"&nbsp; meta_v1 "k8s.io/apimachinery/pkg/apis/meta/v1"&nbsp; policy "k8s.io/api/policy/v1beta1")func EvictPod(client *kubernetes.Clientset, name, namespace string) error {&nbsp; return client.PolicyV1beta1().Evictions(namespace).Evict(context.TODO(), &policy.Eviction{&nbsp; &nbsp; &nbsp; &nbsp; ObjectMeta: meta_v1.ObjectMeta{&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Name:&nbsp; &nbsp; &nbsp; name,&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Namespace: namespace,&nbsp; &nbsp; &nbsp; &nbsp; }}
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go