锐单电子商城 , 一站式电子元器件采购平台!
  • 电话:400-990-0325

实战:Longhorn存储-2022.2.24

时间:2023-02-07 15:00:01 1208tj2连接器

image-20220223125227921

目录

文章目录

    • 目录
    • 实验环境
    • 实验软件
    • 1、Longhorn
    • 2、架构
    • 3、安装
      • 1.依赖
      • 2.部署
      • 3、测试
    • QA
    • 关于我
    • 最后

实验环境

实验环境: 1、win10,vmwrokstation虚机; 2、k8s集群:3台centos7.6 1810虚机,1个master节点,2个node节点    k8s version:v1.22.2    containerd://1.5.5 

实验软件

链接:https://pan.baidu.com/s/1Ou2WCWmsqOFUSLmOZ2orVQ?pwd=lda8
提取码:lda8
2022.2.23-46.Longhorn存储-实验代码

1、Longhorn

在我们学习本地存储之前,NFS共享存储,除了这些存储类型,还有一个块存储,也是 Kubernetes 提供块存储的方案有很多,比如 Ceph RBD,今天我们给大家介绍的是 Rancher 开源的一款 Kubernetes 云原生分布式块存储方案 - Longhorn

使用 Longhorn,可以:

  • 使用 Longhorn 卷作为 Kubernetes 集群中状态应用程序分布式的持久存储
  • 将您的块存储分区为 Longhorn 卷,以便你可以在有或没有云提供商的情况下使用 Kubernetes 卷
  • 复制块存储跨多个节点和数据中心,以提高可用性
  • 存储备份数据 NFS 或 AWS S3 等待外部存储
  • 创建跨集群灾开始创建跨集群灾难恢复卷 Kubernetes 在集群备份中快速恢复主备份 Kubernetes 集群中的数据
  • 调度一卷快照,并将备份调度到 NFS 或 S3 兼容的二级存储
  • 从备份还原卷
  • 持久卷不中断升级 Longhorn

Longhorn 还有独立 UI,可以使用 Helm、kubectl 或 Rancher 安装应用程序目录。

2、架构

Longhorn 在多个节点上存储的多个副本之间,为每个卷创建一个特殊的存储控制器。Longhorn 分为两层:数据平面和控制平面Longhorn Engine 对应数据平面的存储控制器,Longhorn Manager 对应控制平面。

Longhorn Manager 会以 DaemonSet 的形式在 Longhorn 它负责运行集群中的每个节点 Kubernetes 从集群中创建和管理卷,并处理 UI 或 Kubernetes 卷插件的 API 调用,它遵循 Kubernetes 控制器模式。

Longhorn Manager 通过与 Kubernetes APIServer 创造新的通信 Longhorn volume CRD,然后 Longhorn Manager 会一直 Watch APIServer 当它看到它创造了一个新的响应时 Longhorn volume CRD 时,Longhorn Manager 就会去创建一个新的对应卷。当 Longhorn Manager 当需要创建卷时,它会在卷连接的节点上创建一个卷 Longhorn Engine 例子,并在每个节点上创建副本,副本应放置在不同的主机上,以确保最大的可用性。多个数据路径的副本保证了 Longhorn 即使副本或引擎出现问题,卷的高可用性也不会影响所有副本或 Pod 对卷访问。

Longhorn Engine 始终与使用 Longhorn 卷的 Pod 它在存储在多个节点上的多个副本之间同步复制卷。

描述如下图所示 Longhorn 卷、Longhorn Engine、副本实例磁盘之间读写数据流:

  • 上图中有3个 Longhorn 卷实例
  • 每卷都有一个特殊的控制器,称为 Longhorn Engine,并作为 Linux 进程运行
  • 每个 Longhorn 有两个副本,每个副本也是一个 Linux 进程
  • 图中的箭头表示卷、控制器实例、副本实例和磁盘读写数据流
  • 为每一卷创建单独的卷 Longhorn Engine,如果控制器出现故障,不会影响其他卷的功能

在 Longhorn 中,每个 Engine 只需服务一卷,简化了存储控制器的设计,控制器崩溃只会影响一个卷,因为控制器软件的故障域与单个卷隔离。 Longhorn Engine 足够简单轻便,因此我们可以创建多达 100000 个独立的 Engine,Kubernetes 调度这些独立的 Engine,从一组共享磁盘中提取资源 Longhorn 合作形成一个弹性的分布式块存储系统。

因为每卷都有自己的控制器,因此,每卷的控制器和副本实例也可以升级,而不会导致 IO 操作明显中断。Longhorn 它可以创建一个长时间的操作 job 协调升级所有卷的任务,而不中断系统的运行。

Longhorn 是通过 CSI 驱动在 Kubernetes 中管理的,CSI 通过调用驱动 Longhorn 创卷,为 Kubernetes 创建工作负荷的持久性数据,CSI 我们可以创建、删除、附加、分离、挂载卷,并快照操作卷,Kubernetes 集群内部使用 CSI 接口与Longhorn CSI 驱动通信,而 Longhorn CSI 使用驱动 Longhorn API 与 Longhorn Manager 进行通信。

此外 Longhorn 还提供一个 UI 通过界面程序 Longhorn API 与 Longhorn Manager 进行交互,通过 Longhorn UI 快照、备份、节点备份、节点和磁盘。此外,还可以使用集群工作节点的空间 Longhorn UI 查看。

3、安装

要在 Kubernetes 集群上安装 Longhorn,每个需要集群的节点必须满足以下要求:

  • 与 Kubernetes 当兼容容容器运行时(Docker v1.13 、containerd v1.3.7 等)
  • Kubernetes v1.18
  • 安装 open-iscsi,并且 iscsid 必须在所有节点上操作守护程序,因为 Longhorn 依赖主机 iscsiadm 为 Kubernetes 提供持久卷
  • RWX 每个节点都需要安装支持 NFSv4 客户端
  • 支持宿主机文件系统 file extents 目前,我们支持功能存储数据:ext4 与 XFS
  • bash、curl、findmnt、grep、awk、blkid、lsblk 必须安装等工具
  • Mount propagation 必须启用,允许将容器挂载的卷与相同 pod 其他容器共享甚至可以与同一节点的其他容器共享 pod 共享
  • Longhorn workloads 必须能够以 root 身份运行正确部署和操作 Longhorn。

1.依赖

?? 为验证这些环境要求,Lonhorn 官方提供了一个脚本来帮助我们进行检查,执行该脚本需要在本地安装 jq 工具,执行下面的命令即可运行脚本:(这个可以在后续安装完成后测试)

curl -sSfL https://raw.githubusercontent.com/longhorn/longhorn/v1.2.3/scripts/environment_check.sh | bash
daemonset.apps/longhorn-environment-check created
waiting for pods to become ready (0/2)
waiting for pods to become ready (0/2)
all pods ready (2/2)

  MountPropagation is enabled!

cleaning up...
daemonset.apps "longhorn-environment-check" deleted
clean up complete

如果没有检查通过会给出相关的提示信息。

🍀 要安装 open-iscsi,可以直接使用下面的命令即可:

# apt-get install open-iscsi # Debian 和 Ubuntu 系统命令
➜ yum install -y iscsi-initiator-utils

😂或者可以使用yaml文件部署:(😋我这里就是使用这种方式部署的哈哈,很方便的)

Longhorn 官方还为我们还提供了一个 iscsi 安装程序,可以更轻松地自动安装 open-iscsi

➜ kubectl apply -f https://raw.githubusercontent.com/longhorn/longhorn/v1.2.3/deploy/prerequisite/longhorn-iscsi-installation.yaml

部署完成后,运行以下命令来检查安装程序的 pod 状态:

➜ kubectl get pod | grep longhorn-iscsi-installation
longhorn-iscsi-installation-49hd7   1/1     Running   0          21m
longhorn-iscsi-installation-pzb7r   1/1     Running   0          39m

也可以通过以下命令查看日志,查看安装结果:

➜ kubectl logs longhorn-iscsi-installation-pzb7r -c iscsi-installation
...
Installed:
  iscsi-initiator-utils.x86_64 0:6.2.0.874-7.amzn2

Dependency Installed:
  iscsi-initiator-utils-iscsiuio.x86_64 0:6.2.0.874-7.amzn2

Complete!
Created symlink from /etc/systemd/system/multi-user.target.wants/iscsid.service to /usr/lib/systemd/system/iscsid.service.
iscsi install successfully

🍀 同样要安装 NFSv4 客户端,可以直接使用下面的命令一键安装:

# apt-get install nfs-common # Debian 和 Ubuntu 系统命令
➜ yum install nfs-utils

😂或者可以使用yaml文件部署:

同样 Longhorn 官方也提供了一个 nfs 客户端安装程序,可以更轻松地自动安装 nfs-client:

➜ kubectl apply -f https://raw.githubusercontent.com/longhorn/longhorn/v1.2.3/deploy/prerequisite/longhorn-nfs-installation.yaml

部署完成后,运行以下命令来检查安装程序的 pod 状态:

➜ kubectl get pod | grep longhorn-nfs-installation
NAME                                  READY   STATUS    RESTARTS   AGE
longhorn-nfs-installation-t2v9v   1/1     Running   0          143m
longhorn-nfs-installation-7nphm   1/1     Running   0          143m

也可以通过以下命令查看日志,查看安装结果:

➜ kubectl logs longhorn-nfs-installation-t2v9v -c nfs-installation
...
nfs install successfully

相关依赖环境准备好过后就可以开始安装 Longhorn 了。

🍀 注意事项

⚠️ 如果使用yaml文件在k8s节点上安装上面iscsi-initiator-utils和nfs-utils软件时,使用这个yaml文件部署还是非常方便的,因为节点数越多使用这个效果就越明显。

记得要改下这2个yaml里镜像仓库地址

image: registry.aliyun.comcs/k8sxio/pause:3.5

⚠️ 现在有个有趣的问题

安装一个软件可以采用pod形式了,哈哈。可以借鉴这种安装方式的

注意一下这个yaml文件的使用方式;

那我把这个DaemonSet资源移除后,原来安装的软件应该是换在原来机器上面的吧;–>应该在的。–>已测试:是存在的!

这个相当于把脚本集成到了这个command里面:666

OS=$(grep "ID_LIKE" /etc/os-release | cut -d '=' -f 2); 

if [[ "${OS}" == *"debian"* ]]; then sudo apt-get update -q -y && sudo apt-get install -q -y open-iscsi && sudo systemctl -q enable iscsid && sudo systemctl start iscsid; 

elif [[ "${OS}" == *"suse"* ]]; then sudo zypper --gpg-auto-import-keys -q refresh && sudo zypper --gpg-auto-import-keys -q install -y open-iscsi && sudo systemctl -q enable iscsid && sudo systemctl start iscsid; 

else sudo yum makecache -q -y && sudo yum --setopt=tsflags=noscripts install -q -y iscsi-initiator-utils && echo "InitiatorName=$(/sbin/iscsi-iname)" > /etc/iscsi/initiatorname.iscsi && sudo systemctl -q enable iscsid && sudo systemctl start iscsid; fi && if [ $? -eq 0 ]; then echo "iscsi install successfully"; else echo "iscsi install failed error code $?"; 

fi
apiVersion: apps/v1
kind: DaemonSet
metadata:
  name: longhorn-iscsi-installation
  labels:
    app: longhorn-iscsi-installation
  annotations:
    command: &cmd OS=$(grep "ID_LIKE" /etc/os-release | cut -d '=' -f 2); if [[ "${ 
        OS}" == *"debian"* ]]; then sudo apt-get update -q -y && sudo apt-get install -q -y open-iscsi && sudo systemctl -q enable iscsid && sudo systemctl start iscsid; elif [[ "${ 
        OS}" == *"suse"* ]]; then sudo zypper --gpg-auto-import-keys -q refresh && sudo zypper --gpg-auto-import-keys -q install -y open-iscsi && sudo systemctl -q enable iscsid && sudo systemctl start iscsid; else sudo yum makecache -q -y && sudo yum --setopt=tsflags=noscripts install -q -y iscsi-initiator-utils && echo "InitiatorName=$(/sbin/iscsi-iname)" > /etc/iscsi/initiatorname.iscsi && sudo systemctl -q enable iscsid && sudo systemctl start iscsid; fi && if [ $? -eq 0 ]; then echo "iscsi install successfully"; else echo "iscsi install failed error code $?"; fi
spec:
  selector:
    matchLabels:
      app: longhorn-iscsi-installation
  template:
    metadata:
      labels:
        app: longhorn-iscsi-installation
    spec:
      hostNetwork: true
      hostPID: true
      initContainers:
      - name: iscsi-installation
        command:
          - nsenter
          - --mount=/proc/1/ns/mnt
          - --
          - bash
          - -c
          - *cmd
        image: alpine:3.12
        securityContext:
          privileged: true
      containers:
      - name: sleep
        # image: k8s.gcr.io/pause:3.1
        image: registry.aliyun.com/k8sxio/pause:3.5
  updateStrategy:
    type: RollingUpdate

⚠️ 自己使用yaml安装如下

$ kubectl apply -f longhorn-iscsi-installation.yaml 
daemonset.apps/longhorn-iscsi-installation created

#从安装结果看,好像master节点不需要安装。。
[root@master1 ~]#kubectl get po -owide
NAME                                READY   STATUS    RESTARTS   AGE     IP            NODE    NOMINATED NODE   READINESS GATES
longhorn-iscsi-installation-7zq4k   1/1     Running   0          4m22s   172.29.9.53   node2   <none>           <none>
longhorn-iscsi-installation-b4ztm   1/1     Running   0          27s     172.29.9.52   node1   <none>           <none>

#测试是否安装成功:
[root@master1 ~]#kubectl logs longhorn-iscsi-installation-7zq4k -c iscsi-installation
Package iscsi-initiator-utils-6.2.0.874-22.el7_9.x86_64 already installed and latest version
iscsi install successfully
[root@node1 ~]#rpm -qa|grep iscsi-initiator-utils
iscsi-initiator-utils-6.2.0.874-22.el7_9.x86_64
iscsi-initiator-utils-iscsiuio-6.2.0.874-22.el7_9.x86_64

⚠️ 注意:之前在做nfs测试实验是,这个包3个节点都已经暗转改好了的。

[root@node1 ~]#rpm -qa |grep nfs-utils
nfs-utils-1.3.0-0.68.el7.2.x86_64

我们可以继续尝试用yaml文件再次安装下这个包:

$ kubectl apply -f longhorn-nfs-installation.yaml 
daemonset.apps/longhorn-nfs-installation created

[root@master1 ~]#kubectl get po -owide
NAME                                READY   STATUS    RESTARTS   AGE     IP            NODE    NOMINATED NODE   READINESS GATES
longhorn-iscsi-installation-7zq4k   1/1     Running   0          10m     172.29.9.53   node2   <none>           <none>
longhorn-iscsi-installation-b4ztm   1/1     Running   0          6m47s   172.29.9.52   node1   <none>           <none>
longhorn-nfs-installation-dggst     1/1     Running   0          19s     172.29.9.52   node1   <none>           <none>
longhorn-nfs-installation-k7dtt     1/1     Running   0          19s     172.29.9.53   node2   <none>           <none>
[root@master1 ~]# 

[root@master1 ~]#kubectl logs longhorn-nfs-installation-dggst -c nfs-installation
Package 1:nfs-utils-1.3.0-0.68.el7.2.x86_64 already installed and latest version
nfs install successfully

完成,继续进行下一步。

2.部署

🍀 loghorn github地址

https://github.com/longhorn/longhorn

🍀 官方支持使用 Rancher Catalog 应用、kubectl 与 helm 三种方式来进行安装,同样这里我们选择使用 helm 进行安装。

首先添加 longhorn 的 chart 仓库:

[root@master1 ~]#helm repo add longhorn https://charts.longhorn.io
[root@master1 ~]#helm repo update

🍀 然后可以根据自己的实际场景定制 values 文件,可以通过下面的命令获取默认的 values 文件:

curl -Lo values.yaml https://raw.githubusercontent.com/longhorn/charts/master/charts/longhorn/values.yaml

然后可以修改 values 文件中的配置,longhorn 推荐单独挂盘作为存储使用,这里作为测试直接使用默认的 /var/lib/longhorn 目录。

如下所示默认配置的示例片段:

defaultSettings:
  backupTarget: s3://backupbucket@us-east-1/backupstore
  backupTargetCredentialSecret: minio-secret
  createDefaultDiskLabeledNodes: true
  defaultDataPath: /var/lib/longhorn-example/
  replicaSoftAntiAffinity: false
  storageOverProvisioningPercentage: 600
  storageMinimalAvailablePercentage: 15
  upgradeChecker: false
  defaultReplicaCount: 2
  defaultDataLocality: disabled
  guaranteedEngineCPU:
  defaultLonghornStaticStorageClass: longhorn-static-example
  backupstorePollInterval: 500
  taintToleration: key1=value1:NoSchedule; key2:NoExecute
  systemManagedComponentsNodeSelector: "label-key1:label-value1"
  priority-class: high-priority
  autoSalvage: false
  disableSchedulingOnCordonedNode: false
  replicaZoneSoftAntiAffinity: false
  volumeAttachmentRecoveryPolicy: never
  nodeDownPodDeletionPolicy: do-nothing
  mkfsExt4Parameters: -O ^64bit,^metadata_csum
  guaranteed-engine-manager-cpu: 15
  guaranteed-replica-manager-cpu: 15

ingress:  # 开启ingress
  enabled: true
  ingressClassName: nginx  # 配置 ingressclass
  host: longhorn.k8s.local
  annotations:
    nginx.ingress.kubernetes.io/proxy-body-size: 10000m
enablePSP: false

🍀 我这里直接下载原value.yaml文件然后进行编辑:

#wget https://raw.githubusercontent.com/longhorn/charts/master/charts/longhorn/values.yaml

⚠️ 因为老师这里用到了Ingress nginx,so我要重新部署下这个ingress nginx,然后才开始安装longhorn,尽可能地和老师的步骤保持一致。

具体如何安装ingress-nginx,请看我的另一篇文章:https://blog.csdn.net/weixin_39246554/article/details/122283914

我这里再贴一下具体的操作命令:

➜ helm repo add ingress-nginx https://kubernetes.github.io/ingress-nginx
➜ helm repo update
➜ helm fetch ingress-nginx/ingress-nginx
➜ tar -xvf ingress-nginx-4.0.13.tgz && cd ingress-nginx

#vim ci/daemonset-prod.yaml
# ci/daemonset-prod.yaml
controller:
  name: controller
  image:
    repository: cnych/ingress-nginx #老师这里是转存过的。
    tag: "v1.1.0"
    digest:

  dnsPolicy: ClusterFirstWithHostNet

  hostNetwork: true

  publishService:  # hostNetwork 模式下设置为false,通过节点IP地址上报ingress status数据
    enabled: false

  # 是否需要处理不带 ingressClass 注解或者 ingressClassName 属性的 Ingress 对象
  # 设置为 true 会在控制器启动参数中新增一个 --watch-ingress-without-class 标注
  watchIngressWithoutClass: false

  kind: DaemonSet

  tolerations:   # kubeadm 安装的集群默认情况下master是有污点,需要容忍这个污点才可以部署
  - key: "node-role.kubernetes.io/master"
    operator: "Equal"
    effect: "NoSchedule"

  nodeSelector:   # 固定到master1节点
    kubernetes.io/hostname: master1

  service:  # HostNetwork 模式不需要创建service
    enabled: false

  admissionWebhooks: # 强烈建议开启 admission webhook
    enabled: true
    createSecretJob:
      resources:
        limits:
          cpu: 10m
          memory: 20Mi
        requests:
          cpu: 10m
          memory: 20Mi
    patchWebhookJob:
      resources:
        limits:
          cpu: 10m
          memory: 20Mi
        requests:
          cpu: 10m
          memory: 20Mi
    patch:
      enabled: true
      image:
        repository: cnych/ingress-nginx-webhook-certgen #老师做了镜像转存
        tag: v1.1.1
        digest:

defaultBackend:  # 配置默认后端
  enabled: true
  name: defaultbackend
  image:
    repository: cnych/ingress-nginx-defaultbackend #老师做了镜像转存
    tag: "1.5"
    
[root@master1 ci]# kubectl create ns ingress-nginx
namespace/ingress-nginx created
[root@master1 ingress-nginx]#helm upgrade --install ingress-nginx . -f ./ci/daemonset-prod.yaml --namespace ingress-nginx #upgrade如果存在的话,我就迁移更新,不存在的话,我就去安装。

#验证
➜ kubectl get svc -n ingress-nginx
NAME                                 TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)   AGE
ingress-nginx-controller-admission   ClusterIP   10.96.15.99     <none>        443/TCP   11m
ingress-nginx-defaultbackend         ClusterIP   10.97.250.253   <none>        80/TCP    11m
➜ kubectl get pods -n ingress-nginx
NAME                                            READY   STATUS    RESTARTS   AGE
ingress-nginx-controller-5dfdd4659c-9g7c2       1/1     Running   0          11m
ingress-nginx-defaultbackend-84854cd6cb-xb7rv   1/1     Running   0          11m

使用一个案例测试ingress-nginx安装成功后,我们继续进行下一步。

🍀 然后执行下面的命令一键安装 Longhorn:

➜ helm upgrade --install longhorn longhorn/longhorn --namespace longhorn-system --create-namespace -f values.yaml
NAME: longhorn
LAST DEPLOYED: Sun Feb 20 16:14:05 2022
NAMESPACE: longhorn-system
STATUS: deployed
REVISION: 1
TEST SUITE: None
NOTES:
Longhorn is now installed on the cluster!

Please wait a few minutes for other Longhorn components such as CSI deployments, Engine Images, and Instance Managers to be initialized.

Visit our documentation at https://longhorn.io/docs/

🍀 记得做一下ingress nginx的域名解析

#在自己pc笔记本上做下域名解析:C:\WINDOWS\System32\drivers\etc\hosts
172.29.9.51 longhorn.k8s.local 

🍀 部署后可以查看 Pod 的运行状态来确保安装正确:

➜ kubectl get pods -n longhorn-system
NAME                                        READY   STATUS    RESTARTS   AGE
csi-attacher-5f46994f7-fqntq                1/1     Running   0          33s
csi-attacher-5f46994f7-ltxg8                1/1     Running   0          36m
csi-attacher-5f46994f7-vw75d                1/1     Running   0          36m
csi-provisioner-6ccbfbf86f-bvc99            1/1     Running   0          33s
csi-provisioner-6ccbfbf86f-k46hn            1/1     Running   0          36m
csi-provisioner-6ccbfbf86f-lxm8h            1/1     Running   0          36m
csi-resizer-6dd8bd4c97-52gmm                1/1     Running   0          35m
csi-resizer-6dd8bd4c97-9btj6                1/1     Running   0          3s
csi-resizer-6dd8bd4c97-fdjmp                1/1     Running   0          35m
csi-snapshotter-86f65d8bc-5mjk2             1/1     Running   0          33s
csi-snapshotter-86f65d8bc-5rrfs             1/1     Running   0          35m
csi-snapshotter-86f65d8bc-bg6nv             1/1     Running   0          35m
engine-image-ei-fa2dfbf0-jrb2d              1/1     Running   0          36m
engine-image-ei-fa2dfbf0-m5799              1/1     Running   0          36m
instance-manager-e-051171e6                 1/1     Running   0          36m
instance-manager-e-db94b4b7                 1/1     Running   0          24m
instance-manager-r-dd84ad5c                 1/1     Running   0          36m
instance-manager-r-f5eefb8a                 1/1     Running   0          24m
longhorn-csi-plugin-mljt2                   2/2     Running   0          35m
longhorn-csi-plugin-rfzcj                   2/2     Running   0          24m
longhorn-driver-deployer-6db849975f-dh4p4   1/1     Running   0          58m
longhorn-manager-bxks6                      1/1     Running   0          24m
longhorn-manager-tj58k                      1/1     Running   0          2m50s
longhorn-ui-6f547c964-k56xr                 1/1     Running   0          58m

🍀 由于上面安装的时候我们添加了 Ingress 支持,所以可以通过配置的域名去访问 Longhorn UI:

➜ kubectl get ingress  -n longhorn-system
NAME               CLASS   HOSTS                ADDRESS         PORTS   AGE
longhorn-ingress   nginx   longhorn.k8s.local   192.168.31.31   80      4m11s

这里我们使用的 ingress-nginx 这个控制器,安装完成后在浏览器中直接访问 http://longhorn.k8s.local 即可:

Longhorn UI 界面中展示了当前存储系统的状态,也可以在页面中进行其他相关配置。

🍀 此外还会创建一个默认的 StorageClass 对象:

[root@master1 ~]#kubectl get sc longhorn 
NAME                 PROVISIONER          RECLAIMPOLICY   VOLUMEBINDINGMODE   ALLOWVOLUMEEXPANSION   AGE
longhorn (default)   driver.longhorn.io   Delete          Immediate           true                   19h
[root@master1 ~]#kubectl get sc longhorn -oyaml
allowVolumeExpansion: true
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  annotations:
    longhorn.io/last-applied-configmap: |
      kind: StorageClass
      apiVersion: storage.k8s.io/v1
      metadata:
        name: longhorn
        annotations:
          storageclass.kubernetes.io/is-default-class: "true"
      provisioner: driver.longhorn.io
      allowVolumeExpansion: true
      reclaimPolicy: "Delete"
      volumeBindingMode: Immediate
      parameters:
        numberOfReplicas: "2"
        staleReplicaTimeout: "30"
        fromBackup: ""
        fsType: "ext4"
    storageclass.kubernetes.io/is-default-class: "true"
  creationTimestamp: "2022-02-23T14:02:29Z"
  name: longhorn
  resourceVersion: "1515618"
  uid: ab7eaf7a-d178-45f3-826a-8fec4e4e5149
parameters:
  fromBackup: ""
  fsType: ext4
  numberOfReplicas: "2"
  staleReplicaTimeout: "30"
provisioner: driver.longhorn.io
reclaimPolicy: Delete
volumeBindingMode: Immediate
[root@master1 ~]#

🍀 自己暗转过后效果如下:

3、测试

🍀 下面我们来测试使用 longhorn 提供一个存储卷,由于提供了默认的 StorageClass,所以直接创建 PVC 即可,创建一个如下所示的 PVC:

#01-longhorn-pvc.yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: mysql-pvc
spec:
  storageClassName: longhorn #当然你也可以不指定,因为之前指定了默认的storageclasss。
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 1Gi

🍀 然后部署一个 mysql 应用来使用上面的 PVC 进行数据持久化:

#02-mysql-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: mysql
spec:
  selector:
    matchLabels:
      app: mysql
  strategy:
    type: Recreate
  template:
    metadata:
      labels:
        app: mysql
    spec:
      containers:
      - image: mysql:5.6
        name: mysql
        env:
        - name: MYSQL_ROOT_PASSWORD
          value: password
        ports:
        - containerPort: 3306
          name: mysql
        volumeMounts:
        - name: data
          mountPath: /var/lib/mysql
      volumes:
      - name: data
        persistentVolumeClaim:
          claimName: mysql-pvc

🍀 直接创建上面的资源对象

$ kubectl apply -f 01-longhorn-pvc.yaml 
persistentvolumeclaim/mysql-pvc created
hg@LAPTOP-G8TUFE0T:/mnt/c/Users/hg/Desktop/yaml/2022.2.23-46.Longhorn存储-实验代码/edited
$ kubectl apply -f 02-mysql-deployment.yaml 
deployment.apps/mysql created

🍀 验证

#查看pod和pvc信息
[root@master1 ~]#kubectl get po -owide
NAME                     READY   STATUS    RESTARTS   AGE    IP             NODE    NOMINATED NODE   READINESS GATES
mysql-6879698bd4-nmlrg   1/1     Running   0          105s   10.244.2.244   node2   <none>           <none>
[root@master1 ~]#kubectl get pvc mysql-pvc 
NAME        STATUS   VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS   AGE
mysql-pvc   Bound    pvc-52031b79-4905-47be-b8fc-09629c25de1f   1Gi        RWO            longhorn       117s


#查看pv信息
[root@master1 ~]#kubectl get pv pvc-52031b79-4905-47be-b8fc-09629c25de1f 
NAME                                       CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS   CLAIM               STORAGECLASS   REASON   AGE
pvc-52031b79-4905-47be-b8fc-09629c25de1f   1Gi        RWO            Delete           Bound    default/mysql-pvc   longhorn                3m
[root@master1 ~]#kubectl get pv pvc-52031b79-4905-47be-b8fc-09629c25de1f -oyaml
……
  csi:
    driver: driver.longhorn.io
    fsType: ext4
    volumeAttributes:
      fromBackup: ""
      fsType: ext4
      numberOfReplicas: "2"
      staleReplicaTimeout: "30"
      storage.kubernetes.io/csiProvisionerIdentity: 1645625127582-8081-driver.longhorn.io
    volumeHandle: pvc-52031b79-4905-47be-b8fc-09629c25de1f
  persistentVolumeReclaimPolicy: Delete
  storageClassName: longhorn
  volumeMode: Filesystem
status:
  phase: Bound
  
#进入pod测试mysql应用
[root@master1 ~]#kubectl exec -it mysql-6879698bd4-nmlrg -- mysql -uroot -ppassword
Warning: Using a password on the command line interface can be insecure.
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 1
Server version: 5.6.51 MySQL Community Server (GPL)

Copyright (c) 2000, 2021, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> show databases;
+---------------------+
| Database            |
+---------------------+
| information_schema  |
| #mysql50#lost+found |
| mysql               |
| performance_schema  |
+---------------------+
4 rows in set (0.05 sec)

mysql> create database longhorn;
Query OK, 1 row affected (0.00 sec)

mysql> show databases;
+---------------------+
| Database            |
+---------------------+
| information_schema  |
| longhorn            |
| #mysql50#lost+found |
| mysql               |
| performance_schema  |
+---------------------+
5 rows in set (0.00 sec)

mysql> exit
Bye
[root@master1 ~]#

🍀 应用启动成功后我们可以去节点上查看数据来验证是否成功:

[root@master1 ~]#kubectl get po -owide 
NAME                     READY   STATUS    RESTARTS   AGE     IP             NODE    NOMINATED NODE   READINESS GATES
mysql-6879698bd4-nmlrg   1/1     Running   0          6m54s   10.244.2.244   node2   <none>           <none>
[root@master1 ~]#ssh node2
Last login: Wed Feb 23 22:11:35 2022 from master1
[root@node2 ~]#ls /var/lib/longhorn/
engine-binaries  longhorn-disk.cfg  replicas
[root@node2 ~]#ls /var/lib/longhorn/replicas/
pvc-52031b79-4905-47be-b8fc-09629c25de1f-863b6d00
[root@node2 ~]#ls /var/lib/longhorn/replicas/pvc-52031b79-4905-47be-b8fc-09629c25de1f-863b6d00/
revision.counter  volume-head-000.img  volume-head-000.img.meta  volume.meta

⚠️ 需要注意的是 longhorn 是分布式块存储,与分布式文件系统不同,不能超过 pv 设置的存储大小(上例中为1G)

类似于vmware里的厚纸杯延迟置0

🍀 刚才我们在数据库中创建了一个名为 longhorn 的数据库,然后我们重建 Pod 再次查看数据是否依然存在:

[root@master1 ~]#kubectl get po
NAME                     READY   STATUS    RESTARTS   AGE
mysql-6879698bd4-nmlrg   1/1     Running   0          8m39s
[root@master1 ~]#kubectl delete po mysql-6879698bd4-nmlrg 
pod "mysql-6879698bd4-nmlrg" deleted
[root@master1 ~]#kubectl get po
NAME   

相关文章