如何使用golang客户端从Kubernetes中逐出或删除pod



我想使用客户端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

要删除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的污点,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,
}
}

最新更新