Kubernetes javascript 客户端 - 无法按标签选择器过滤

问题描述

我从 Kubernetes 官方 javascript 客户端运行以下函数,例如:

<link
  rel="stylesheet"  href="https://cdn.jsdelivr.net/npm/bootstrap@4.6.0/dist/css/bootstrap.min.css"
  integrity="sha384-B0vP5xmATw1+K9KRQjQERJvTumQW0nPEzvF6L/Z6nronJ3oUOFUFpCjEUQouq2+l"
  crossorigin="anonymous"
/>

<script src="https://cdnjs.cloudflare.com/ajax/libs/react/17.0.1/umd/react.production.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react-dom/17.0.1/umd/react-dom.production.min.js"></script>

<script
  src="https://unpkg.com/react-bootstrap@next/dist/react-bootstrap.min.js"
  crossorigin></script>
<div id="react"></div>

或任何其他函数

一个参数叫做标签选择器。

现在我想使用以下标签选择器查找 Pod(如 HTTP 请求中的一样):

.listNamespacedPod("default",null,"false","smth=test",null)

但我无法将 smth=test 作为字符串发送。

如何按标签选择器过滤?

这是我来自 YAML 的元数据:

smth=test

我可以通过 Metadata: name: label-demo labels: smth: test app: Nginx 运行:

kubectl

所以它只会返回匹配的标签

解决方法

基于CoreV1APIthis sample,应该是:

.listNamespacedPod("default",undefined,"false","smth=test")

它将列出 smth=test 命名空间中所有标签为 default 的 Pod。

,

我完全同意 Arnaud Develay 提供的答案,但我想补充一下我在调查这个问题时的发现。

要使您的代码响应带有此标签的 Pods,还需要将其包含在 spec.selector.matchLabels(和 .spec.template. metadata.labels 中)。

通过使用以下 Deployment 定义:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: label-demo
  labels:
    smth: test # <-- IMPORTANT
    app: nginx
spec:
  replicas: 1
  selector:
    matchLabels:
      search: here 
  template:
    metadata:
      labels:
        search: here 
    spec:
      containers:
      - name: nginx
        image: nginx

以及来自官方 github 页面的以下代码片段:

const k8s = require('@kubernetes/client-node');

const kc = new k8s.KubeConfig();
kc.loadFromDefault();

const k8sApi = kc.makeApiClient(k8s.CoreV1Api);


k8sApi.listNamespacedPod("default","smth=test").then((res) => {
    console.log(res.body);
});

代码生成以下输出(以及 Pods 的空列表):

V1PodList {
  apiVersion: 'v1',items: [],kind: 'PodList',metadata: V1ListMeta {
    _continue: undefined,remainingItemCount: undefined,resourceVersion: '990955',selfLink: '/api/v1/namespaces/default/pods'
  }
}

使用 search=here 中的 .spec 标签进行查询时,响应为:

V1PodList {
  apiVersion: 'v1',items: [
    V1Pod {
      apiVersion: undefined,kind: undefined,metadata: [V1ObjectMeta],spec: [V1PodSpec],status: [V1PodStatus]
    }
  ],resourceVersion: '991498',selfLink: '/api/v1/namespaces/default/pods'
  }
}