如何在Kubernetes上使用InfluxDB及其Python客户端

导航至

Saiyam Pathak本文最初发表在The New Stack,由Saiyam Pathak撰写,他是InfluxAce,同时也是Civo Cloud的技术传教士。

在本教程中,我们将讨论InfluxDB及其Python客户端。我们将在Kubernetes集群内部署InfluxDB,然后使用InfluxDB Python客户端向InfluxDB发送数据。

您将学习到什么?

  • 如何以快速启动的方式将InfluxDB部署到Kubernetes集群中
  • 如何使用InfluxDB Python客户端

先决条件

  • 您控制的一个Kubernetes集群。我们将利用Civo的超级快速托管K3s服务快速进行实验。如果您还没有账户,现在注册beta版以利用快速部署时间和每月70美元的免费额度。或者,您也可以使用任何其他Kubernetes集群。
  • 安装并设置kubectl,并下载您集群的kubeconfig文件。

InfluxDB Python Kubernetes

确保您可以通过运行以下命令连接到您的Kubernetes集群:

kubectl get nodes
NAME               STATUS   ROLES    AGE   VERSION
kube-master-18e1   Ready    master   8h    v1.18.6+k3s1
kube-node-4e70     Ready    <none>   8h    v1.18.6+k3s1
kube-node-d58a     Ready    <none>   8h    v1.18.6+k3s1

您应该会看到集群中节点的名称。

开始使用InfluxDB

克隆存储库:https://github.com/saiyam1814/pyconf.git

git clone https://github.com/saiyam1814/pyconf.git
cd pyconf/deploy
# Apply the influx.yaml file
kubectl create -f influx.yaml
namespace/influxdb created
statefulset.apps/influxdb created
service/influxdb created

上述脚本为InfluxDB版本2.0.1创建了命名空间、有状态集和服务的配置。

现在我们将创建ingress,为此我们将修改ing.yaml文件并输入已创建集群的DNS名称。您可以从仪表板中获取DNS名称。

influxdb create ingress

在ing.yaml的host部分中,指向influx.{DNS NAME}。

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
 name: influxdb
 namespace: influxdb
spec:
 rules:
 - host: influxdb.360dfac7-2adc-4e60-bdcb-0b7a283ac3c8.k8s.civo.com
   http:
     paths:
     - backend:
         serviceName: influxdb
         servicePort: 8086
kubectl create -f ing.yml
ingress.extensions/influxdb created
kubectl get all -n influxdb
NAME             READY   STATUS    RESTARTS   AGE
pod/influxdb-0   1/1     Running   0          6m45s
NAME               TYPE        CLUSTER-IP        EXTERNAL-IP   PORT(S)    AGE
service/influxdb   ClusterIP   192.168.145.255   <none>        8086/TCP   6m45s
NAME                        READY   AGE
statefulset.apps/influxdb   1/1     6m46s

kubectl get ing -n influxdb
'NAME       CLASS    HOSTS                                                        ADDRESS         PORTS   AGE
influxdb   <none>   influxdb.360dfac7-2adc-4e60-bdcb-0b7a283ac3c8.k8s.civo.com   91.211.153.65   80      55s

导航到主机地址

influxdb 2 welcome page

influxdb setup initial user

influxdb collect data

现在,在高级部分从令牌中选择并复制生成的令牌——因为它将需要通过Python客户端连接到InfluxDB。

influxdb copy token

influxdb load data

下一步

从令牌创建Kubernetes Secret

kubectl create secret generic influx --from-literal=token="qWpu90WO31r02miedaP7-BXG9hmrtfBCPgncqu3PsU-PzZZ3jrg7eC9RE2yZzLurhNlk8tr_maKYE3zpk1GJ2A=="
secret/influx created

为Ingress主机地址创建配置映射

kubectl create configmap host --from-literal=host="influxdb.360dfac7-2adc-4e60-bdcb-0b7a283ac3c8.k8s.civo.com"
configmap/host created

从部署文件夹创建Daemonset

kubectl create -f ds.yaml
daemonset.apps/pyconf-demo created
kubectl get pods
NAME                READY   STATUS    RESTARTS   AGE
pyconf-demo-dq5c9   1/1     Running   0          40m
pyconf-demo-lbxww   1/1     Running   0          40m
pyconf-demo-q65ps   1/1     Running   0          86s

从InfluxDB UI查看

viewing influxdb ui

了解通过其Python客户端连接到InfluxDB并写入点的过程

from influxdb_client import InfluxDBClient, Point, WritePrecision
from datetime import datetime
from influxdb_client.client.write_api import SYNCHRONOUS
import schedule
import time
import socket
import os
def influx():
   print("starting")
   org = "demo"
   bucket = "demo"
   client = InfluxDBClient(url="{}".format(os.environ.get('host')), token="{}".format(os.environ.get('token')))
   meminfo = dict((i.split()[0].rstrip(':'),int(i.split()[1])) for i in open('/proc/meminfo').readlines())
   freemem = meminfo['MemFree'] / 1024 /1024
   write_api = client.write_api(write_options=SYNCHRONOUS)
   point = Point("free_mem").tag("host", socket.gethostname()).field("free_memory_Gb", freemem ).time(datetime.utcnow(), WritePrecision.NS)
   write_api.write(bucket, org, point)
schedule.every(5).seconds.do(influx)  
while 1:
   schedule.run_pending()
   time.sleep(1)
  • 导入 influxdb-client.
  • Org: 对应于数据需要推送的org。
  • 桶:对应数据需要推送的桶。
  • 客户端:通过提供主机和令牌创建的连接。
  • Freemem:获取主机的空闲内存(以Gb为单位)。
  • client.write_api 用于写入 InfluxDB。
  • 点:将要创建测量 free_mem,标记 host 和字段 free_mem_Gb 的实际点。
  • write_api.write(bucket,org,point)用于向数据库插入数据。
  • 最后一节使其每5秒运行一次。

用例

您可能有一些脚本,可以捕获一些数据,或者进行一定级别的处理,然后创建数据,然后可以通过 Python 客户端将其发送到 InfluxDB(对于此特定用例)。有很多受支持的客户端库可以用来发送数据。

总结

我们展示了如何在现有的 K3s Kubernetes 集群上部署 InfluxDB。使用 Python 客户端将数据写入 InfluxDB,然后从 InfluxDB UI 查看数据。