Longhorn存储
<p>[TOC]</p>
<h5>LongHorn介绍</h5>
<p><a href="https://longhorn.io/">Longhorn</a>是用于Kubernetes的轻量级、可靠且功能强大的分布式块存储系统,使用容器和微服务实现分布式块存储,为每个块设备卷创建一个专用的存储控制器,并在存储在多个节点上的多个副本之间同步复制该卷,存储控制器和副本本身使用Kubernetes编排。</p>
<pre><code class="language-bash">- 企业级分布式块存储,无单点故障
- 块存储的增量快照
- 备份到基于高效变更块检测的辅助存储(NFS或S3兼容的对象存储)
- 重复快照和备份
- 自动、无中断的升级。您可以升级整个 Longhorn 软件堆栈,而不会中断正在运行的存储卷。
- 直观的 GUI 仪表板</code></pre>
<h5>LongHorn原理</h5>
<ul>
<li>如下图,Longhorn volumes有三个实例,每个卷都有一个专用控制器,称为 Longhorn Engine 并作为 Linux 进程运行,每个 Longhorn 卷有两个副本(replica),每个副本是一个 Linux 进程,通过为每个卷创建单独的 Longhorn Engine,如果一个控制器出现故障,其他卷的功能不会受到影响</li>
</ul>
<p><img src="https://www.showdoc.com.cn/server/api/attachment/visitFile?sign=f46f488eb6c5d946704a6fd16e0e22c7" alt="" /></p>
<h5>LongHorn安装</h5>
<ul>
<li>集群环境信息、因为longhorn不能支持管理裸盘,要求先在本地挂载一个目录到数据盘中;</li>
</ul>
<table>
<thead>
<tr>
<th style="text-align: left;">主机名</th>
<th style="text-align: left;">IP地址</th>
<th style="text-align: left;">磁盘</th>
<th style="text-align: left;">挂载路径</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align: left;">k8s-master</td>
<td style="text-align: left;">10.0.0.41</td>
<td style="text-align: left;">/dev/sdb</td>
<td style="text-align: left;">/data/longhorn1 (可选)</td>
</tr>
<tr>
<td style="text-align: left;">k8s-node1</td>
<td style="text-align: left;">10.0.0.42</td>
<td style="text-align: left;">/dev/sdb</td>
<td style="text-align: left;">/data/longhorn1</td>
</tr>
<tr>
<td style="text-align: left;">k8s-node2</td>
<td style="text-align: left;">10.0.0.43</td>
<td style="text-align: left;">/dev/sdb</td>
<td style="text-align: left;">/data/longhorn1</td>
</tr>
</tbody>
</table>
<ul>
<li>配置磁盘挂载,在所有节点操作;</li>
</ul>
<pre><code class="language-bash"># longhorn支持xfs,ext4文件系统,这里使用xfs
mkdir -p /data/longhorn1
mkfs.xfs /dev/sdb
mount /dev/sdb /data/longhorn1
echo "/dev/sdb /data/longhorn1 xfs defaults 0 0" >> /etc/fstab
mount -a</code></pre>
<ul>
<li>在集群每个节点上安装open-iscsi,以及nfsv4-client;</li>
</ul>
<pre><code class="language-bash"># centos
yum install iscsi-initiator-utils nfs-utils
systemctl enable iscsid
systemctl start iscsid</code></pre>
<ul>
<li>配置k8s集群允许特权pod,在apiserver配置中添加如下参数;</li>
</ul>
<pre><code class="language-bash"># vim /etc/kubernetes/manifests/kube-apiserver.yaml
[09:48:39 root@k8s-mater /etc/kubernetes/manifests]# cat kube-apiserver.yaml |grep "privileged"
- --allow-privileged=true</code></pre>
<ul>
<li>通过官方的检测脚本检查环境依赖,在master执行即可;</li>
</ul>
<pre><code class="language-bash"># 检测结果要求没有报错即可
curl -sSfL https://raw.githubusercontent.com/longhorn/longhorn/v1.3.0/scripts/environment_check.sh | bash</code></pre>
<ul>
<li>使用helm3部署,必须以root身份运行;</li>
</ul>
<pre><code class="language-bash">kubectl create ns longhorn-system
helm repo add longhorn https://charts.longhorn.io
helm repo update
helm install longhorn longhorn/longhorn --namespace longhorn-system --create-namespace
helm -n longhorn-system list
kubectl -n longhorn-system get pod</code></pre>
<h5>LongHorn面板</h5>
<ul>
<li>安装Longhorn后,添加ingress规则从外部访问,默认情况下不会启用身份验证;</li>
</ul>
<pre><code class="language-bash">kubectl -n longhorn-system get svc # 名称为longhorn-frontend的svc用于访问Longhorn-UI</code></pre>
<ul>
<li>这里使用traefik进行转发访问;</li>
</ul>
<pre><code class="language-yaml">apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: longhorn-ui-svc
namespace: longhorn-system
spec:
rules:
- host: code.longhorn.cn
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: longhorn-frontend
port:
number: 80</code></pre>
<ul>
<li>访问ui面板;</li>
</ul>
<p><img src="https://www.showdoc.com.cn/server/api/attachment/visitFile?sign=00f214aac18c1467bfd321c617d3d292" alt="" /></p>
<h5>LongHorn磁盘</h5>
<ul>
<li>在Node页面,选择节点进行编辑,将默认的那个磁盘挂载停止并删除掉,然后添加前面挂载的数据盘路径并启用;</li>
</ul>
<p><img src="https://www.showdoc.com.cn/server/api/attachment/visitFile?sign=2f2797120fd5de95d921e4607271a970" alt="" /></p>
<hr />
<p><img src="https://www.showdoc.com.cn/server/api/attachment/visitFile?sign=acb6baa328e064518dc1506d459f402e" alt="" /></p>
<hr />
<p><img src="https://www.showdoc.com.cn/server/api/attachment/visitFile?sign=5557daaba1e62936b7d55549be7094cc" alt="" /></p>