K8S对接分布式文件系统Ozone(基于HDFS的文件系统)
前言K8S通过标准的CSI实现容器的持久化,目前很多的存储都有现成的CSI,如NFS,GFS,CEPH等。但是HDFS目前为止没有官方的CSI实现,Apache基于HDFS封装的新的分布式文件系统Ozone可以有HDFS文件系统的属性,同时提供了官方CSI。项目需要,故进行了对接尝试,并且实现了透明加解密(TDE)的模式。中间也遇到了一些问题,分享给大家。集群说明整个集群的资源使用私有云上的资源,
前言
K8S通过标准的CSI实现容器的持久化,目前很多的存储都有现成的CSI,如NFS,GFS,CEPH等。但是HDFS目前为止没有官方的CSI实现,Apache基于HDFS封装的新的分布式文件系统Ozone可以有HDFS文件系统的属性,同时提供了官方CSI。项目需要,故进行了对接尝试,并且实现了透明加解密(TDE)的模式。中间也遇到了一些问题,分享给大家。
集群说明
整个集群的资源使用私有云上的资源,故拥有两个IP地址(公有云也是一样),内部IP在同一个VPC内可以通讯,弹性IP实现整个私有云通讯
K8S集群
角色 | 内部IP | 弹性IP |
K8S Master | 10.10.0.160 | 10.228.82.9 |
K8S Worker | 10.10.0.135 | 10.228.82.232 |
K8S Worker | 10.10.0.196 | 10.228.82.36 |
PS: K8S集群的搭建这里就不在赘述了,集群的版本不要太新,目前Ozone CSI的适配没有到新版本。 1.18.X为优,我的集群版本为: 1.18.18
Ozone集群,每个角色的说明参考: Documentation for Apache Ozone
角色 | 内部IP | 弹性IP | 备注 |
SCM,OM,RECON,S3G | 10.50.0.80 | 10.228.82.233 | 这些角色可以理解为控制节点,验证中为部署为高可用形式 |
DATANODE | 10.50.0.84 | 10.228.82.239 | 节点为3个,实现数据存储的3副本,默认CSI创建的PVC需要3副本,如果没有3个CSI会报错 |
DATANODE | 10.50.0.36 | 10.228.82.156 | |
DATANODE | 10.50.0.88 | 10.228.82.214 |
PS : 当前最新版本为1.1.0
Ozone集群搭建
1. 在所有节点中安装JDK 1.8 可参考: 使用Ansible安装jdk1.8_不羡鸳鸯丶不羡仙的博客-CSDN博客
2. 将ozone的二进制包下载到所有节点的中并解压到/opt/目录下,下载地址为: Apache Downloads
解压后的目录结构如下:
[root@vm10-50-0-80 hadoop]# ls
bin Dockerfile etc libexec LICENSE.txt NOTICE.txt sbin smoketest
compose docs kubernetes licenses logs README.md share tests
[root@vm10-50-0-80 hadoop]# pwd
/opt/hadoop
3. 修改配置文件 路径为: /opt/hadoop/etc/hadoop/ozone-site.xml,配置文件中的IP地址,由于管理角色都在同一个服务器,故IP一致。建议完全按照我的步骤先跑通流程,然后考虑分拆。
所有4个节点上的配置文件都一致,可通过ansible批量部署
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration>
<property><name>ozone.om.address</name><value>10.50.0.80</value></property>
<property><name>ozone.om.http-address</name><value>10.50.0.80:9874</value></property>
<property><name>ozone.scm.names</name><value>10.50.0.80</value></property>
<property><name>ozone.scm.datanode.id.dir</name><value>/data/ozone-data</value></property>
<property><name>ozone.scm.block.client.address</name><value>10.50.0.80</value></property>
<property><name>ozone.metadata.dirs</name><value>/data/ozone-data/metadata</value></property>
<property><name>ozone.scm.client.address</name><value>10.50.0.80</value></property>
<property><name>ozone.replication</name><value>1</value></property>
<property><name>ozone.scm.client.address</name><value>10.50.0.80</value></property>
<property><name>hdds.datanode.dir</name><value>/data/ozone-data/hdds</value></property>
<property><name>ozone.recon.db.dir</name><value>/data/ozone-data/metadata/recon</value></property>
<property><name>ozone.recon.address</name><value>10.50.0.80:9891</value></property>
<property><name>ozone.security.enabled</name><value>false</value></property>
</configuration>
4. 将ozone命令添加到PATH变量中,所有节点都需要操作
export PATH=$PATH:/opt/hadoop/bin/
5. 启动管理角色(SCM,OM,S3G,RECON),SCM服务需要最先启动
a. root登录到SCM角色服务器(10.50.0.80)
b. 初始化SCM并启动scm服务,初始化的操作只需要集群搭建的时候执行一次就可以
ozone scm --init #初始化命令
ozone --daemon start scm
c. 初始化OM并启动om服务,初始化的操作只需要集群搭建的时候执行一次就可以
ozone om --init #初始化命令
ozone --daemon start om
d. 启动S3G与RECON服务
ozone --daemon start s3g #启动s3g服务,提供s3的网关
ozone --daemon start recon #集群整体状态的收集,可以对接prometheus拉取监控指标
6. 启动数据角色节点 ,以下操作需要在所有的DATANODE节点中执行
ozone --daemon start datanode
7. 验证Ozone集群,在任意的节点都可以执行以下命令,可以看到3个数据节点都是 IN_SERVICE,健康状态为: HEALTHY
[root@vm10-50-0-80 hadoop]# ozone admin datanode list
Datanode: 973eb161-682e-4cc6-9f1c-48207b1387d8 (/default-rack/10.50.0.36/10.50.0.36/3 pipelines)
Operational State: IN_SERVICE
Health State: HEALTHY
Related pipelines:
c81e2cc4-e603-4002-b741-5f9edff4e753/THREE/RATIS/OPEN/Leader
48ad502e-3745-449d-99ff-632d67c28d8e/ONE/RATIS/OPEN/Leader
602bd2b9-e0c2-42f7-bf7e-283db7858369/THREE/RATIS/OPEN/Follower
Datanode: f99c4b18-35c4-4885-93a2-8e4441f22c46 (/default-rack/10.50.0.88/10.50.0.88/3 pipelines)
Operational State: IN_SERVICE
Health State: HEALTHY
Related pipelines:
7f477617-9800-4089-8a59-24eeb4c5477b/ONE/RATIS/OPEN/Leader
c81e2cc4-e603-4002-b741-5f9edff4e753/THREE/RATIS/OPEN/Follower
602bd2b9-e0c2-42f7-bf7e-283db7858369/THREE/RATIS/OPEN/Leader
Datanode: 5b5acc23-b121-492d-8ace-f880e55dc3b9 (/default-rack/10.50.0.84/10.50.0.84/3 pipelines)
Operational State: IN_SERVICE
Health State: HEALTHY
Related pipelines:
87602a5c-11f4-4b07-8bf9-dba6acbfb3dc/ONE/RATIS/OPEN/Leader
c81e2cc4-e603-4002-b741-5f9edff4e753/THREE/RATIS/OPEN/Follower
602bd2b9-e0c2-42f7-bf7e-283db7858369/THREE/RATIS/OPEN/Follower
8. 尝试往分布式文件集群中写入文件
ozone sh bucket create /s3v/test
ozone sh key put /s3v/test/Key README.md #README.md为当前目录的一个文件, Key代表在分布式文件系统里面的名称
ozone sh key get /s3v/test/Key README-FROM-Ozone.md #将上传的文件下载为README-FROM-Ozone.md
[root@vm10-50-0-80 hadoop]# ozone sh bucket list /s3v
{
"metadata" : { },
"volumeName" : "s3v",
"name" : "test",
"storageType" : "DISK",
"versioning" : false,
"usedBytes" : 0,
"usedNamespace" : 2,
"creationTime" : "2021-10-07T04:02:25.671Z",
"modificationTime" : "2021-10-07T04:02:25.671Z",
"encryptionKeyName" : null,
"sourceVolume" : null,
"sourceBucket" : null,
"quotaInBytes" : -1,
"quotaInNamespace" : -1
}
[root@vm10-50-0-80 hadoop]# ozone sh key put /s3v/test/Key README.md
[root@vm10-50-0-80 hadoop]# ozone sh key list /s3v/test/
{
"volumeName" : "s3v",
"bucketName" : "test",
"name" : "Key",
"dataSize" : 3812,
"creationTime" : "2021-10-31T12:18:49.345Z",
"modificationTime" : "2021-10-31T12:18:51.064Z",
"replicationType" : "RATIS",
"replicationFactor" : 1
}
#下载文件的命令
[root@vm10-50-0-80 hadoop]# ozone sh key get /s3v/test/Key README-FROM-Ozone.md
K8S中安装Ozone CSI插件
1. 登录master节点,并clone csi的yaml文件
git clone https://gitee.com/kevinliu_CQ/ozone-1-1-0-csi.git
2. 部署csi插件
cd ozone-1-1-0-csi
kubectl apply -f .
3. 检查csi的daemonSet 和Provisioner的已经运行正常
[root@vm10-10-0-160 ozone-docker]# kubectl get po
csi-node-blr8n 2/2 Running 0 5h15m
csi-node-g94hz 2/2 Running 0 5h15m
csi-provisioner-6f7d4778cf-ct9sw 2/2 Running 0 5h16m
4. 创建一个pvc来验证 Ozone的存储
cd pvc-test
kubectl apply -f test-pvc.yaml -f test-pvc-deployment.yaml -f test-pvc-service.yaml
5. 验证pvc和验证容器都运行起来
[root@vm10-10-0-160 pvc-test]# kubectl get pvc
ozone-csi-test-webserver Bound pvc-c4226796-5f9a-41f2-8264-d275eac107b4 100Mi RWO ozone 5h19m
[root@vm10-10-0-160 pvc-test]# kubectl get po
NAME READY STATUS RESTARTS AGE
csi-node-blr8n 2/2 Running 0 5h21m
csi-node-g94hz 2/2 Running 0 5h21m
csi-provisioner-6f7d4778cf-ct9sw 2/2 Running 0 5h21m
ozone-csi-test-webserver-dc48985d5-7gl4h 1/1 Running 0 5h19m
6. 向新开的PVC 写文件
#root登录到ozone集群的SCM节点
[root@vm10-50-0-80 hadoop]# ozone sh bucket list /s3v/
{
"metadata" : { },
"volumeName" : "s3v",
"name" : "test",
"storageType" : "DISK",
"versioning" : false,
"usedBytes" : -268430730,
"usedNamespace" : 3,
"creationTime" : "2021-10-07T04:02:25.671Z",
"modificationTime" : "2021-10-07T04:02:25.671Z",
"encryptionKeyName" : null,
"sourceVolume" : null,
"sourceBucket" : null,
"quotaInBytes" : -1,
"quotaInNamespace" : -1
}
{
"metadata" : { },
"volumeName" : "s3v",
"name" : "pvc-c4226796-5f9a-41f2-8264-d275eac107b4", #新创建的PVC
"storageType" : "DISK",
"versioning" : false,
"usedBytes" : 0,
"usedNamespace" : 2,
"creationTime" : "2021-10-31T07:55:22.561Z",
"modificationTime" : "2021-10-31T07:55:22.561Z",
"encryptionKeyName" : null,
"sourceVolume" : null,
"sourceBucket" : null,
"quotaInBytes" : -1,
"quotaInNamespace" : -1
}
[root@vm10-50-0-80 hadoop]#ozone sh key list /s3v/pvc-c4226796-5f9a-41f2-8264-d275eac107b4/Key README.md
7. 打开服务验证上传的文件是否可以下载
[root@vm10-10-0-160 pvc-test]# kubectl get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
ozone-csi-test-webserver NodePort 10.68.239.159 <none> 8000:30135/TCP 5h26m
PS : 如何在Ozone与Ranger KMS 实现透明加解密(Transparent Data Encryption),我单独列一个文章来写,目前我的机器就是运行的这种模式。
链接如下:
更多推荐
所有评论(0)