Kubernetes
1. 环境准备
1.1 准备 Kubernetes 集群
确保拥有一个可用的 Kubernetes 集群(建议最低版本:Kubernetes 1.24),作为部署 IoTDB 集群的基础。
Kubernetes 版本要求:建议版本为 Kubernetes 1.24及以上
IoTDB版本要求:不能低于v1.3.3.2
2. 创建命名空间
2.1 创建命名空间
注意:在执行命名空间创建操作之前,需验证所指定的命名空间名称在 Kubernetes 集群中尚未被使用。如果命名空间已存在,创建命令将无法执行,可能导致部署过程中的错误。
1. kubectl create ns iotdb-ns
2.2 查看命名空间
1. kubectl get ns
3. 创建 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。
1. #可新建个文件夹放yaml文件
2. #创建 pv.yaml 文件语句
3. touch pv.yaml
- 修改每个文件中的
name和path以确保一致性。
pv.yaml 示例:
1. # pv.yaml
2. apiVersion: v1
3. kind: PersistentVolume
4. metadata:
5. name: iotdb-pv-01
6. spec:
7. capacity:
8. storage: 10Gi # 存储容量
9. accessModes: # 访问模式
10. - ReadWriteOnce
11. persistentVolumeReclaimPolicy: Retain # 回收策略
12. # 存储类名称,如果使用本地静态存储storageClassName 不用配置,如果使用动态存储必需设置此项
13. storageClassName: local-storage
14. # 根据你的存储类型添加相应的配置
15. hostPath: # 如果是使用本地路径
16. path: /data/k8s-data/iotdb-pv-01
17. type: DirectoryOrCreate # 这行不配置就要手动创建文件夹
3.2 应用 PV 配置
1. kubectl apply -f pv01.yaml
2. kubectl apply -f pv-02.yaml
3. ...
3.3 查看 PV
1. kubectl get pv

3.4 手动创建文件夹
如果yaml里的hostPath-type未配置,需要手动创建对应的文件夹
在所有 Kubernetes 节点上创建对应的文件夹:
1. mkdir -p /data/k8s-data/iotdb-pv-01
2. mkdir -p /data/k8s-data/iotdb-pv-02
3. ...
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.
1. unset HTTPS_PROXY
5.2 修改 YAML 文件
确保使用的是支持的版本 >=1.3.3.2
values.yaml 示例:
1. nameOverride: "iotdb"
2. fullnameOverride: "iotdb" #软件安装后的名称
4. image:
5. repository: apache/iotdb
6. pullPolicy: IfNotPresent
7. tag: latest #软件所用的仓库和版本
9. storage:
10. # 存储类名称,如果使用本地静态存储storageClassName 不用配置,如果使用动态存储必需设置此项
11. className: local-storage
13. datanode:
14. name: datanode
15. nodeCount: 3 #datanode的节点数量
16. enableRestService: true
17. storageCapacity: 10Gi #datanode的可用空间大小
18. resources:
19. requests:
20. memory: 2Gi #datanode的内存初始化大小
21. cpu: 1000m #datanode的CPU初始化大小
22. limits:
23. memory: 4Gi #datanode的最大内存大小
24. cpu: 1000m #datanode的最大CPU大小
26. confignode:
27. name: confignode
28. nodeCount: 3 #confignode的节点数量
29. storageCapacity: 10Gi #confignode的可用空间大小
30. resources:
31. requests:
32. memory: 512Mi #confignode的内存初始化大小
33. cpu: 1000m #confignode的CPU初始化大小
34. limits:
35. memory: 1024Mi #confignode的最大内存大小
36. cpu: 2000m #confignode的最大CPU大小
37. configNodeConsensusProtocolClass: org.apache.iotdb.consensus.ratis.RatisConsensus
38. schemaReplicationFactor: 3
39. schemaRegionConsensusProtocolClass: org.apache.iotdb.consensus.ratis.RatisConsensus
40. dataReplicationFactor: 2
41. dataRegionConsensusProtocolClass: org.apache.iotdb.consensus.iot.IoTConsensus
6. 安装 IoTDB
6.1 安装 IoTDB
1. # 进入文件夹
2. cd iotdb-cluster-k8s/helm
4. # 安装iotdb
5. helm install iotdb ./ -n iotdb-ns
6.2 查看 Helm 安装列表
1. # helm list
2. helm list -n iotdb-ns
6.3 查看 Pods
1. # 查看 iotdb的pods
2. kubectl get pods -n iotdb-ns -o wide
执行命令后,输出了带有confignode和datanode标识的各3个Pods,,总共6个Pods,即表明安装成功;需要注意的是,并非所有Pods都处于Running状态,未激活的datanode可能会持续重启,但在激活后将恢复正常。
6.4 发现故障的排除方式
1. # 查看k8s的创建log
2. kubectl get events -n iotdb-ns
3. watch kubectl get events -n iotdb-ns
5. # 获取详细信息
6. kubectl describe pod confignode-0 -n iotdb-ns
7. kubectl describe pod datanode-0 -n iotdb-ns
9. # 查看confignode日志
10. kubectl logs -n iotdb-ns confignode-0 -f
7. 验证 IoTDB
7.1 查看命名空间内的 Pods 状态
查看iotdb-ns命名空间内的IP、状态等信息,确定全部运行正常
1. kubectl get pods -n iotdb-ns -o wide
3. # 结果示例:
4. # NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
5. # confignode-0 1/1 Running 0 75m 10.20.187.14 a87 <none> <none>
6. # confignode-1 1/1 Running 0 75m 10.20.191.75 a88 <none> <none>
7. # confignode-2 1/1 Running 0 75m 10.20.187.16 a87 <none> <none>
8. # datanode-0 1/1 Running 10 (5m54s ago) 75m 10.20.191.74 a88 <none> <none>
9. # datanode-1 1/1 Running 10 (5m42s ago) 75m 10.20.187.15 a87 <none> <none>
10. # datanode-2 1/1 Running 10 (5m55s ago) 75m 10.20.191.76 a88 <none> <none>
7.2 查看命名空间内的端口映射情况
1. kubectl get svc -n iotdb-ns
3. # 结果示例:
4. # NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
5. # confignode-svc NodePort 10.10.226.151 <none> 80:31026/TCP 7d8h
6. # datanode-svc NodePort 10.10.194.225 <none> 6667:31563/TCP 7d8h
7. # jdbc-balancer LoadBalancer 10.10.191.209 <pending> 6667:31895/TCP 7d8h
7.3 在任意服务器启动 CLI 脚本验证 IoTDB 集群状态
端口即jdbc-balancer的端口,服务器为k8s任意节点的IP
1. start-cli.sh -h 172.20.31.86 -p 31895
2. start-cli.sh -h 172.20.31.87 -p 31895
3. 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
1. helm upgrade iotdb . -n iotdb-ns

8.3 扩容datanode
示例:3 datanode 扩容为 4 datanode
修改iotdb-cluster-k8s/helm的values.yaml文件,将datanode的3改成4
1. helm upgrade iotdb . -n iotdb-ns
8.4 验证IoTDB状态
1. kubectl get pods -n iotdb-ns -o wide
3. # NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
4. # confignode-0 1/1 Running 0 75m 10.20.187.14 a87 <none> <none>
5. # confignode-1 1/1 Running 0 75m 10.20.191.75 a88 <none> <none>
6. # confignode-2 1/1 Running 0 75m 10.20.187.16 a87 <none> <none>
7. # datanode-0 1/1 Running 10 (5m54s ago) 75m 10.20.191.74 a88 <none> <none>
8. # datanode-1 1/1 Running 10 (5m42s ago) 75m 10.20.187.15 a87 <none> <none>
9. # datanode-2 1/1 Running 10 (5m55s ago) 75m 10.20.191.76 a88 <none> <none>
10. # datanode-3 1/1 Running 10 (5m55s ago) 75m 10.20.191.76 a88 <none> <none>
