在 Kubernetes 上部署 Grafana
您可以使用 Grafana Cloud,避免自行安装、维护和扩展 Grafana 实例。创建免费账户,立即开始,永久免费访问 1 万个指标、50GB 日志、50GB 追踪、500 VUh k6 测试等。
在本页面上,您将找到使用 Kubernetes manifests 在 Kubernetes 上安装和运行 Grafana 的说明。如果您偏好使用 Helm,请参阅Grafana Helm 社区 Charts。
观看此视频,了解更多关于在 Kubernetes 上安装 Grafana 的信息
开始之前
要遵循本指南
您需要最新版本的Kubernetes,可在本地或公有/私有云上远程运行。
如果您计划在本地环境中使用它,可以使用各种 Kubernetes 选项,例如minikube、kind、Docker Desktop等。
如果您计划在生产环境中使用 Kubernetes,建议利用托管的云服务,例如Google Kubernetes Engine (GKE)、Amazon Elastic Kubernetes Service (EKS)或Azure Kubernetes Service (AKS)。
系统要求
本节提供最低硬件和软件要求。
最低硬件要求
- 磁盘空间:1 GB
- 内存:750 MiB(约 750 MB)
- CPU:250m(约 0.25 核)
支持的数据库
有关支持的数据库列表,请参阅支持的数据库。
支持的 Web 浏览器
有关支持的 Web 浏览器列表,请参阅支持的 Web 浏览器。
注意
请确保在您的网络环境中启用端口
3000
,因为这是 Grafana 的默认端口。
在 Kubernetes 上部署 Grafana OSS
本节介绍如何使用 Kubernetes 安装 Grafana OSS。
注意
如果您想在 Kubernetes 上安装 Grafana Enterprise,请参阅在 Kubernetes 上部署 Grafana Enterprise。
如果您在 Kubernetes 中部署应用,它将使用默认命名空间,其中可能已经运行了其他应用。这可能会导致冲突和其他问题。
建议在 Kubernetes 中创建一个新的命名空间,以便更好地管理、组织、分配和管理集群资源。有关命名空间的更多信息,请参阅官方Kubernetes 文档。
要创建命名空间,请运行以下命令
kubectl create namespace my-grafana
在此示例中,命名空间为
my-grafana
要验证和查看新创建的命名空间,请运行以下命令
kubectl get namespace my-grafana
此命令的输出提供了有关新创建的命名空间的更多信息。
创建名为
grafana.yaml
的 YAML manifest 文件。此文件将包含部署所需的代码。touch grafana.yaml
下一步,您将在 YAML 文件中定义以下三个对象。
对象 描述 持久卷声明 (PVC) 此对象用于存储数据。 Service 此对象为部署中定义的 Pod 提供网络访问。 Deployment 此对象负责创建 Pod,确保它们保持最新,并管理 Replicaset 和滚动更新。 复制并粘贴以下内容,并将其保存在
grafana.yaml
文件中。--- apiVersion: v1 kind: PersistentVolumeClaim metadata: name: grafana-pvc spec: accessModes: - ReadWriteOnce resources: requests: storage: 1Gi --- apiVersion: apps/v1 kind: Deployment metadata: labels: app: grafana name: grafana spec: selector: matchLabels: app: grafana template: metadata: labels: app: grafana spec: securityContext: fsGroup: 472 supplementalGroups: - 0 containers: - name: grafana image: grafana/grafana:latest imagePullPolicy: IfNotPresent ports: - containerPort: 3000 name: http-grafana protocol: TCP readinessProbe: failureThreshold: 3 httpGet: path: /robots.txt port: 3000 scheme: HTTP initialDelaySeconds: 10 periodSeconds: 30 successThreshold: 1 timeoutSeconds: 2 livenessProbe: failureThreshold: 3 initialDelaySeconds: 30 periodSeconds: 10 successThreshold: 1 tcpSocket: port: 3000 timeoutSeconds: 1 resources: requests: cpu: 250m memory: 750Mi volumeMounts: - mountPath: /var/lib/grafana name: grafana-pv volumes: - name: grafana-pv persistentVolumeClaim: claimName: grafana-pvc --- apiVersion: v1 kind: Service metadata: name: grafana spec: ports: - port: 3000 protocol: TCP targetPort: http-grafana selector: app: grafana sessionAffinity: None type: LoadBalancer
运行以下命令将 manifest 发送到 Kubernetes API 服务器
kubectl apply -f grafana.yaml --namespace=my-grafana
此命令创建 PVC、Deployment 和 Service 对象。
完成以下步骤来验证每个对象的部署状态。
a. 对于 PVC,运行以下命令
kubectl get pvc --namespace=my-grafana -o wide
b. 对于 Deployment,运行以下命令
kubectl get deployments --namespace=my-grafana -o wide
c. 对于 Service,运行以下命令
kubectl get svc --namespace=my-grafana -o wide
在托管 K8s 提供商上访问 Grafana
在此任务中,您将使用 Web 浏览器访问部署在托管 Kubernetes 提供商上的 Grafana。如果在托管 Kubernetes 提供商上部署 Grafana,通过 Web 浏览器访问非常简单,因为它使用了云提供商的 LoadBalancer,并且会自动创建外部负载均衡器路由。
运行以下命令获取部署信息
kubectl get all --namespace=my-grafana
返回的输出应类似于以下内容
NAME READY STATUS RESTARTS AGE pod/grafana-69946c9bd6-kwjb6 1/1 Running 0 7m27s NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE service/grafana LoadBalancer 10.5.243.226 1.120.130.330 3000:31171/TCP 7m27s NAME READY UP-TO-DATE AVAILABLE AGE deployment.apps/grafana 1/1 1 1 7m29s NAME DESIRED CURRENT READY AGE replicaset.apps/grafana-69946c9bd6 1 1 1 7m30s
在输出中找到 EXTERNAL-IP 值并将其输入到您的浏览器中。
Grafana 登录页面将出现。
要登录,用户名为
admin
,密码也为admin
。如果您没有看到 EXTERNAL-IP,请完成以下步骤
a. 运行以下命令,将 Grafana service 的
3000
端口进行端口转发。kubectl port-forward service/grafana 3000:3000 --namespace=my-grafana
有关端口转发的更多信息,请参阅使用端口转发访问集群中的应用。
b. 在您的浏览器中导航到
localhost:3000
。Grafana 登录页面将出现。
c. 要登录,用户名为
admin
,密码也为admin
。
使用 minikube 访问 Grafana
使用 minikube 时,有多种方法可以在 Web 浏览器上访问 Grafana UI。有关 minikube 的更多信息,请参阅如何在 minikube 中访问运行的应用。
本节列出了在 minikube 中访问运行应用的两种最常见选项。
选项 1:暴露 Service
此选项在grafana.yaml
service manifest 中使用type: LoadBalancer
,这使得该 service 可以通过minikube service
命令访问。有关更多信息,请参阅minikube Service 命令用法。
运行以下命令获取 Grafana service IP
minikube service grafana --namespace=my-grafana
输出返回您本地集群中 service 的 Kubernetes URL。
|------------|---------|-------------|------------------------------| | NAMESPACE | NAME | TARGET PORT | URL | |------------|---------|-------------|------------------------------| | my-grafana | grafana | 3000 | http://192.168.122.144:32182 | |------------|---------|-------------|------------------------------| Opening service my-grafana/grafana in default browser... http://192.168.122.144:32182
运行
curl
命令,验证在理想情况下给定连接是否可在浏览器中工作。curl 192.168.122.144:32182
以下示例输出显示已找到一个端点
<a href="/login">已找到</a>。
使用上述命令提供的 IP:Port 在浏览器中访问 Grafana UI。例如
192.168.122.144:32182
Grafana 登录页面将出现。
要登录 Grafana,用户名为
admin
,密码也为admin
。
选项 2:使用端口转发
如果选项 1 在您的 minikube 环境中不起作用(这主要取决于网络),那么作为替代方案,您可以对 Grafana service 的3000
端口使用端口转发选项。
有关端口转发的更多信息,请参阅使用端口转发访问集群中的应用。
要查找 minikube IP 地址,请运行以下命令
minikube ip
输出包含您在端口转发期间用于访问 Grafana Pod 的 IP 地址。
Pod 是 Kubernetes 中最小的部署单元,也是在 Kubernetes 集群中运行应用的核心构建块。有关 Pod 的更多信息,请参阅Pod。
要获取 Grafana Pod 信息,请运行以下命令
kubectl get pods --namespace=my-grafana
输出应类似于以下内容
NAME READY STATUS RESTARTS AGE grafana-58445b6986-dxrrw 1/1 Running 0 9m54s
输出在
NAME
列中显示 Grafana POD 名称,您将使用此名称进行端口转发。运行以下命令以在 POD 上启用端口转发
kubectl port-forward pod/grafana-58445b6986-dxrrw --namespace=my-grafana --address 0.0.0.0 3000:3000
要在 Web 浏览器上访问 Grafana UI,请输入 minikube IP 地址以及转发的端口。例如
192.168.122.144:3000
Grafana 登录页面将出现。
要登录 Grafana,用户名为
admin
,密码也为admin
。
使用滚动更新策略更新现有部署
滚动更新允许在不停机的情况下进行部署更新,通过增量更新 Pod 实例来替换旧的实例。新的 Pod 将被调度到具有可用资源的节点上。有关滚动更新的更多信息,请参阅执行滚动更新。
以下步骤使用kubectl annotate
命令添加元数据并跟踪部署。有关kubectl annotate
的更多信息,请参阅kubectl annotate 文档。
注意
除了使用
annotate
标志外,您仍然可以使用--record
标志。但是,它已被弃用,并将在未来的 Kubernetes 版本中移除。参阅:https://github.com/kubernetes/kubernetes/issues/40422
要查看滚动更新的当前状态,请运行以下命令
kubectl rollout history deployment/grafana --namespace=my-grafana
输出将类似于以下内容
deployment.apps/grafana REVISION CHANGE-CAUSE 1 NONE
输出显示应用
grafana.yaml
文件后,没有任何内容被更新或更改。要添加元数据以记录初始部署,请运行以下命令
kubectl annotate deployment/grafana kubernetes.io/change-cause='deployed the default base yaml file' --namespace=my-grafana
要查看滚动更新历史记录并验证更改,请运行以下命令
kubectl rollout history deployment/grafana --namespace=my-grafana
您应该会看到之前在
CHANGE-CAUSE
中添加的更新信息。
更改 Grafana 镜像版本
要更改已部署的 Grafana 版本,请运行以下
kubectl edit
命令kubectl edit deployment grafana --namespace=my-grafana
在编辑器中,更改
kind: Deployment
部分下的容器镜像。例如
从
yaml image: grafana/grafana-oss:10.0.1
到
yaml image: grafana/grafana-oss-dev:10.1.0-124419pre
保存更改。
保存文件后,您将收到类似以下的消息
deployment.apps/grafana edited
这意味着更改已应用。
要验证集群上的滚动更新是否成功,请运行以下命令
kubectl rollout status deployment grafana --namespace=my-grafana
成功的部署滚动更新意味着 Grafana Dev 集群现已可用。
要检查所有已部署对象的状态,请运行以下命令并包含
-o wide
标志以获取更详细的输出kubectl get all --namespace=my-grafana -o wide
您应该会看到新部署的
grafana-oss-dev
镜像。要验证,请使用上述命令提供的 IP:Port 在浏览器中访问 Grafana UI。
Grafana 登录页面将出现。
要登录 Grafana,用户名为
admin
,密码也为admin
。在右上角,单击帮助图标。
版本信息将出现。
添加
change cause
元数据以使用命令跟踪变更kubectl annotate deployment grafana --namespace=my-grafana kubernetes.io/change-cause='using grafana-oss-dev:10.1.0-124419pre for testing'
要验证,请运行
kubectl rollout history
命令kubectl rollout history deployment grafana --namespace=my-grafana
您将看到类似以下内容的输出
deployment.apps/grafana REVISION CHANGE-CAUSE 1 deploying the default yaml 2 using grafana-oss-dev:10.1.0-124419pre for testing
这意味着REVISION#2
是当前版本。
注意
kubectl rollout history deployment
命令输出的最后一行是当前在您的 Kubernetes 环境中处于活动并运行的版本。
回滚部署
当 Grafana 部署因崩溃循环、bug 等原因变得不稳定时,您可以将部署回滚到较早的版本(一个REVISION
)。
默认情况下,Kubernetes 部署的滚动更新历史记录保留在系统中,以便您可以随时回滚。有关更多信息,请参阅回滚到先前的修订版本。
要列出所有可能的
REVISION
值,请运行以下命令kubectl rollout history deployment grafana --namespace=my-grafana
要回滚到先前的版本,请运行
kubectl rollout undo
命令并提供一个修订版本号。示例:要回滚到先前的版本,请在
--to-revision
参数中指定在运行kubectl rollout history deployment
命令后显示的REVISION
号。kubectl rollout undo deployment grafana --to-revision=1 --namespace=my-grafana
要验证集群上的回滚是否成功,请运行以下命令
kubectl rollout status deployment grafana --namespace=my-grafana
使用上述命令提供的 IP:Port 在浏览器中访问 Grafana UI。
Grafana 登录页面将出现。
要登录 Grafana,用户名为
admin
,密码也为admin
。在右上角,单击帮助图标以显示版本号。
要查看新的滚动更新历史记录,请运行以下命令
kubectl rollout history deployment grafana --namespace=my-grafana
如果您需要回滚到任何其他REVISION
,只需重复上述步骤并在--to-revision
参数中使用正确的修订版本号。
使用配置文件预配 Grafana 资源
Grafana 启动时,预配可以添加、更新或删除您在配置文件中指定的资源。有关详细信息,请参阅Grafana 预配。
本节概述了在 Kubernetes 中预配 Grafana 资源的一般说明,使用持久卷将配置文件提供给 Grafana pod。
向
grafana.yaml
文件添加新的PersistentVolumeClaim
。--- apiVersion: v1 kind: PersistentVolumeClaim metadata: name: grafana-provisioning-pvc spec: accessModes: - ReadWriteOnce resources: requests: storage: 1Mi
在
grafana.yaml
文件中,按如下方式将持久卷挂载到/etc/grafana/provisioning
。... volumeMounts: - mountPath: /etc/grafana/provisioning name: grafana-provisioning-pv ... volumes: - name: grafana-provisioning-pv persistentVolumeClaim: claimName: grafana-provisioning-pvc ...
查找或创建您要添加的预配资源。例如,创建一个
alerting.yaml
文件,添加一个静默时间 (报警资源)。apiVersion: 1 muteTimes: - orgId: 1 name: MuteWeekends time_intervals: - weekdays: [saturday, sunday]
默认情况下,报警资源的配置文件需要放置在
provisioning/alerting
目录中。将
alerting.yaml
文件保存在名为alerting
的目录中,因为接下来我们将把此alerting
目录提供给 Grafana pod 的/etc/grafana/provisioning
文件夹。首先验证正在运行的 Grafana pod 中的预配目录内容。
kubectl exec -n my-grafana <pod_name> -- ls /etc/grafana/provisioning/
kubectl exec -n my-grafana <pod_name> -- ls /etc/grafana/provisioning/alerting
由于
alerting
文件夹尚不可用,最后一个命令应输出No such file or directory
错误。将本地
alerting
目录复制到 Grafana pod 中的/etc/grafana/provisioning/
。kubectl cp alerting my-grafana/<pod_name>:/etc/grafana/provisioning/
您可以遵循相同的过程,通过提供以下文件夹来预配其他 Grafana 资源
provisioning/dashboards
provisioning/datasources
provisioning/plugins
验证正在运行的 Grafana pod 中的
alerting
目录是否包含alerting.yaml
文件。kubectl exec -n my-grafana <pod_name> -- ls /etc/grafana/provisioning/alerting
重新启动 Grafana pod 以预配资源。
kubectl rollout restart -n my-grafana deployment --selector=app=grafana
请注意,
rollout restart
会终止先前的 pod 并扩展一个新的 pod。当旧 pod 终止时,您可能需要在新的 pod 中启用端口转发。有关说明,请参阅本指南中有关端口转发的先前部分。验证 Grafana 资源是否已在 Grafana 实例中正确预配。
故障排除
本节包含在 Kubernetes 上部署 Grafana 时可能有所帮助的故障排除技巧。
收集日志
在故障排除时,查看 Grafana 服务器日志非常重要。
要查看 Grafana 日志,请运行以下命令
# dump Pod logs for a Deployment (single-container case) kubectl logs --namespace=my-grafana deploy/grafana
如果部署中运行了多个容器,请运行以下命令仅获取 Grafana 部署的日志
# dump Pod logs for a Deployment (multi-container case) kubectl logs --namespace=my-grafana deploy/grafana -c grafana
有关访问 Kubernetes 应用日志的更多信息,请参阅Pod和Deployment。
将日志级别提高到 debug 模式
默认情况下,Grafana 日志级别设置为info
,但您可以将其提高到debug
模式,以获取诊断和解决问题所需的信息。有关 Grafana 日志级别的更多信息,请参阅配置日志。
以下示例使用 Kubernetes ConfigMap,它是一个 API 对象,用于以键值对存储非机密数据。有关更多信息,请参阅Kubernetes ConfigMap 概念。
创建一个空文件,命名为
grafana.ini
并添加以下内容[log] ; # Either "debug", "info", "warn", "error", "critical", default is "info" ; # we change from info to debug level level = debug
此示例添加了配置文件中的日志部分。您可以参考配置 Grafana文档,查看所有默认配置设置。
要通过 ConfigMap 对象将配置文件添加到 Kubernetes 集群中,请运行以下命令
kubectl create configmap ge-config --from-file=/path/to/file/grafana.ini --namespace=my-grafana
要验证 ConfigMap 对象创建,请运行以下命令
kubectl get configmap --namespace=my-grafana
打开
grafana.yaml
文件,并在 Deployment 部分提供自定义配置的挂载路径 (/etc/grafana
),并引用新创建的 ConfigMap。--- apiVersion: apps/v1 kind: Deployment metadata: labels: app: grafana name: grafana # the rest of the code remains the same. ... .... ... requests: cpu: 250m memory: 750Mi volumeMounts: - mountPath: /var/lib/grafana name: grafana-pv # This is to mount the volume for the custom configuration - mountPath: /etc/grafana name: ge-config volumes: - name: grafana-pv persistentVolumeClaim: claimName: grafana-pvc # This is to provide the reference to the ConfigMap for the volume - name: ge-config configMap: name: ge-config
使用以下 kubectl apply 命令部署 manifest
kubectl apply -f grafana.yaml --namespace=my-grafana
要验证状态,请运行以下命令
# first check the rollout status kubectl rollout status deployment grafana --namespace=my-grafana # then check the deployment and configMap information kubectl get all --namespace=my-grafana
要验证它,请使用提供的 IP:Port 在浏览器中访问 Grafana UI
Grafana 登录页面将出现。
要登录 Grafana,用户名为
admin
,密码也为admin
。导航到服务器管理 > 设置,然后搜索日志。
您应该会看到日志级别已设置为 debug 模式。
使用 –dry-run 命令
您可以使用 Kubernetes --dry-run
命令向修改端点发送请求,并确定该请求是否会成功。
执行 dry run 有助于在错误或意外后果发生之前捕获它们。 有关更多信息,请参阅Kubernetes Dry-run。
示例
以下示例展示了当您对 grafana.yaml
进行更改(例如使用新镜像版本或添加新标签)并想确定是否存在语法错误或冲突时如何执行 dry run。
要执行 dry run,请运行以下命令
kubectl apply -f grafana.yaml --dry-run=server --namespace=grafana
如果没有错误,输出将类似于此
persistentvolumeclaim/grafana-pvc unchanged (server dry run)
deployment.apps/grafana unchanged (server dry run)
service/grafana unchanged (server dry run)
如果存在错误或警告,您将在终端中看到它们。
移除 Grafana
如果您想移除任何 Grafana 部署对象,请使用 kubectl delete command
。
如果您想移除完整的 Grafana 部署,请运行以下命令
kubectl delete -f grafana.yaml --namespace=my-grafana
此命令删除 deployment、persistentvolumeclaim 和 service 对象。
要删除 ConfigMap,请运行以下命令
kubectl delete configmap ge-config --namespace=my-grafana
在 Kubernetes 上部署 Grafana Enterprise
部署 Grafana Enterprise 的过程与前述过程几乎相同,只是需要额外的步骤来添加您的许可证文件。
获取 Grafana Enterprise 许可证
要运行 Grafana Enterprise,您需要一个有效的许可证。要获取许可证,请联系 Grafana Labs 代表。本主题假设您在 license.jwt
文件中拥有一个有效的许可证。将您的许可证与一个 URL 关联起来,以便稍后在本主题中使用。
创建许可证 secret
使用以下命令从您的许可证文件创建 Kubernetes secret
kubectl create secret generic ge-license --from-file=/path/to/your/license.jwt
创建 Grafana Enterprise 配置
创建一个名为
grafana.ini
的 Grafana 配置文件将以下 YAML 内容粘贴到您创建的文件中
[enterprise] license_path = /etc/grafana/license/license.jwt [server] root_url =/your/license/root/url
将
root_url
字段更新为您获得的许可证关联的 URL。
为 Grafana Enterprise 配置创建 Configmap
使用以下命令从您的 grafana.ini
文件创建 Kubernetes Configmap
kubectl create configmap ge-config --from-file=/path/to/your/grafana.ini
创建 Grafana Enterprise Kubernetes manifest
创建一个
grafana.yaml
文件,并将以下内容复制并粘贴到其中。以下 YAML 与 Grafana 安装的 YAML 相同,只是增加了对包含您的 Grafana 配置文件和许可证 secret 的 Configmap 的引用。
--- apiVersion: v1 kind: PersistentVolumeClaim metadata: name: grafana-pvc spec: accessModes: - ReadWriteOnce resources: requests: storage: 1Gi --- apiVersion: apps/v1 kind: Deployment metadata: labels: app: grafana name: grafana spec: selector: matchLabels: app: grafana template: metadata: labels: app: grafana spec: securityContext: fsGroup: 472 supplementalGroups: - 0 containers: - image: grafana/grafana-enterprise:latest imagePullPolicy: IfNotPresent name: grafana ports: - containerPort: 3000 name: http-grafana protocol: TCP readinessProbe: failureThreshold: 3 httpGet: path: /robots.txt port: 3000 scheme: HTTP initialDelaySeconds: 10 periodSeconds: 30 successThreshold: 1 timeoutSeconds: 2 resources: limits: memory: 4Gi requests: cpu: 100m memory: 2Gi volumeMounts: - mountPath: /var/lib/grafana name: grafana-pv - mountPath: /etc/grafana name: ge-config - mountPath: /etc/grafana/license name: ge-license volumes: - name: grafana-pv persistentVolumeClaim: claimName: grafana-pvc - name: ge-config configMap: name: ge-config - name: ge-license secret: secretName: ge-license --- apiVersion: v1 kind: Service metadata: name: grafana spec: ports: - port: 3000 protocol: TCP targetPort: http-grafana selector: app: grafana sessionAffinity: None type: LoadBalancer
注意
如果您在 Service 中使用
LoadBalancer
,并且取决于您的云平台和网络配置,这样做可能会将您的 Grafana 实例暴露给互联网。为了消除此风险,请使用ClusterIP
将访问限制在部署 Grafana 的集群内部。要将 manifest 发送到 Kubernetes API Server,请运行以下命令:
kubectl apply -f grafana.yaml
要验证 manifest 是否已发送,请运行以下命令:
kubectl port-forward service/grafana 3000:3000
在浏览器中导航到
localhost:3000
。您应该会看到 Grafana 登录页面。
使用
admin
作为用户名和密码登录。要验证您使用的是 Enterprise 许可证,请滚动到页面底部,您应该会看到
Enterprise (Licensed)
。