使用 Karmada-search 来体验多集群检索

本指南将涵盖以下内容:

  • 在 Karmada 控制面上安装 karmada-search 组件
  • 缓存多个集群的 Deployment 资源。
  • 使用 OpenSearch 图形界面检索 Kubernetes 资源。

前提条件

在安装 karmada-search 之前,您必须先安装 Karmada 控制平面。要启动 Karmada,您可以参考安装概述。如果您只是想尝试 Karmada,我们建议使用 hack/local-up-karmada.sh 构建开发环境。

  1. git clone https://github.com/karmada-io/karmada
  2. cd karmada
  3. hack/local-up-karmada.sh

如果您使用 hack/local-up-karmada.sh,那 karmada-search 已经安装好了。

如果您通过 Helm 安装 Karmada,可以选择以下任意一种方式进行安装:

  • host 模式下安装 karmada-search
  1. helm upgrade --install karmada -n karmada-system --create-namespace --dependency-update \
  2. --cleanup-on-fail ./charts/karmada \
  3. --set components={"search"}
  • component 模式下单独安装 karmada-search

karmada-search 编辑 values.yaml 文件:

  1. installMode: "component"
  2. components: [
  3. "search"
  4. ]
  5. ...

执行下述命令:

  1. kubectl config use-context host
  2. helm install karmada -n karmada-system ./charts/karmada

此外,karmadactl 支持一键安装 karmada-search

  1. karmadactl addons enable karmada-search

有关更多详细信息,您可以参考 karmadactl addons instruction

缓存多个集群的 Deployment 资源

在接下来的步骤中,我们将在缓存成员集群的 Deployment 资源。根据示例,我们已经将一个 nginx Deployment 分发到了 member1 和 member2。

1. 创建一个 ResourceRegistry,它将缓存目标集群中的 Deployment 资源。

  1. ### deployment-search.yaml
  2. apiVersion: search.karmada.io/v1alpha1
  3. kind: ResourceRegistry
  4. metadata:
  5. name: deployment-search
  6. spec:
  7. targetCluster:
  8. clusterNames:
  9. - member1
  10. - member2
  11. resourceSelectors:
  12. - apiVersion: apps/v1
  13. kind: Deployment
  1. kubectl --kubeconfig $HOME/.kube/karmada.config --context karmada-apiserver create -f deployment-search.yaml

2. 通过 Kubernetes API 进行测试

您可以通过以下命令从 member1 和 member2 获取 deployment 资源。

  1. kubectl --kubeconfig $HOME/.kube/karmada.config --context karmada-apiserver get --raw /apis/search.karmada.io/v1alpha1/search/cache/apis/apps/v1/deployments

输出类似于(忽略不相关的字段):

  1. {
  2. "kind": "List",
  3. "apiVersion": "apps/v1",
  4. "metadata": {},
  5. "items": [{
  6. "apiVersion": "apps/v1",
  7. "kind": "Deployment",
  8. "metadata": {
  9. "annotations": {
  10. "deployment.kubernetes.io/revision": "1",
  11. "kubectl.kubernetes.io/last-applied-configuration": "{\"apiVersion\":\"apps/v1\",\"kind\":\"Deployment\",\"metadata\":{\"annotations\":{},\"labels\":{\"app\":\"nginx\"},\"name\":\"nginx\",\"namespace\":\"default\"},\"spec\":{\"replicas\":2,\"selector\":{\"matchLabels\":{\"app\":\"nginx\"}},\"template\":{\"metadata\":{\"labels\":{\"app\":\"nginx\"}},\"spec\":{\"containers\":[{\"image\":\"nginx\",\"name\":\"nginx\"}]}}}}\n",
  12. "resource.karmada.io/cached-from-cluster": "member1",
  13. "resourcebinding.karmada.io/name": "nginx-deployment",
  14. "resourcebinding.karmada.io/namespace": "default",
  15. "resourcetemplate.karmada.io/uid": "b46d2736-78d8-47db-b589-6e819139ba33"
  16. },
  17. "creationTimestamp": "2022-11-18T08:34:28Z",
  18. "generation": 1,
  19. "labels": {
  20. "app": "nginx",
  21. "propagationpolicy.karmada.io/name": "nginx-propagation",
  22. "propagationpolicy.karmada.io/namespace": "default",
  23. "resourcebinding.karmada.io/key": "687f7fb96f",
  24. "work.karmada.io/name": "nginx-687f7fb96f",
  25. "work.karmada.io/namespace": "karmada-es-member1"
  26. }
  27. }
  28. }, {
  29. "apiVersion": "apps/v1",
  30. "kind": "Deployment",
  31. "metadata": {
  32. "annotations": {
  33. "deployment.kubernetes.io/revision": "1",
  34. "kubectl.kubernetes.io/last-applied-configuration": "{\"apiVersion\":\"apps/v1\",\"kind\":\"Deployment\",\"metadata\":{\"annotations\":{},\"labels\":{\"app\":\"nginx\"},\"name\":\"nginx\",\"namespace\":\"default\"},\"spec\":{\"replicas\":2,\"selector\":{\"matchLabels\":{\"app\":\"nginx\"}},\"template\":{\"metadata\":{\"labels\":{\"app\":\"nginx\"}},\"spec\":{\"containers\":[{\"image\":\"nginx\",\"name\":\"nginx\"}]}}}}\n",
  35. "resource.karmada.io/cached-from-cluster": "member2",
  36. "resourcebinding.karmada.io/name": "nginx-deployment",
  37. "resourcebinding.karmada.io/namespace": "default",
  38. "resourcetemplate.karmada.io/uid": "e785db97-4d17-4871-99be-6d629c556b89"
  39. },
  40. "creationTimestamp": "2022-11-21T02:23:26Z",
  41. "generation": 1,
  42. "labels": {
  43. "app": "nginx",
  44. "propagationpolicy.karmada.io/name": "nginx-propagation",
  45. "propagationpolicy.karmada.io/namespace": "default",
  46. "resourcebinding.karmada.io/key": "687f7fb96f",
  47. "work.karmada.io/name": "nginx-687f7fb96f",
  48. "work.karmada.io/namespace": "karmada-es-member2"
  49. }
  50. }
  51. }]
  52. }

使用 OpenSearch 图形界面检索 Kubernetes 资源

karmada-search 还支持将缓存资源同步到独立存储服务,如 ElasticsearchOpenSearch。通过利用搜索引擎,您可以按字段和索引执行具有所有所需功能的全文搜索;根据分数对结果进行排名、按字段对结果进行排序,并聚合结果。

以下是使用 OpenSearch 以图形界面检索 Kubernetes 资源的示例。

1. 部署 OpenSearch 和 OpenSearch 仪表盘

使用以下脚本部署 OpenSearchOpenSearch 仪表盘。

  1. ./hack/deploy-karmada-opensearch.sh $HOME/.kube/karmada.config karmada-host

验证安装结果:

  1. kubectl --kubeconfig $HOME/.kube/karmada.config --context karmada-host get po -A

输出类似于:

  1. NAMESPACE NAME READY STATUS RESTARTS AGE
  2. karmada-system karmada-opensearch-77454fbcf5-7rpvz 1/1 Running 0 155m
  3. karmada-system karmada-opensearch-dashboards-596bf4d9dd-n9429 1/1 Running 0 156m
  4. ...

2. 更新 ResourceRegistry 与 backendStore

  1. ### deployment-search.yaml
  2. apiVersion: search.karmada.io/v1alpha1
  3. kind: ResourceRegistry
  4. metadata:
  5. name: deployment-search
  6. spec:
  7. backendStore:
  8. openSearch:
  9. addresses:
  10. - http://karmada-opensearch.karmada-system.svc:9200
  11. targetCluster:
  12. clusterNames:
  13. - member1
  14. - member2
  15. resourceSelectors:
  16. - apiVersion: apps/v1
  17. kind: Deployment
  1. kubectl --kubeconfig $HOME/.kube/karmada.config --context karmada-apiserver apply -f deployment-search.yaml

3. 暴露仪表板的服务

您需要将 Web 服务暴露到主机端口,以便可以通过 HTTP 访问仪表板。

  1. kubectl --kubeconfig $HOME/.kube/karmada.config --context karmada-host port-forward svc/karmada-opensearch-dashboards 5601:5601 -nkarmada-system --address=0.0.0.0

4. 访问仪表盘

访问 OpenSearch 仪表板(http://NodeIP:5601):

opensearch

现在 Deployment 的数据已经上传到 OpenSearch 中的 member1 和 member2。您可以利用搜索引擎自己体验多集群检索。