实战:Longhorn存储-2022.2.24
目录文章目录目录实验环境实验软件1、Longhorn2、架构3、安装1.依赖2.部署3、测试QA关于我最后实验环境实验环境:1、win10,vmwrokstation虚机;2、k8s集群:3台centos7.6 1810虚机,1个master节点,2个node节点k8s version:v1.22.2containerd://1.5.5实验软件链接:https://pan.baidu.com/s/
目录
实验环境
实验环境:
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.依赖
🍀 为了验证这些环境要求,Longhorn 官方提供了一个脚本来帮助我们进行检查,执行该脚本需要在本地安装 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 READY STATUS RESTARTS AGE
mysql-6879698bd4-jj4jm 1/1 Running 0 6s
[root@master1 ~]#kubectl exec -it mysql-6879698bd4-jj4jm -- 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 |
| longhorn |
| #mysql50#lost+found |
| mysql |
| performance_schema |
+---------------------+
5 rows in set (0.02 sec)
mysql>
可以看到前面创建的数据库依然存在,证明我们的数据持久化成功了。
🍀 在 Longhorn UI 界面中也可以看到数据卷的信息:
http://longhorn.k8s.local/
实验结束,完美。😘
QA
总之这个longhorn整体使用起来比ceph要简单很多,ceph还是复杂很多的;
并且longhorn整体性能比我们之前说的nfs要高好几倍的,但是它的性能比我们直接使用本地磁盘还是要差一些的,这是必然的;
并且longhorn也是rancher开源的,所以这个ui界面和rancher也是比较类似的;
01 可以指定其中的一些节点作为存储使用:例如你总共有6个node节点,当然你是可以指定其中的4个节点来做存储使用的;
02 也可以扩容节点的存储:例如某个节点新添加了一块盘,那么你也是可以通过web界面将其添加进来的;(在node选项那里)
关于我
我的博客主旨:我希望每一个人拿着我的博客都可以做出实验现象,先把实验做出来,然后再结合理论知识更深层次去理解技术点,这样学习起来才有乐趣和动力。并且,我的博客内容步骤是很完整的,也分享源码和实验用到的软件,希望能和大家一起共同进步!
各位小伙伴在实际操作过程中如有什么疑问,可随时联系本人免费帮您解决问题:
-
个人微信二维码:x2675263825 (舍得), qq:2675263825。
-
个人博客地址:www.onlyonexl.cn
-
个人微信公众号:云原生架构师实战
-
个人csdn
https://blog.csdn.net/weixin_39246554?spm=1010.2135.3001.5421
-
个人已开源干货😘
名称 链接 01 实战:打造一款王者云笔记:typora+坚果云+阿里云oss https://www.jianguoyun.com/p/DXS6qiIQvPWVCRiS0qoE 02 实战:定制宇宙中最美的typora主题皮肤 https://www.jianguoyun.com/p/DeUK9u0QvPWVCRib0qoE 03 玩转vscode https://www.jianguoyun.com/p/DZe8gmsQvPWVCRid0qoE 04 陈果的幸福哲学课 https://www.jianguoyun.com/p/Db0kM7gQvPWVCRj2q6YE
最后
好了,关于longhorn存储
实验就到这里了,感谢大家阅读,最后贴上我女神的photo,祝大家生活快乐,每天都过的有意义哦,我们下期见!
更多推荐
所有评论(0)