【发布时间】:2021-06-03 11:48:48
【问题描述】:
作为在给定 k8s 节点中列出 pod 的编写逻辑的一部分,我有以下 api 调用:
func ListRunningPodsByNodeName(kubeClient kubernetes.Interface, nodeName string (*v1.PodList, error) {
return kubeClient.
CoreV1().
Pods("").
List(context.TODO(), metav1.ListOptions{
FieldSelector: "spec.nodeName=" + nodeName,
})
}
为了使用k8s提供的假客户端测试ListRunningPodsByNodeName,我想出了以下测试初始化:
func TestListRunningPodsByNodeName(t *testing.T) {
// happy path
kubeClient := fake.NewSimpleClientset(&v1.Pod{
ObjectMeta: metav1.ObjectMeta{
Name: "pod1",
Namespace: "default",
Annotations: map[string]string{},
},
Spec: v1.PodSpec{
NodeName: "foo",
},
}, &v1.Pod{
ObjectMeta: metav1.ObjectMeta{
Name: "pod2",
Namespace: "default",
Annotations: map[string]string{},
},
Spec: v1.PodSpec{
NodeName: "bar",
},
})
got, _ := ListRunningPodsByNodeName(kubeClient, "foo")
for i, pod := range got.Items {
fmt.Println(fmt.Sprintf("[%2d] %s", i, pod.GetName()))
}
t.Errorf("Error, expecting only one pod")
}
调试时,我得到了 pod1 和 pod2 Pod,尽管我正在过滤那些在 foo 节点中运行的 Pod。使用相同的方法通过某些元数据进行过滤就像一个魅力,但在通过 nodeName 过滤的情况下无法使其工作。 ¿ 有人知道为什么吗?我怀疑这可能是假客户端功能的限制,但还不能完全确定会打开一个问题
提前致谢
【问题讨论】:
标签: go kubernetes