为什么选择NAS主要有三个原因,一是管理方便,可以像本地磁盘一样进行文件管理和程序读写,只需要在目标Pod上进行简单的映射,不需要再单独写开发接口;二是NAS可以当作永久性磁盘使用,不用担心因为K8S问题影响数据本身,而且可以支持多Node读写;三是便宜!便宜!便宜!,虽然NAS单盘最高容量可高达1P,但是是按量计费,存
储可以说是白菜价。
背景:
K8S中基础的PVC管理工具是Longhorn,但是其灵活性差,不仅K8S系统出现问题的时候数据很难恢复,而且日常管理和维护也不方便,StorageClass支持的云接口很多,但是目前对阿里云的还不支持,我们只能手动来进行配置。
一、环境要求
K8S:阿里云ECS自建Linux:Ubuntu22.04+Rancher 7.0+RKE2
NAS:通用性NFS分区
二、环境准备
1、通过ECS安装Ubuntu22.04空白系统,安装上相关的Node节点(没有其他特殊要求,这里不再赘述)
2、配置好K8S相应的VPC和交换机(如果是跨账号或跨VPC请配置相应的云企业网以保证后续与NAS互通),指定或自动获取内网IP
3、根据自己需求选择NAS类型(一般选择通用型),然后进行配置专有网络:
在新建NAS的适合选择PVC或在建立后进行配置,效果都是一样的:
4、安装好NAS后获取其挂载点(格式为:98***0c-m***1.cn-zhangjiakou.nas.aliyuncs.com)保存,这个很重要。
至此,我们需要的K8S和NAS基本条件已经准备好,下面我们进行连通的操作和配置。
三、连通前的准备之K8S配置
1、在Node节点上安装NAS驱动工具(以ubuntu为例)
sudo apt-get install nfs-common -y
2、在K8S上进行配置
阿里云的NAS对于PVC的挂载分为静态存储卷和动态存储卷,动态存储卷又分为subpath和filesystem方式,我们这里选择动态存储卷的subpath方式(格式为:98***0c-m***1.cn-zhangjiakou.nas.aliyuncs.com:/default-pvcname-GUID),关于其区别大家请自行浏览阿里官方文章,好了下面我们进行实操,大家务必按照我的步骤来操作:
a.创建用于部署NAS-Controller的YAML文件并另外为nas-controller.yaml并在K8S中执行。
apiVersion: v1 kind: ServiceAccount metadata: name: alicloud-nas-controller namespace: kube-system --- kind: ClusterRole apiVersion: rbac.authorization.k8s.io/v1 metadata: name: alicloud-nas-controller rules: - apiGroups: [""] resources: ["persistentvolumes"] verbs: ["get", "list", "watch", "create", "delete"] - apiGroups: [""] resources: ["persistentvolumeclaims"] verbs: ["get", "list", "watch", "update"] - apiGroups: ["storage.k8s.io"] resources: ["storageclasses"] verbs: ["get", "list", "watch"] - apiGroups: [""] resources: ["events"] verbs: ["list", "watch", "create", "update", "patch"] - apiGroups: [""] resources: ["endpoints"] verbs: ["get", "watch", "list", "delete", "update", "create"] --- kind: ClusterRoleBinding apiVersion: rbac.authorization.k8s.io/v1 metadata: name: alicloud-nas-controller subjects: - kind: ServiceAccount name: alicloud-nas-controller namespace: kube-system roleRef: kind: ClusterRole name: alicloud-nas-controller apiGroup: rbac.authorization.k8s.io --- kind: Deployment apiVersion: apps/v1 metadata: name: alicloud-nas-controller namespace: kube-system spec: selector: matchLabels: app: alicloud-nas-controller strategy: type: Recreate template: metadata: labels: app: alicloud-nas-controller spec: tolerations: - operator: Exists affinity: nodeAffinity: preferredDuringSchedulingIgnoredDuringExecution: - weight: 1 preference: matchExpressions: - key: node-role.kubernetes.io/master operator: Exists requiredDuringSchedulingIgnoredDuringExecution: nodeSelectorTerms: - matchExpressions: - key: type operator: NotIn values: - virtual-kubelet priorityClassName: system-node-critical serviceAccount: alicloud-nas-controller hostNetwork: true containers: - name: nfs-provisioner image: registry.cn-hangzhou.aliyuncs.com/acs/alicloud-nas-controller:v1.14.8.17-7b898e5-aliyun env: - name: PROVISIONER_NAME value: alicloud/nas securityContext: privileged: true volumeMounts: - mountPath: /var/log name: log volumes: - hostPath: path: /var/log name: log
b.以下代码创建StorageClass并另存为sc-nas.yaml后加载执行。
apiVersion: storage.k8s.io/v1 kind: StorageClass metadata: name: alicloud-nas-51Aspx mountOptions: - nolock,tcp,noresvport - vers=3 parameters: volumeAs: subpath server: "98***0c-m***1.cn-zhangjiakou.nas.aliyuncs.com"#在一(4)中获取的NAS路径 provisioner: alicloud/nas reclaimPolicy: Retain
以上代码创建了名为alicloud-nas-51aspx的StorageClass,可以通过手动或执行脚本PVC的时候选择:
脚本方式创建(可选)
kind: PersistentVolumeClaim apiVersion: v1 metadata: name: pvc-nas spec: accessModes: - ReadWriteMany storageClassName: alicloud-nas-51aspx resources: requests: storage: 20Gi
如果配置成功在NAS中可以看到K8SNode客户端的连接IP,如下图:
至此阿里云的NAS已经加载操作已经完成,后续大家可以根据自己的需要在pod中进行PVC的映射和数据处理。
另外大家很关心的是如果管理NAS中的数据,这个可以在阿里云控制台中直接把NAS附加到ECS上进行控制和管理,如下图:
通过SSH工具连接这台ECS就可以进行文件管理和维护了
注意事项总结:通过NAS来实现K8S的永久性磁盘是一个非常实用的方案,配置上要注意操作顺序和其中一些参数的变更,另外创建PVC的时候尽量选择ManyNodesRead-Write方式,因为会有多节点进行PVC操作的情况比较多,否则在pod或container映射磁盘的时候出现错误。另外磁盘映射的时候通过SSH工具或者命令查看NAS中完整的文件路径有助于准确的进行映射,关于NAS和K8S的绑定方式以及高级应用还有其他很多种,大家自行查阅资料吧。
参考阿里云官方文章: