云原生系列(七)—在k8s部署trident对接ontap的nfs存储并创建动态存储类

 云原生系列(一)一rancher高可用部署-CSDN博客

云原生系列(二)—单节点多盘位minio部署-CSDN博客

云原生系列(三)一rancher备份-CSDN博客

云原生系列(四)—快速创建k8s生产集群-CSDN博客

云原生系列(五)—metallb安装及layer-2负载配置_metallb 安装-CSDN博客

云原生系列(六)—longhorn分布式存储部署_longhorn 存储-CSDN博客

云原生系列(七)—在k8s部署trident对接ontap的nfs存储并创建动态存储类-CSDN博客

参考文档:

Asta Trident 24.02文档

The Trident operator faichls to install via Helm on Rancher · Issue #839 · NetApp/trident · GitHub

SVM has no assigned aggregates · Issue #112 · NetApp/trident · GitHub

ontap配置命令文档自己研究找对应版本了

集群提供商: RKE2

Kubernetes 版本: v1.27.11 +rke2r1

存储硬件:联想DM5000H( ontap 9.14.1P1)

基本情况及原理:

基本情况:集群是之前的教程里搭建的生产集群,但是有个问题就是,物理机工作节点采用longhorn存储需要新买硬盘与raid直通卡,无法充分利旧公司已有设备。机房有闲置的联想dm5000h存储,内置系统也是ontap9。支持ontapapi的方式对接。

使用k8s官方的nfs-driver-csi的时候,实测是无法实现pvc和pv的扩容,实际上这个容量限制也是没有用的,因为本身nfs是你共享了一个目录,假定这个目录是最大100G,你的每个pvc实际是里面的文件夹,pvc的大小限制毫无意义,因为这个csi和nfs的沟通就没有关于空间限制这块的。

本质是通过trident与ontapapi对接之后,存储端只创建svm以及aggregate,trident安装时也是带上了nfs-driver-csi,你可以利旧为trident作为中间控制者在存储端创建对应的pv并告知了nfs-driver-csi,然后nfs-driver-csi在k8s这端创建对应的pvc,对于容量的限制和热扩,也是这么个过程,大概是这么个意思。不知道这一段我说的对不对,我的个人理解是这样的。

一、helm部署trident

01、helm部署

trident是netapp官方出的用于k8s与netapp等多个存储对接的csi,差不多可以这么理解。

添加helm仓库(任一master节点执行)

helm repo add netapp-trident https://netapp.github.io/trident-helm-chart

如果你的生产集群和我一样是用rancher拉起的rke2集群,需要进行这一步

 创建1个yaml文件(任一master节点执行)

vi trident-rbac.yaml

文件内容如下(任一master节点执行)

apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
  name: trident-operator-psa
rules:
- apiGroups:
  - management.cattle.io
  resources:
  - projects
  verbs:
  - updatepsa
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
  name: trident-operator-psa
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: trident-operator-psa
subjects:
- kind: ServiceAccount
  name: trident-operator
  namespace: trident

 保存文件后应用到k8s集群(任一master节点执行)

kubectl apply -f trident-rbac.yaml

使用helm安装trident(任一master节点执行),这里的源我做了替换,否则会无法拉去镜像

helm install trient netapp-trident/trident-operator --version 100.2402.0 --set imageRegistry=k8s.m.daocloud.io/sig-storage --set operatorImage=docker.m.daocloud.io/netapp/trident-operator:24.02.0 --set tridentAutosupportImage=docker.m.daocloud.io/netapp/trident-autosupport:24.02 --set tridentImage=docker.m.daocloud.io/netapp/trident:24.02.0 --create-namespace --namespace trident

 02、tridentctl安装

wget https://github.com/NetApp/trident/releases/download/v24.02.0/trident-installer-24.02.0.tar.gz
tar -xf trident-installer-24.02.0.tar.gz
cd trident-installer
sudo mv tridentctl  /usr/local/bin

 二、存储端配置

01、nfs通信网口配置(图形化更好配,但是命令行装大逼啊)

我的存储是两个控制器,每个控制器各2个多余的10G光口,每个控制器的2个光口配置成一个聚合口

交换机端配置对应lacp链路聚合就不写了。存储的基础管理配置开局这些也不写了,这个都不知道不会的,也别看我教程了吧。

创建ipspace,后面做故障转移用的上

network ipspace create -ipspace nfs

 查看ipspace

network ipspace show

如图所示

创建广播域

network port broadcast-domain create -broadcast-domain nfs -ipspace nfs

 查看广播域

network port broadcast-domain show

如图所示

创建存储链路聚合口

network port aggregate create -node DM500H-01 -mode multimode_lacp -distr-func ip -ifgrp a1a
network port aggregate create -node DM500H-02 -mode multimode_lacp -distr-func ip -ifgrp a2a

 查看存储聚合口

network port ifgrp show

如图所示聚合口已创建

 链路聚合口移除默认广播域

network port broadcast-domain remove-ports -broadcast-domain Default -ports DM500H-01:e0e
network port broadcast-domain remove-ports -broadcast-domain Default -ports DM500H-01:e0f
network port broadcast-domain remove-ports -broadcast-domain Default -ports DM500H-02:e0e
network port broadcast-domain remove-ports -broadcast-domain Default -ports DM500H-02:e0f

 物理口添加到聚合接口

network port ifgrp add-port -node DM500H-01 -ifgrp a0a -port e0e
network port ifgrp add-port -node DM500H-01 -ifgrp a0a -port e0f
network port ifgrp add-port -node DM500H-02 -ifgrp a0a -port e0e
network port ifgrp add-port -node DM500H-02 -ifgrp a0a -port e0f

注意了,我的版本会在这个时候自动创建一个广播域,然后把聚合口加进去了。

查看接口广播域命令

net port show

如图所示 

 

我实际的需求是聚合口要在一开始创建的名为nfs的广播域和名为nfs的ipspace里面。

继续修改


network port broadcast-domain remove-ports -broadcast-domain Default-1 -ports DM500H-01:a0a
network port broadcast-domain remove-ports -broadcast-domain Default-1 -ports DM500H-02:a0a
network port broadcast-domain add-ports -broadcast-domain nfs -ports DM500H-01:a0a -ipspace nfs
network port broadcast-domain add-ports -broadcast-domain nfs -ports DM500H-02:a0a -ipspace nfs

修改完成查看情况

02、创建存储层(不装逼了,图形化配置)

登陆存储的管理界面,这台联想的DM5000H是支持中文的。本质还是netapp的产品一样。

点个保存完事

搞定如下图 

03、svm创建及nfs的ip配置(继续命令行装逼)

svm0就是用于后面对接给k8s的存储类用的,svm1是存储系统用的。

vserver create -vserver svm0 -subtype default -rootvolume svm1 -aggregate dm5000h -ipspace nfs -rootvolume-security-style unix

查看svm0信息

vserver show -vserver svm0 

 如图所示

设置一下结束

vserver modify -vserver svm0 -aggr-list dm5000h

 开启svm0的nfs

vserver nfs create -vserver svm0
vserver nfs modify -vserver svm0 -v3 enabled -v4.0 enabled -v4.1 enabled

配置nfs的ip

network interface create -vserver svm0 -lif lif_nfs1 -role data  -home-node DM500H-01 -home-port a0a -address 10.10.107.190 -netmask 255.255.255.0

配置用于ontapapi对接的ip 

net interface create -vserver svm0 -lif lif_nfs2 -role data -data-protocol none -home-node DM500H-01 -home-port a0a -address 10.10.107.191 -netmask 255.255.255.0

配置网关

net route create -vserver svm0 -destination 0.0.0.0/0 -gateway 10.10.107.1

可以在k8s集群上ping下nfs的ip和对接ontapapi的ip,通了就ok了。

04、svm0的导出策略,也就是访问控制配置

 

我是图省事设了一个地址段,你们可以自行决定

 回到这一步,如下图

拉到最下面点进去

自己设置用户名密码

 存储这边配置结束了。

三、trident配置backend、存储类

01、配置backend

登陆集群随便哪个master节点

创建配置文件

vi backend.yaml

内容如下

version: 1
backendName: dm5000h    #自己定义一个名字
storageDriverName: ontap-nas    #我用的nfs方式,这里写这个,其他方式自己看官网去
managementLIF: 10.10.107.191    #前面在存储配置的管理ip
dataLIF: 10.10.107.190           #前面在存储配置的nfs的ip
svm: svm0                        #存储里创建的svm
username: k8s                    #存储里创建的账号
password: q488pXTyuaJUwsQB         #存储里创建的账号的密码
aggregate: dm5000h                #存储里创建的层

保存文件后添加到集群去。

tridentctl -n trident create backend -f backend.yaml

创建成功会提示如下图

02、配置存储类

登陆集群随便哪个master节点

创建存储类配置文件

vi storage-netapp-csi.yaml

内容如下 

apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: dm5000h
provisioner: csi.trident.netapp.io
parameters:
  backendType: "ontap-nas"
  fsType: "xfs"
reclaimPolicy: Delete
allowVolumeExpansion: true

保存应用到k8s集群

kubectl apply -f storage-netapp-csi.yaml

后面就是创建pvc使用了,不写了,实侧创建pvc自动创建卷,热扩容都没问题。

每创建一个pvc,存储里面会自动创建一个卷。登陆存储可以看到

  • 22
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
你可以使用navigator对象来检测浏览器类型,具体实现代码如下: ``` var isIE = navigator.userAgent.indexOf("MSIE") !== -1 || navigator.userAgent.indexOf("Trident") !== -1; var isEdge = navigator.userAgent.indexOf("Edge") !== -1; var isFirefox = navigator.userAgent.indexOf("Firefox") !== -1; var isChrome = navigator.userAgent.indexOf("Chrome") !== -1; var isSafari = navigator.userAgent.indexOf("Safari") !== -1 && navigator.userAgent.indexOf("Chrome") === -1; if (isIE) { // 加载IE浏览器对应的CSS文件 var link = document.createElement("link"); link.href = "ie.css"; link.rel = "stylesheet"; document.head.appendChild(link); } else if (isEdge) { // 加载Edge浏览器对应的CSS文件 var link = document.createElement("link"); link.href = "edge.css"; link.rel = "stylesheet"; document.head.appendChild(link); } else if (isFirefox) { // 加载Firefox浏览器对应的CSS文件 var link = document.createElement("link"); link.href = "firefox.css"; link.rel = "stylesheet"; document.head.appendChild(link); } else if (isChrome) { // 加载Chrome浏览器对应的CSS文件 var link = document.createElement("link"); link.href = "chrome.css"; link.rel = "stylesheet"; document.head.appendChild(link); } else if (isSafari) { // 加载Safari浏览器对应的CSS文件 var link = document.createElement("link"); link.href = "safari.css"; link.rel = "stylesheet"; document.head.appendChild(link); } ``` 以上实现方法可根据不同的浏览器类型加载相应的CSS文件。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值