为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
摇曳的蔷薇 2022-06-13 16:52:16
我想使用 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
查看完整描述

2 回答

?
慕神8447489

TA贡献1780条经验 获得超1个赞

要删除 pod:


err := client.CoreV1().Pods(i.Namespace).Delete(i.Name, metav1.DeleteOptions{})

if err != nil {

  log.Fatal(err)

}

如果您升级client-go到最新版本,您还需要添加上下文作为参数。


err := client.CoreV1().Pods(i.Namespace).Delete(context.TODO(), i.Name, metav1.DeleteOptions{})

if err != nil {

  log.Fatal(err)

}


查看完整回答
反对 回复 2022-06-13
?
慕后森

TA贡献1802条经验 获得超5个赞

尽管Delete可能大部分时间都可以工作,但它并不能保证新的 Pod 不会被安排在同一个节点上。以下是人们应该如何处理这个问题:


污染节点并使其不可调度,以便将该节点从调度池中取出。

import (

  "context"


  "k8s.io/client-go/kubernetes"

  meta_v1 "k8s.io/apimachinery/pkg/apis/meta/v1"

)


func CordonNode(client *kubernetes.Clientset, name string) error {

  # Fetch node object

  node, err := client.CoreV1().Nodes().Get(context.TODO(), name, meta_v1.GetOptions{})


  if err != nil {

    return err

  }


  node.Spec.Unschedulable = true


  # Update the node

  _, err = client.CoreV1().Nodes().Update(context.TODO(), node, meta_v1.UpdateOptions{})


  return err

}

现在你有两个选择:

添加NoExecuteon 节点的 taint,kubelet 会为你从节点中驱逐所有工作负载。但是,容忍这种污点的 pod 仍将继续在节点上运行。

import (

  "context"


  "k8s.io/client-go/kubernetes"

  meta_v1 "k8s.io/apimachinery/pkg/apis/meta/v1"

  v1 "k8s.io/api/core/v1"

)


func TaintNode(client *kubernetes.Clientset, name string) error {

  # Fetch node object

  node, err := client.CoreV1().Nodes().Get(context.TODO(), name, meta_v1.GetOptions{})


  node.Spec.Taints = append(node.Spec.Taints, v1.Taint{

    Key: "someKey"

    Value: "someValue"

    Effect: v1.TaintEffectNoExecute

  })


  # Update the node

  _, err = client.CoreV1().Nodes().Update(context.TODO(), node, meta_v1.UpdateOptions{})


  return err

}


逐个逐出在该节点上运行的工作负载 pod。

import (

  "context"


  "k8s.io/client-go/kubernetes"

  meta_v1 "k8s.io/apimachinery/pkg/apis/meta/v1"

  policy "k8s.io/api/policy/v1beta1"

)


func EvictPod(client *kubernetes.Clientset, name, namespace string) error {

  return client.PolicyV1beta1().Evictions(namespace).Evict(context.TODO(), &policy.Eviction{

        ObjectMeta: meta_v1.ObjectMeta{

            Name:      name,

            Namespace: namespace,

        }

}


查看完整回答
反对 回复 2022-06-13
  • 2 回答
  • 0 关注
  • 383 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号