自建K8S通过PVC配置NAS动态磁盘要点回顾

本文涉及的产品
文件存储 NAS,50GB 3个月
容器服务 Serverless 版 ACK Serverless,317元额度 多规格
容器服务 Serverless 版 ACK Serverless,952元额度 多规格
简介: 在K8S上如何配置永久性PVC是大家在生产环境中比较关心的话题,那么如果通过阿里云的NAS来结合进行永久性磁盘的配置呢?本文通过其详细步骤和要点把成功配置的方法给大家做一个分享。本文不做理论性阐述,纯实战,有不严谨之处还望评论指正。


为什么选择NAS主要有三个原因,一是管理方便,可以像本地磁盘一样进行文件管理和程序读写,只需要在目标Pod上进行简单的映射,不需要再单独写开发接口;二是NAS可以当作永久性磁盘使用,不用担心因为K8S问题影响数据本身,而且可以支持多Node读写;三是便宜!便宜!便宜!,虽然NAS单盘最高容量可高达1P,但是是按量计费,存

储可以说是白菜价。


背景:

K8S中基础的PVC管理工具是Longhorn,但是其灵活性差,不仅K8S系统出现问题的时候数据很难恢复,而且日常管理和维护也不方便,StorageClass支持的云接口很多,但是目前对阿里云的还不支持,我们只能手动来进行配置。

image.png

一、环境要求

K8S:阿里云ECS自建Linux:Ubuntu22.04+Rancher 7.0+RKE2

NAS:通用性NFS分区

二、环境准备

1、通过ECS安装Ubuntu22.04空白系统,安装上相关的Node节点(没有其他特殊要求,这里不再赘述)

image.png

2、配置好K8S相应的VPC和交换机(如果是跨账号或跨VPC请配置相应的云企业网以保证后续与NAS互通),指定或自动获取内网IP

image.png

3、根据自己需求选择NAS类型(一般选择通用型),然后进行配置专有网络:

image.png

在新建NAS的适合选择PVC或在建立后进行配置,效果都是一样的:

image.png

4、安装好NAS后获取其挂载点(格式为:98***0c-m***1.cn-zhangjiakou.nas.aliyuncs.com)保存,这个很重要。

image.png

image.png

至此,我们需要的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的时候选择:

image.png

脚本方式创建(可选)

kind: PersistentVolumeClaim
apiVersion: v1
metadata:
  name: pvc-nas
spec:
  accessModes:
  - ReadWriteMany
  storageClassName: alicloud-nas-51aspx
  resources:
    requests:
      storage: 20Gi

如果配置成功在NAS中可以看到K8SNode客户端的连接IP,如下图:

image.png

至此阿里云的NAS已经加载操作已经完成,后续大家可以根据自己的需要在pod中进行PVC的映射和数据处理。


另外大家很关心的是如果管理NAS中的数据,这个可以在阿里云控制台中直接把NAS附加到ECS上进行控制和管理,如下图:

image.png

通过SSH工具连接这台ECS就可以进行文件管理和维护了

image.png

注意事项总结:通过NAS来实现K8S的永久性磁盘是一个非常实用的方案,配置上要注意操作顺序和其中一些参数的变更,另外创建PVC的时候尽量选择ManyNodesRead-Write方式,因为会有多节点进行PVC操作的情况比较多,否则在pod或container映射磁盘的时候出现错误。另外磁盘映射的时候通过SSH工具或者命令查看NAS中完整的文件路径有助于准确的进行映射,关于NAS和K8S的绑定方式以及高级应用还有其他很多种,大家自行查阅资料吧。


参考阿里云官方文章:

https://www.alibabacloud.com/help/zh/nas/latest/use-the-csi-storage-plug-in-to-mount-a-nas-instance-mount-a-dynamically-provisioned-nas-volume#task-2342476

https://help.aliyun.com/document_detail/151416.html

相关实践学习
通过Ingress进行灰度发布
本场景您将运行一个简单的应用,部署一个新的应用用于新的发布,并通过Ingress能力实现灰度发布。
容器应用与集群管理
欢迎来到《容器应用与集群管理》课程,本课程是“云原生容器Clouder认证“系列中的第二阶段。课程将向您介绍与容器集群相关的概念和技术,这些概念和技术可以帮助您了解阿里云容器服务ACK/ACK Serverless的使用。同时,本课程也会向您介绍可以采取的工具、方法和可操作步骤,以帮助您了解如何基于容器服务ACK Serverless构建和管理企业级应用。 学习完本课程后,您将能够: 掌握容器集群、容器编排的基本概念 掌握Kubernetes的基础概念及核心思想 掌握阿里云容器服务ACK/ACK Serverless概念及使用方法 基于容器服务ACK Serverless搭建和管理企业级网站应用
目录
相关文章
|
3月前
|
JSON Kubernetes Shell
【Azure K8S | AKS】在不丢失文件/不影响POD运行的情况下增加PVC的大小
【Azure K8S | AKS】在不丢失文件/不影响POD运行的情况下增加PVC的大小
|
3月前
|
Kubernetes Shell Perl
【Azure K8S|AKS】进入AKS的POD中查看文件,例如PVC Volume Mounts使用情况
【Azure K8S|AKS】进入AKS的POD中查看文件,例如PVC Volume Mounts使用情况
|
3月前
|
存储 Kubernetes Go
【Azure K8S | AKS】在AKS集群中创建 PVC(PersistentVolumeClaim)和 PV(PersistentVolume) 示例
【Azure K8S | AKS】在AKS集群中创建 PVC(PersistentVolumeClaim)和 PV(PersistentVolume) 示例
|
3月前
|
存储 Kubernetes API
在K8S中,PVC创建和挂载失败原因有哪些?
在K8S中,PVC创建和挂载失败原因有哪些?
|
3月前
|
存储 Kubernetes 调度
在K8S中,PV和PVC是如何关联?
在K8S中,PV和PVC是如何关联?
|
2月前
|
存储 Kubernetes 测试技术
k8s使用pvc,pv,sc关联ceph集群
文章介绍了如何在Kubernetes中使用PersistentVolumeClaim (PVC)、PersistentVolume (PV) 和StorageClass (SC) 来关联Ceph集群,包括创建Ceph镜像、配置访问密钥、删除默认存储类、编写和应用资源清单、创建资源以及进行访问测试的步骤。同时,还提供了如何使用RBD动态存储类来关联Ceph集群的指南。
143 7
|
3月前
|
存储 Kubernetes 调度
在K8S中,什么是PV和PVC?
在K8S中,什么是PV和PVC?
|
3月前
|
存储 缓存 Kubernetes
在K8S中,有状态服务与无状态服务都是怎么使用pv和pvc?(可以通过应用场景说明一下)
在K8S中,有状态服务与无状态服务都是怎么使用pv和pvc?(可以通过应用场景说明一下)
|
3月前
|
Kubernetes 关系型数据库 MySQL
k8s练习--通过NFS+PV+PVC+POD,部署一个MySQL服务,并将MySQL的数据进行持久化存储
本文档介绍了如何使用Kubernetes (K8s)、NFS、PersistentVolume (PV)、PersistentVolumeClaim (PVC)和Pod来部署并实现MySQL服务的数据持久化存储。Kubernetes是一个用于自动化部署、扩展和管理容器化应用的强大平台。NFS作为一种网络文件系统协议,能够使Kubernetes集群中的Pod跨节点访问共享文件。PV和PVC机制则提供了持久化的存储解决方案,确保数据即使在Pod生命周期结束后仍得以保留。
149 0
|
3月前
|
存储 Kubernetes 调度
在k8S中,PV和PVC如何使用?
在k8S中,PV和PVC如何使用?