如何在Kubernetes上使用InfluxDB及其Python客户端
作者:社区 / 产品,用例,开发者
2021年1月7日
导航至
本文最初发表在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文件。
确保您可以通过运行以下命令连接到您的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名称。
在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
导航到主机地址
现在,在高级部分从令牌中选择并复制生成的令牌——因为它将需要通过Python客户端连接到InfluxDB。
下一步
从令牌创建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查看
了解通过其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 查看数据。