簡體   English   中英

如何使用 golang 客戶端從 Kubernetes 驅逐或刪除 pod

[英]How to evict or delete pods from Kubernetes using golang client

我想通過使用客戶端 package 從 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

要刪除 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)
}

盡管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
}

現在你有兩個選擇:

  • 在節點上添加 NoExecute 的污點, NoExecute將為您從節點中驅逐所有工作負載。 但是,容忍這種污點的 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,
        }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM