快速安装

kubeprober 是 master/agent 的架构,可以管理海量的 kubernetes 集群的诊断问题,一般会选择一个集群来部署 master, 其余的被管理的集群部署 agent,master跟agent均作为controller运行在kubernetes中,安装前确保您已经部署好了kubernetes集群,并且可以使用kubectl访问它。

  • 本文以 Kind 为例介绍如何安装 Kuberprober 以及简单的体验使用。
  • 生产环境的部署方式跟本文介绍的方式完全一致。
  • 部署之前请 clone kubeprober 的代码仓库或者下载release包。

部署Kind集群

准备一个包含 Ingress 的集群配置文件

  1. kind: Cluster
  2. apiVersion: kind.x-k8s.io/v1alpha4
  3. nodes:
  4. - role: control-plane
  5. image: kindest/node:v1.18.15@sha256:5c1b980c4d0e0e8e7eb9f36f7df525d079a96169c8a8f20d8bd108c0d0889cc4
  6. kubeadmConfigPatches:
  7. - |
  8. kind: InitConfiguration
  9. nodeRegistration:
  10. kubeletExtraArgs:
  11. node-labels: "ingress-ready=true"
  12. extraPortMappings:
  13. - containerPort: 80
  14. hostPort: 80
  15. protocol: TCP
  16. - containerPort: 443
  17. hostPort: 443
  18. protocol: TCP
  19. - role: worker
  20. image: kindest/node:v1.18.15@sha256:5c1b980c4d0e0e8e7eb9f36f7df525d079a96169c8a8f20d8bd108c0d0889cc4
  21. - role: worker
  22. image: kindest/node:v1.18.15@sha256:5c1b980c4d0e0e8e7eb9f36f7df525d079a96169c8a8f20d8bd108c0d0889cc4

启动集群 ```shell script kind create cluster —name moon —config cluster.yaml

  1. 部署 ingress

kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/v1.0.0-alpha.1/deploy/static/provider/kind/deploy.yaml

  1. ## master端的安装
  2. master 端只有一个 probe-master 的组件,其依赖与 Kubernetes Webhook做一个资源的前置校验工作,我们使用 cert-manager 服务来进行 webhook 证书的自动签发,所以需要先部署一下 cert-manager 服务,等 cert-manager pod 全部启动成功后再进行后续组件的安装。
  3. ```shell script
  4. kubectl apply -f https://github.com/jetstack/cert-manager/releases/download/v1.3.1/cert-manager.yaml

关于Secret-key

probe-master 跟 probe-tunnel(agent端中的一个组件)交互使用Secret-key来进行认证,用户可以在 probe-master 配置 Secret-key 来作为集群接入的统一凭证,被管理集群的 probe-tunnel 组件也配置相应的 Secret-key 来跟probe-master 交互。

配置 probe-master 的 Secret-key

```shell script vim deployment/probe-master.yaml

apiVersion: apps/v1 kind: Deployment metadata: name: probe-master spec: template: spec: containers:

  1. - command:
  2. - /probe-master
  3. env:
  4. - name: SERVER_SECRET_KEY
  5. value: your-token-here
  1. ### 部署master组件

APP=probe-master make deploy

  1. ## agent端的安装
  2. agent 端包含 probe-agent probe-tunnel 组件,probe-tunnel 使用 websocket probe-master 建立连接,提供 probe-master 到被管理集群的控制通道,probe-agent 管理诊断项的声生命周期,创建,执行,删除等。
  3. 由于 Kubernetes 本身没有集群名的概念,因此我们在 agent 端加入了集群名的概念,结合 master 端介绍的 Secret-key,因此在 agent 端需要配置 master地址, 集群名,Secret-key这三个配置。
  4. ```shell script
  5. vim deployment/probe-agent.yaml
  6. ---
  7. apiVersion: v1
  8. kind: ConfigMap
  9. metadata:
  10. name: probeagent
  11. namespace: system
  12. data:
  13. probe-conf.yaml: |
  14. probe_master_addr: http://probe-master.kubeprober.svc.cluster.local:8088
  15. cluster_name: moon
  16. secret_key: your-token-here

部署 agent 组件

```shell script APP=probe-agent make deploy

  1. ### 检查集群信息是否上报
  2. probe-agent probe-tunnel 启动成功后,会将集群信息上报给 probe-master probe-master会创建出对应的集群资源,可以用如下命令来进行查看。

kubectl get cluster

  1. ![](http://terminus-paas.oss-cn-hangzhou.aliyuncs.com/paas-doc/2021/09/01/323608da-3e03-4d8b-afc4-6450a755775c.png
  2. )
  3. ## 执行诊断
  4. Kubeprober 采用中心管理的方式对诊断项进行管理,使用给 cluster 打上 probe label 方式来将诊断项关联到某一个集群中。
  5. ### 创建 probe
  6. probe-master 所在的集群来创建 probe 资源(在defaultnamespace下)。
  7. ```yaml
  8. apiVersion: kubeprober.erda.cloud/v1
  9. kind: Probe
  10. metadata:
  11. name: k8s
  12. spec:
  13. policy:
  14. # unit: minute
  15. runInterval: 30
  16. template:
  17. containers:
  18. - env:
  19. - name: NODE_NAME
  20. valueFrom:
  21. fieldRef:
  22. fieldPath: spec.nodeName
  23. name: k8s
  24. image: kubeprober/probe-k8s:v0.1.5
  25. resources:
  26. requests:
  27. cpu: 10m
  28. memory: 50Mi
  29. restartPolicy: Never
  30. configs:
  31. - name: control-plane
  32. env:
  33. - name: PRIVATE_DOMAIN
  34. value: "kubernetes.default"
  35. - name: DNS_CHECK_NAMESPACE
  36. value: "kube-system"
  37. - name: DNS_NODE_SELECTOR
  38. value: "k8s-app=kube-dns"
  39. - name: PUBLIC_DOMAIN
  40. value: "www.baidu.com"

上述 probe 指定了运行策略,即每隔 30 分钟运行一次 k8s 的诊断。 ```shell script kubectl apply -f probe.yaml

  1. ![](http://terminus-paas.oss-cn-hangzhou.aliyuncs.com/paas-doc/2021/09/01/3dab7ffb-c23f-42ba-b5c4-a2630e75e6d7.png
  2. )
  3. ### probe 关联集群
  4. 通过 kuebctl label 来关联 probe cluster,比如将 k8s probe 关联给了 moon 集群。
  5. ```shell script
  6. kubectl label cluster moon probe/k8s=true

快速安装 - 图1

查看诊断结果

可以使用 kubectl probe 指令来查看特定集群的诊断结果。
kuebctl probe 指令的运行需要知道 probe-master 的地址,由于本案例是 Kind 部署的,因此可以创建一个 ingress 来将 probe-master 暴露出来。

  1. apiVersion: extensions/v1beta1
  2. kind: Ingress
  3. metadata:
  4. name: kubeprober
  5. namespace: kubeprober
  6. spec:
  7. rules:
  8. - host: kubeprober.moon.cn
  9. http:
  10. paths:
  11. - backend:
  12. serviceName: probe-master
  13. servicePort: 8088

并且配置本地hosts ```shell script 127.0.0.1 kubeprober.moon.cn

  1. 创建 kubectl probe 所需要的配置文件
  2. ```shell script
  3. vi ~/.kubeprober/config
  4. {
  5. "masterAddr": "ws://kubeprober.moon.cn/clusterdialer"
  6. }

查看诊断结果 shell script kubectl probe status -c moon 快速安装 - 图2