指定集群检索

Clusterpedia 除了支持多个集群的混合检索,还可以指定集群来检索资源。

在性能上使用 Search Label 或者 URL Query 来指定单个集群和在 URL Path 中指定集群并无区别

本文主要讲述在 URL Path 中指定集群

在以指定集群的方式使用 kubectl 前,需要先配置 kubectl 的集群快捷方式

kubectl --cluster cluster-1 get deployments -n kube-system
# 输出:
NAMESPACE     CLUSTER     NAME                      READY   UP-TO-DATE   AVAILABLE   AGE
kube-system   cluster-1   coredns                   2/2     2            2           68d

将 cluster name 放到 URL 路径中来指定集群

kubectl get --raw="/apis/clusterpedia.io/v1beta1/resources/clusters/cluster-1/apis/apps/v1/deployments"

也可以通过 URL Query 来指定单个集群

kubectl get --raw="/apis/clusterpedia.io/v1beta1/resources/apis/apps/v1/deployments?clusters=cluster-1"

指定集群支持的功能和多集群检索的作用基本相同,而且在 Owner 检索上更加方便, 另外在获取单个资源时也只能使用在 URL Path 中指定集群的方式

根据父辈或者祖辈 Owner 进行检索

Owner 查询必须指定单个集群,可以使用 Search Label 或者 URL Query 来指定,也可以在 URL Path 中指定集群名称

通过 Owenr UID 或者 Owner Name, 并且配合用于 Owner 辈分提升的 Owenr Senirority 可以完成基于祖辈 Owner 的资源检索。

关于具体的查询参数,可以参考 Owner 检索

通过这种方式,可以直接查询到 Deployment 相应的 Pods,无需查询有哪些 ReplicaSet 属于该 Deployment

指定 Owner 的 UID

在指定 Owenr UID 后,Owner NameOwenr Group Resource 会被忽略

首先使用 kubectl 获取 Deployment 的 UID

kubectl --cluster cluster-1 get deploy fake-deploy -o jsonpath="{.metadata.uid}"
#输出:
151ae265-28fe-4734-850e-b641266cd5da

在 kubectl 下获取 uid 可能比较麻烦,但是在 UI 场景中通常已经更容易查看 metadata.uid

使用 owner-uid 来指定 Owner 的 UID, owner-seniority 对 Owner 进行辈分提升。

owner-seniority 默认为 0,表示 Owner 为父辈。设置为 1,提升 Owenr 辈分成为祖父 Owenr

kubectl --cluster cluster-1 get pods -l \
    "search.clusterpedia.io/owner-uid=151ae265-28fe-4734-850e-b641266cd5da,\
     search.clusterpedia.io/owner-seniority=1"

kubectl get --raw="/apis/clusterpedia.io/v1beta1/resources/clusters/cluster-1/api/v1/namespaces/default/pods?ownerUID=151ae265-28fe-4734-850e-b641266cd5da&ownerSeniority=1"

指定 Owner Name

如果事先并不知道 Owner 的 UID,那么指定 Owner UID 是一种比较麻烦的方式。

我们可以通过 Owner 的名字来指定 Owner,同时还可以指定 Owner Group Resource 来限制 Owner 的 Group Resource。

同样,我们以获取 Deployment 下相应的 Pods 来举例

kubectl --cluster cluster-1 get pods -l \
    "search.clusterpedia.io/owner-name=deploy-1,\
     search.clusterpedia.io/owner-seniority=1"

另外为了避免某些情况下,owner 资源存在多种类型,我们可以使用 Owner Group Resource 来限制 Owner 的类型

kubectl --cluster cluster-1 get pods -l \
    "search.clusterpedia.io/owner-name=deploy-1,\
     search.clusterpedia.io/owner-gr=deployments.apps,\
     search.clusterpedia.io/owner-seniority=1"

kubectl get --raw="/apis/clusterpedia.io/v1beta1/resources/clusters/cluster-1/api/v1/namespaces/default/pods?ownerName=deploy-1&ownerSeniority=1"

获取单个资源

当我们想要使用资源名称获取(Get)一个资源时,就必须要以 URL Path 的方式将集群名称传递进去,就像 namespace 一样。

如果使用多集群方式传递一个资源名称会报错

kubectl --cluster cluster-1 get deploy fake-deploy 
# 输出:
CLUSTER     NAME        READY   UP-TO-DATE   AVAILABLE   AGE
cluster-1   fake-deploy 1/1     1            1           35d

当然在 kubectl 中也可以通过 Search Label 来指定一个资源名称。

不过在 -o yaml 或者其他方式查看返回的源数据时,和使用 kubectl --cluster <cluster name> 是不一样的。

# 实际服务端返回 DeploymentList 的资源,由 kubectl 替换成 List 资源
kubectl --cluster clusterpedia get deploy -l 
    "search.clusterpedia.io/clusters=cluster-1,\
     search.clusterpedia.io/names=fake-deploy" -o yaml
# 输出:
apiVersion: v1
items:
- ...
kind: List
metadata:
  resourceVersion: ""
  selfLink: ""

实际返回的资源依然是一个 KindList,而 kubectl --cluster <clsuter name> 返回的便是具体的 Kind

kubectl --cluster cluster-1 get deploy fake-deploy -o yaml
# 输出:
apiVersion: apps/v1
kind: Deployment
metadata:
  annotations:
    deployment.kubernetes.io/revision: "1"
    shadow.clusterpedia.io/cluster-name: cluster-1
  creationTimestamp: "2021-12-16T02:26:29Z"
  generation: 2
  name: fake-deploy
  namespace: default
  resourceVersion: "38085769"
  uid: 151ae265-28fe-4734-850e-b641266cd5da
spec:
  ...
status:
  ...

获取指定资源的 URL 可以分为三部分

  • 资源检索前缀: /apis/clusterpedia.io/v1beta1/resources
  • 指定集群名称 /clusters/< cluster name >
  • 原生 Kubernetes API 的资源 Path /apis/apps/v1/namespaces/< namespace >/deployments/< resource name >
kubectl get --raw="/apis/clusterpedia.io/v1beta1/resources/clusters/cluster-1/apis/apps/v1/namespaces/default/deployments/fake-deploy"