Kubernetes
Kubernetes
1. 环境准备
1.1 准备 Kubernetes 集群
确保拥有一个可用的 Kubernetes 集群(建议最低版本:Kubernetes 1.24),作为部署 IoTDB 集群的基础。
Kubernetes 版本要求:建议版本为 Kubernetes 1.24及以上
IoTDB版本要求:不能低于v1.3.3.2
2. 创建命名空间
2.1 创建命名空间
注意:在执行命名空间创建操作之前,需验证所指定的命名空间名称在 Kubernetes 集群中尚未被使用。如果命名空间已存在,创建命令将无法执行,可能导致部署过程中的错误。
kubectl create ns iotdb-ns2.2 查看命名空间
kubectl get ns3. 创建 PersistentVolume (PV)
3.1 创建 PV 配置文件
PV用于持久化存储IoTDB的ConfigNode 和 DataNode的数据,有几个节点就要创建几个PV。
注:1个ConfigNode和1个DataNode 算2个节点,需要2个PV。
以 3ConfigNode、3DataNode 为例:
- 创建
pv.yaml文件,并复制六份,分别重命名为pv01.yaml~pv06.yaml。
#可新建个文件夹放yaml文件
#创建 pv.yaml 文件语句
touch pv.yaml- 修改每个文件中的
name和path以确保一致性。
pv.yaml 示例:
# pv.yaml
apiVersion: v1
kind: PersistentVolume
metadata:
name: iotdb-pv-01
spec:
capacity:
storage: 10Gi # 存储容量
accessModes: # 访问模式
- ReadWriteOnce
persistentVolumeReclaimPolicy: Retain # 回收策略
# 存储类名称,如果使用本地静态存储storageClassName 不用配置,如果使用动态存储必需设置此项
storageClassName: local-storage
# 根据你的存储类型添加相应的配置
hostPath: # 如果是使用本地路径
path: /data/k8s-data/iotdb-pv-01
type: DirectoryOrCreate # 这行不配置就要手动创建文件夹3.2 应用 PV 配置
kubectl apply -f pv01.yaml
kubectl apply -f pv-02.yaml
...3.3 查看 PV
kubectl get pv
3.4 手动创建文件夹
如果yaml里的hostPath-type未配置,需要手动创建对应的文件夹
在所有 Kubernetes 节点上创建对应的文件夹:
mkdir -p /data/k8s-data/iotdb-pv-01
mkdir -p /data/k8s-data/iotdb-pv-02
...4. 安装 Helm
安装Helm步骤请参考Helm官网
5. 配置IoTDB的Helm Chart
5.1 克隆 IoTDB Kubernetes 部署代码
下载 Helm : 源码
如果遇到代理问题,取消代理设置:
git clone报错如下,说明是配置了代理,需要把代理关掉 fatal: unable to access 'https://github.com/apache/iotdb-extras.git': gnutls_handshake() failed: The TLS connection was non-properly terminated.
unset HTTPS_PROXY5.2 修改 YAML 文件
确保使用的是支持的版本 >=1.3.3.2
values.yaml 示例:
nameOverride: "iotdb"
fullnameOverride: "iotdb" #软件安装后的名称
image:
repository: apache/iotdb
pullPolicy: IfNotPresent
tag: latest #软件所用的仓库和版本
storage:
# 存储类名称,如果使用本地静态存储storageClassName 不用配置,如果使用动态存储必需设置此项
className: local-storage
datanode:
name: datanode
nodeCount: 3 #datanode的节点数量
enableRestService: true
storageCapacity: 10Gi #datanode的可用空间大小
resources:
requests:
memory: 2Gi #datanode的内存初始化大小
cpu: 1000m #datanode的CPU初始化大小
limits:
memory: 4Gi #datanode的最大内存大小
cpu: 1000m #datanode的最大CPU大小
confignode:
name: confignode
nodeCount: 3 #confignode的节点数量
storageCapacity: 10Gi #confignode的可用空间大小
resources:
requests:
memory: 512Mi #confignode的内存初始化大小
cpu: 1000m #confignode的CPU初始化大小
limits:
memory: 1024Mi #confignode的最大内存大小
cpu: 2000m #confignode的最大CPU大小
configNodeConsensusProtocolClass: org.apache.iotdb.consensus.ratis.RatisConsensus
schemaReplicationFactor: 3
schemaRegionConsensusProtocolClass: org.apache.iotdb.consensus.ratis.RatisConsensus
dataReplicationFactor: 2
dataRegionConsensusProtocolClass: org.apache.iotdb.consensus.iot.IoTConsensus6. 安装 IoTDB
6.1 安装 IoTDB
# 进入文件夹
cd iotdb-cluster-k8s/helm
# 安装iotdb
helm install iotdb ./ -n iotdb-ns6.2 查看 Helm 安装列表
# helm list
helm list -n iotdb-ns6.3 查看 Pods
# 查看 iotdb的pods
kubectl get pods -n iotdb-ns -o wide执行命令后,输出了带有confignode和datanode标识的各3个Pods,,总共6个Pods,即表明安装成功;需要注意的是,并非所有Pods都处于Running状态,未激活的datanode可能会持续重启,但在激活后将恢复正常。
6.4 发现故障的排除方式
# 查看k8s的创建log
kubectl get events -n iotdb-ns
watch kubectl get events -n iotdb-ns
# 获取详细信息
kubectl describe pod confignode-0 -n iotdb-ns
kubectl describe pod datanode-0 -n iotdb-ns
# 查看confignode日志
kubectl logs -n iotdb-ns confignode-0 -f7. 验证 IoTDB
7.1 查看命名空间内的 Pods 状态
查看iotdb-ns命名空间内的IP、状态等信息,确定全部运行正常
kubectl get pods -n iotdb-ns -o wide
# 结果示例:
# NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
# confignode-0 1/1 Running 0 75m 10.20.187.14 a87 <none> <none>
# confignode-1 1/1 Running 0 75m 10.20.191.75 a88 <none> <none>
# confignode-2 1/1 Running 0 75m 10.20.187.16 a87 <none> <none>
# datanode-0 1/1 Running 10 (5m54s ago) 75m 10.20.191.74 a88 <none> <none>
# datanode-1 1/1 Running 10 (5m42s ago) 75m 10.20.187.15 a87 <none> <none>
# datanode-2 1/1 Running 10 (5m55s ago) 75m 10.20.191.76 a88 <none> <none>7.2 查看命名空间内的端口映射情况
kubectl get svc -n iotdb-ns
# 结果示例:
# NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
# confignode-svc NodePort 10.10.226.151 <none> 80:31026/TCP 7d8h
# datanode-svc NodePort 10.10.194.225 <none> 6667:31563/TCP 7d8h
# jdbc-balancer LoadBalancer 10.10.191.209 <pending> 6667:31895/TCP 7d8h7.3 在任意服务器启动 CLI 脚本验证 IoTDB 集群状态
端口即jdbc-balancer的端口,服务器为k8s任意节点的IP
start-cli.sh -h 172.20.31.86 -p 31895
start-cli.sh -h 172.20.31.87 -p 31895
start-cli.sh -h 172.20.31.88 -p 31895
8. 扩容
8.1 新增pv
新增pv,必须有可用的pv才可以扩容。

注意:DataNode重启后无法加入集群
原因:配置了静态存储的 hostPath 模式,并通过脚本修改了 iotdb-system.properties 文件,将 dn_data_dirs 设为 /iotdb6/iotdb_data,/iotdb7/iotdb_data,但未将默认存储路径 /iotdb/data 进行外挂,导致重启时数据丢失。
解决方案:是将 /iotdb/data 目录也进行外挂操作,且 ConfigNode 和 DataNode 均需如此设置,以确保数据完整性和集群稳定性。
8.2 扩容confignode
示例:3 confignode 扩容为 4 confignode
修改iotdb-cluster-k8s/helm的values.yaml文件,将confignode的3改成4
helm upgrade iotdb . -n iotdb-ns
8.3 扩容datanode
示例:3 datanode 扩容为 4 datanode
修改iotdb-cluster-k8s/helm的values.yaml文件,将datanode的3改成4
helm upgrade iotdb . -n iotdb-ns8.4 验证IoTDB状态
kubectl get pods -n iotdb-ns -o wide
# NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
# confignode-0 1/1 Running 0 75m 10.20.187.14 a87 <none> <none>
# confignode-1 1/1 Running 0 75m 10.20.191.75 a88 <none> <none>
# confignode-2 1/1 Running 0 75m 10.20.187.16 a87 <none> <none>
# datanode-0 1/1 Running 10 (5m54s ago) 75m 10.20.191.74 a88 <none> <none>
# datanode-1 1/1 Running 10 (5m42s ago) 75m 10.20.187.15 a87 <none> <none>
# datanode-2 1/1 Running 10 (5m55s ago) 75m 10.20.191.76 a88 <none> <none>
# datanode-3 1/1 Running 10 (5m55s ago) 75m 10.20.191.76 a88 <none> <none>