1.Longhorn介绍
Longhorn是用于Kubernetes的轻量级,可靠且功能强大的企业级分布式块存储系统。
Longhorn使用容器和微服务实现分布式块存储。Longhorn为每个块设备卷创建一个专用的存储控制器,并跨多个节点上存储的多个副本同步复制该卷。存储控制器和副本本身使用Kubernetes进行编排。
特征
- 企业级分布式块存储,无单点故障
- 块存储的增量快照
- 备份到基于有效更改块检测的辅助存储(与NFS或S3兼容的对象存储)
- 定期快照和备份
- 自动化,无中断升级。您可以升级整个Longhorn软件堆栈,而无需中断正在运行的存储卷。
- 直观的GUI仪表板
2.工作原理
image.png
3.安装Longhorn
3.1 安装前提条件
- Docker v1.13 +
- Kubernetes v1.14 +。
- root权限,Longhorn工作负载必须能够以root用户身份运行,才能正确部署和操作Longhorn。
- open-iscsi已安装,并且iscsid守护程序正在所有节点上运行。
- curl,findmnt,grep,awk,blkid,lsblk必须安装。
- 支持CSI v1.1。
- 默认情况下,Longhorn安装需要三个节点的群集,因为默认副本数为3,并且禁用了节点级别的软抗关联性,说白了就是要求必须有三台Worker在集群中。
- 主机文件系统支持
file extents存储数据的功能。目前,我们支持:- ext4
- XFS文件
-
curl,findmnt,grep,awk,blkid,lsblk必须安装。 - 必须启用挂载传播。
可以用如下脚本去检查缺少了什么基础组件,然后将缺少的东西安装上就好了
curl -sSfL https://raw.githubusercontent.com/longhorn/longhorn/master/scripts/environment_check.sh | bash
PS:这个脚本可能会出现下载不下来的情况,如果下载不下,就直接使用下面的源代码去验证。
vi environment_check.sh
# 将下面的environment_check.sh源码拷贝进去
sh ./environment_check.sh
environment_check.sh源码
#!/bin/bash
dependencies() {
local targets=($@)
local allFound=true
for ((i=0; i<${#targets[@]}; i++)); do
local target=${targets[$i]}
if [ "$(which $target)" == "" ]; then
allFound=false
echo Not found: $target
fi
done
if [ "$allFound" == "false" ]; then
echo "Please install missing dependencies."
exit 2
fi
}
create_ds() {
cat <<EOF > $TEMP_DIR/environment_check.yaml
apiVersion: apps/v1
kind: DaemonSet
metadata:
labels:
app: longhorn-environment-check
name: longhorn-environment-check
spec:
selector:
matchLabels:
app: longhorn-environment-check
template:
metadata:
labels:
app: longhorn-environment-check
spec:
containers:
- name: longhorn-environment-check
image: busybox
args: ["/bin/sh", "-c", "sleep 1000000000"]
volumeMounts:
- name: mountpoint
mountPath: /tmp/longhorn-environment-check
mountPropagation: Bidirectional
securityContext:
privileged: true
volumes:
- name: mountpoint
hostPath:
path: /tmp/longhorn-environment-check
EOF
kubectl create -f $TEMP_DIR/environment_check.yaml
}
cleanup() {
echo "cleaning up..."
kubectl delete -f $TEMP_DIR/environment_check.yaml
rm -rf $TEMP_DIR
echo "clean up complete"
}
wait_ds_ready() {
while true; do
local ds=$(kubectl get ds/longhorn-environment-check -o json)
local numberReady=$(echo $ds | jq .status.numberReady)
local desiredNumberScheduled=$(echo $ds | jq .status.desiredNumberScheduled)
if [ "$desiredNumberScheduled" == "$numberReady" ] && [ "$desiredNumberScheduled" != "0" ]; then
echo "all pods ready ($numberReady/$desiredNumberScheduled)"
return
fi
echo "waiting for pods to become ready ($numberReady/$desiredNumberScheduled)"
sleep 3
done
}
validate_ds() {
local allSupported=true
local pods=$(kubectl -l app=longhorn-environment-check get po -o json)
for ((i=0; i<1; i++)); do
local pod=$(echo $pods | jq .items[$i])
local nodeName=$(echo $pod | jq -r .spec.nodeName)
local mountPropagation=$(echo $pod | jq -r '.spec.containers[0].volumeMounts[] | select(.name=="mountpoint") | .mountPropagation')
if [ "$mountPropagation" != "Bidirectional" ]; then
allSupported=false
echo "node $nodeName: MountPropagation DISABLED"
fi
done
if [ "$allSupported" != "true" ]; then
echo
echo " MountPropagation is disabled on at least one node."
echo " As a result, CSI driver and Base image cannot be supported."
echo
exit 1
else
echo -e "\n MountPropagation is enabled!\n"
fi
}
dependencies kubectl jq mktemp
TEMP_DIR=$(mktemp -d)
trap cleanup EXIT
create_ds
wait_ds_ready
validate_ds
exit 0
执行后应该是这样的情况,其中kubectl这个依赖可以不去管它,只要将其他的依赖安装好就行了
image.png
3.2 安装open-iscsi
用于安装的命令open-iscsi因Linux发行版而异。
对于Debian和Ubuntu,请使用以下命令:
apt-get install open-iscsi
对于带有的RHEL,CentOS和EKS EKS Kubernetes Worker AMI with AmazonLinux2 image,请使用以下命令:
yum install iscsi-initiator-utils
3.3 开始安装Longhorn
-
1.检查
longhorn-system命名空间是否被占用,如果被占用需要先将该命名空间删除。 -
2.打开Rancher商店
image.png
image.png
直接将下面的yaml文件贴进去就可以了,有兴趣的小伙伴可以看看每一个参数的介绍,然后根据自己的需求去修改yaml文件,重点的项我已经用注释标记出来了。
---
image:
defaultImage: true
longhorn:
manager: "longhornio/longhorn-manager"
managerTag: "v1.0.1"
engine: "longhornio/longhorn-engine"
engineTag: "v1.0.1"
ui: "longhornio/longhorn-ui"
uiTag: "v1.0.1"
instanceManager: "longhornio/longhorn-instance-manager"
instanceManagerTag: "v1_20200514"
csi:
attacherImage: ""
provisionerImage: ""
nodeDriverRegistrarImage: ""
resizerImage: ""
kubeletRootDir: ""
attacherReplicaCount: "1"
provisionerReplicaCount: ""
privateRegistry:
registryUrl: ""
registryUser: ""
registryPasswd: ""
longhorn:
default_setting: true
defaultSettings:
registrySecret: ""
backupTarget: ""
backupTargetCredentialSecret: ""
createDefaultDiskLabeledNodes: false
defaultDataPath: "/var/lib/longhorn/" # 这个地方选择你的数据存储地址
replicaSoftAntiAffinity: false
storageOverProvisioningPercentage: "200"
storageMinimalAvailablePercentage: "25"
upgradeChecker: true
defaultReplicaCount: "1" # 默认副本数
guaranteedEngineCPU: "0.25"
defaultLonghornStaticStorageClass: "longhorn-static"
backupstorePollInterval: "300"
taintToleration: ""
priorityClass: ""
autoSalvage: true
disableSchedulingOnCordonedNode: true
replicaZoneSoftAntiAffinity: true
volumeAttachmentRecoveryPolicy: "wait"
mkfsExt4Parameters: ""
persistence:
defaultClass: true
defaultClassReplicaCount: "1"
ingress:
enabled: false # 是不是开启Nginx代理
host: "xip.io"
service:
ui:
type: "NodePort" # 用NodePort的方式去使用UI
nodePort: "32767" # 这里建议使用Rancher集群中的最后一个端口
点击安装等待一会儿就好了,安装完成后应该如下图所示
image.png
然后用NodePort的方式去访问刚刚安装的UI应该会出现这样的界面
image.png
到此Longhorn安装完毕。在StrongClass会出现一个默认的存储类,其他的存储类就需要自己新建了,可以参考官网去新建。













网友评论