亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

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

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

Go
搖曳的薔薇 2022-06-13 16:52:16
我想使用 client-go 包從 Kubernetes 節點中逐出所有 pod。類似于kubectl drain <Node>??赡軙雎詋ube-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 關注
  • 355 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號