使用GlusterFS和Heketi的Kubernetes和OpenShift动态卷配置

时间:2020-02-23 14:31:46  来源:igfitidea点击:

欢迎来到我们的教程,该教程为Kubernetes/OpenShift集群使用GlusterFS和Heketi设置持久卷动态预配置。 GlusterFS是一个免费的开源可扩展网络文件系统,适用于数据密集型任务,例如云存储和媒体流。它利用常见的现成硬件。在我的设置中,我选择在Kubernetes节点上将GlusterFS部署为超融合服务。这将释放Kubernetes中动态预配置的持久性GlusterFS卷的功能。

很好地使用gluster-kubernetes项目,该项目为Kubernetes管理员提供了一种机制,可以轻松地将GlusterFS作为本机存储服务部署到现有Kubernetes集群上。其中与Kubernetes中的任何其他应用程序一样,对GlusterFS进行管理和编排。 heketi是用于GlusterFS的RESTful卷管理接口。它允许我们使用API创建和管理Gluster卷。

基础设施要求

以下是设置的基本要求。

必须至少有三个节点每个节点必须至少连接一个原始块设备以供heketi使用每个节点必须为GlusterFS通信打开以下端口:2222用于GlusterFS pod sshd,24007用于GlusterFS Daemon,24008用于GlusterFS Management,49152至在主机上为每个创建的砖块创建49251.必须加载以下内核模块:dm_snapshotdm_mirrordm_thin_pool每个节点都要求mount.glusterfs命令可用。节点上安装的GlusterFS客户端版本应尽可能接近服务器的版本。

设置Kubernetes/OpenShift集群

该设置假设我们有一个正在运行的Kubernetes/OpenShift(OKD)集群。请参阅我们的教程,以了解如何快速启动集群以用于测试/生产。

使用Ansible和Kubespray部署生产就绪的Kubernetes集群

如何使用Weave Net CNI在Ubuntu 18.04上设置3节点Kubernetes集群

在所有节点上安装glusterfs /配置防火墙

如果我们使用的是基于Red Hat的Linux发行版,请安装提供了mount.glusterfs命令的glusterfs-fuse软件包。

sudo yum -y install glusterfs-fuse

对于Ubuntu/Debian:

sudo apt-get install glusterfs-client

加载所需的所有内核模块

for i in dm_snapshot dm_mirror dm_thin_pool; do sudo modprobe $i; done

检查模块是否已加载。

$sudo lsmod |  egrep 'dm_snapshot|dm_mirror|dm_thin_pool'
dm_thin_pool           66358  0 
dm_persistent_data     75269  1 dm_thin_pool
dm_bio_prison          18209  1 dm_thin_pool
dm_mirror              22289  0 
dm_region_hash         20813  1 dm_mirror
dm_log                 18411  2 dm_region_hash,dm_mirror
dm_snapshot            39103  0 
dm_bufio               28014  2 dm_persistent_data,dm_snapshot
dm_mod                124461  5 dm_log,dm_mirror,dm_bufio,dm_thin_pool,dm_snapshot

检查安装的版本。

$glusterfs --version
glusterfs 3.12.2

同时在防火墙CentOS/RHEL/Fedora上打开所需的端口

for i in 2222 24007 24008 49152-49251; do
  sudo firewall-cmd --add-port=${i}/tcp --permanent
done
sudo firewall-cmd --reload

检查Kubernetes集群状态

通过确保集群中的所有节点均已就绪来验证Kubernetes的安装:

$kubectl  get nodes
NAME       STATUS   ROLES    AGE    VERSION
master01   Ready    master   146m   v1.15.3
worker01   Ready    <none>   146m   v1.15.3
worker02   Ready    <none>   146m   v1.15.3
worker03   Ready    <none>   146m   v1.15.3

要查看运行的Kubernetes的确切版本,请使用:

$kubectl version
Client Version: version.Info{Major:"1", Minor:"15", GitVersion:"v1.15.3", GitCommit:"2d3c76f9091b6bec110a5e63777c332469e0cba2", GitTreeState:"clean", BuildDate:"2019-08-19T11:05:50Z", GoVersion:"go1.12.9", Compiler:"gc", Platform:"linux/amd64"}

将辅助原始磁盘添加到节点

每个节点必须至少连接一个原始块设备,以供heketi使用。我已经向我的k8s节点添加了2个50gb的虚拟磁盘。

[worker01 ~]$lsblk 
NAME   MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
vda    253:0    0  20G  0 disk 
└─vda1 253:1    0  20G  0 part /
vdc    253:32   0   50G 0 disk 
vdd    253:48   0   50G 0 disk 

[worker02 ~]$lsblk 
NAME   MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
vda    253:0    0  20G  0 disk 
└─vda1 253:1    0  20G  0 part /
vdc    253:32   0   50G 0 disk 
vdd    253:48   0   50G 0 disk 

[worker03 ~]$lsblk 
NAME   MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
vda    253:0    0  20G  0 disk 
└─vda1 253:1    0  20G  0 part /
vdc    253:32   0   50G 0 disk 
vdd    253:48   0   50G 0 disk

创建拓扑文件

我们必须提供GlusterFS群集拓扑信息,该信息描述GlusterFS群集中存在的节点以及连接到这些节点的块设备,以供heketi使用。

由于我在Kubernetes主节点上运行所有操作,因此让我们从Github中提取gluster-kubernetes。

sudo yum -y install git vim
git clone https://github.com/gluster/gluster-kubernetes.git

复制和编辑拓扑信息模板。

cd gluster-kubernetes/deploy/
cp topology.json.sample topology.json

这就是我的配置。

{
  "clusters": [
    {
      "nodes": [
        {
          "node": {
            "hostnames": {
              "manage": [
                "worker01"
              ],
              "storage": [
                "10.10.1.193"
              ]
            },
            "zone": 1
          },
          "devices": [
            "/dev/vdc",
            "/dev/vdd"
          ]
        },
        {
          "node": {
            "hostnames": {
              "manage": [
                "worker02"
              ],
              "storage": [
                "10.10.1.167"
              ]
            },
            "zone": 1
          },
          "devices": [
            "/dev/vdc",
            "/dev/vdd"
          ]
        },
        {
          "node": {
            "hostnames": {
              "manage": [
                "worker03"
              ],
              "storage": [
                "10.10.1.178"
              ]
            },
            "zone": 1
          },
          "devices": [
            "/dev/vdc",
            "/dev/vdd"
          ]
        }
      ]
    }
  ]
}

什么时候
创建自己的拓扑文件:确保拓扑文件仅列出供heketis使用的块设备。 heketi需要访问将对其进行分区和格式化的整个块设备(例如/dev/vdc,/dev/vdd)。hostnames数组有点误导。 "管理"应该是节点的主机名列表,但是"存储"应该是节点上用于后端存储通信的IP地址列表。

运行部署脚本

创建了拓扑文件后,就可以从具有对Kubernetes群集的管理访问权限的机器上运行gk-deploy脚本。如果不是从主节点运行,请将Kubernetes配置文件复制到~/.kube/config。

熟悉可用的选项。

./gk-deploy -h

常用选项:

-g, --deploy-gluster: Deploy GlusterFS pods on the nodes in the topology that contain brick devices
--ssh-user USER: User to use for SSH commands to GlusterFS nodes. Non-root users must have sudo permissions on the nodes. Default is 'root'
--user-key USER_KEY: Secret string for general heketi users. This is a                                                                  required argument.
-l LOG_FILE, --log-file LOG_FILE: Save all output to the specified file.
-v, --verbose: Verbose output

运行以下命令以开始GlusterFS/Heketi的部署,将MyUserStrongKey和MyAdminStrongKey替换为键值。

./gk-deploy -g \
 --user-key MyUserStrongKey \
 --admin-key MyAdminStrongKey \
 -l /tmp/heketi_deployment.log \
 -v topology.json

按Y键接受安装。

Do you wish to proceed with deployment?

[Y]es, [N]o? [Default: Y]: Y

如果部署成功,我们将收到一条消息:

heketi is now running and accessible via http://10.233.108.5:8080

请参见下面的屏幕截图。

成功部署后,将自动创建Pod,服务和端点。 GlusterFS和heketi现在应该已安装并准备就绪。

$kubectl  get deployments
NAME     READY   UP-TO-DATE   AVAILABLE   AGE
heketi   1/1     1            1           75m

$kubectl get pods
NAME                     READY   STATUS    RESTARTS   AGE
glusterfs-44jvh          1/1     Running   0          110m
glusterfs-j56df          1/1     Running   0          110m
glusterfs-lttb5          1/1     Running   0          110m
heketi-b4b94d59d-bqmpz   1/1     Running   0          76m

$kubectl  get services
NAME                       TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)    AGE
heketi                     ClusterIP   10.233.42.58    <none>        8080/TCP   76m
heketi-storage-endpoints   ClusterIP   10.233.41.189   <none>        1/TCP      76m
kubernetes                 ClusterIP   10.233.0.1      <none>        443/TCP    127m

$kubectl get endpoints
NAME                       ENDPOINTS                                   AGE
heketi                     10.233.108.5:8080                           76m
heketi-storage-endpoints   10.10.1.167:1,10.10.1.178:1,10.10.1.193:1   77m
kubernetes                 10.10.1.119:6443                            127m

安装并使用heketi-cli与GlusterFS进行交互

heketi-cli用于与Kubernetes集群上部署的GlusterFS进行交互。下载最新版本并将二进制文件放入PATH。

curl -s https://api.github.com/repos/heketi/heketi/releases/latest \
  | grep browser_download_url \
  | grep linux.amd64 \
  | cut -d '"' -f 4 \
  | wget -qi 

提取下载的存档文件这将同时具有客户端和服务器。

for i in `ls | grep heketi | grep .tar.gz`; do tar xvf $i; done

将heketi-cli复制到/usr/local/bin目录。

sudo cp ./heketi-client/bin/heketi-cli /usr/local/bin

当任何用户登录到服务器时,我们都应该能够获得heketi-cli版本。

$heketi-cli --version
heketi-cli v9.0.0

我们可以为heketi-cli设置HEKETI_CLI_SERVER环境变量以直接读取它。

export HEKETI_CLI_SERVER=$(kubectl get svc/heketi --template 'http://{{.spec.clusterIP}}:{{(index .spec.ports 0).port}}')

确认变量值:

$echo $HEKETI_CLI_SERVER
http://10.233.108.5:8080

查询集群详细信息

$heketi-cli cluster list --user admin --secret  MyAdminStrongKey
Clusters:
Id:88ed1913182f880ab5eb22ca2f904615 [file][block]

$heketi-cli cluster info 88ed1913182f880ab5eb22ca2f904615
Cluster id: 88ed1913182f880ab5eb22ca2f904615
Nodes:
1efe9a69341b50b00a0b15f6e7d8c797
2d48f05c7d7d8d1e9f4b4963ef8362e3
cf5753b191eca0b67aa48687c08d4e12
Volumes:
e06893fc6e4f5fa23994432a40877889
Block: true

File: true

如果将Heketi管理员用户名和密钥另存为环境变量,则无需传递这些选项。

$export HEKETI_CLI_USER=admin
$export HEKETI_CLI_KEY=MyAdminStrongKey
$heketi-cli cluster list
Clusters:
Id:5c94db92049afc5ec53455d88f55f6bb [file][block]

$heketi-cli cluster info 5c94db92049afc5ec53455d88f55f6bb
Cluster id: 5c94db92049afc5ec53455d88f55f6bb
Nodes:
3bd2d62ea6b8b8c87ca45037c7080804
a795092bad48ed91be962c6a351cbf1b
e98fd47bb4811f7c8adaeb572ca8823c
Volumes:
119c23455c894c33e968a1047b474af2
Block: true

File: true

$ heketi-cli node list
Id:75b2696a9e142e6900ee9fd2d1eb56b6     Cluster:23800e4b6bdeebaec4f6c45b17cabf55
Id:9ca47f98eaa60f0e734ab628897160fc     Cluster:23800e4b6bdeebaec4f6c45b17cabf55
Id:c43023282eef0f10d4109c68bcdf0f9d     Cluster:23800e4b6bdeebaec4f6c45b17cabf55

查看拓扑信息:

$heketi-cli topology info

Cluster Id: 698754cfaf9642b451c4671f96c46a0b

    File:  true
    Block: true

    Volumes:

    Nodes:

        Node Id: 39e8fb3b09ccfe47d1d3f2d8e8b426c8
        State: online
        Cluster Id: 698754cfaf9642b451c4671f96c46a0b
        Zone: 1
        Management Hostnames: worker03
        Storage Hostnames: 10.10.1.178
        Devices:

        Node Id: b9c3ac6737d27843ea0ce69a366de48c
        State: online
        Cluster Id: 698754cfaf9642b451c4671f96c46a0b
        Zone: 1
        Management Hostnames: worker01
        Storage Hostnames: 10.10.1.193
        Devices:

        Node Id: c94636a003af0ca82e7be6962149869b
        State: online
        Cluster Id: 698754cfaf9642b451c4671f96c46a0b
        Zone: 1
        Management Hostnames: worker02
        Storage Hostnames: 10.10.1.167
        Devices:

创建用于动态配置的StorageClass。

$vim gluster-storage-class.yaml 
--
apiVersion: storage.k8s.io/v1beta1
kind: StorageClass
metadata:
  name: glusterfs-storage
provisioner: kubernetes.io/glusterfs
parameters:
  resturl: "http://10.233.108.5:8080"
  restuser: "admin"
  restuserkey: "MyAdminStrongKey"

$kubectl create -f gluster-storage-class.yaml
storageclass.storage.k8s.io/glusterfs-storage created

$kubectl  get storageclass
NAME             PROVISIONER               AGE
glusterfs-storage   kubernetes.io/glusterfs   18s

$kubectl  describe storageclass.storage.k8s.io/glusterfs-storage
Name:                  glusterfs-storage
IsDefaultClass:        No
Annotations:           <none>
Provisioner:           kubernetes.io/glusterfs
Parameters:            resturl=http://10.233.108.5:8080,restuser=admin,restuserkey=MyAdminStrongKey
AllowVolumeExpansion:  <unset>
MountOptions:          <none>
ReclaimPolicy:         Delete
VolumeBindingMode:     Immediate
Events:                <none>

创建PVC

$cat  gluster-pvc.yaml
--
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
 name: glusterpvc01
 annotations:
   volume.beta.kubernetes.io/storage-class: glusterfs-storage
spec:
 accessModes:
  - ReadWriteOnce
 resources:
   requests:
     storage: 1Gi

$kubectl create -f gluster-pvc.yaml
persistentvolumeclaim/glusterpvc01 created

其中:glusterfs-storage是Kubernetes存储类注释和存储类的名称.1Gi是请求的存储量