在 Kubernetes 中,部署云原生 NFS 存储
问题描述
我们常用的存储软件(比如 NFS、Ceph、EdgeFS、YugabyteDB 等等)并不具备(或仅具备部分)高可用、自愈、自动扩展等等特性。
解决方案
Rook,是开源的云原生存储编排器,提供平台,框架,支持“多种本机存储解决方案”与“云原生环境”集成。Rook 基于底层云原生平台对这些存储软件进行强化。通过使用“__底层的云原生容器管理、调度、协调平台提供的__”基础设施,来为存储服务添加 自我管理、自我缩放、自愈的 等等特性。它通过自动部署、引导、配置、部署、缩放、升级、迁移、灾难恢复,监控,资源管理来实现。
该笔记将记录在 Kubernetes 中如何部署 Rook 服务,底层使用 NFS 存储,以及常见问题解决办法。
环境要求
- Kubernetes v1.16 or higher
- The desired volume to export needs to be attached to the NFS * server pod via a PVC
- NFS client packages must be installed on all nodes where * Kubernetes might run pods with NFS mounted.
环境信息
- Rook NFS v1.7(03/14/2022),建议阅读 NFS Docs/v1.7 文档以了解更多细节,这里我们仅记录适用于我们环境的部署过程。
- Kubernetes HA Cluster 1.18.20, worker k8s-storage as dedicated storage node
关于存储
- 简单的拓扑结构为 Normal Pod ⇒ Storage Class ⇒ NFS Server ⇒ PVC ⇒ PV (hostPath) 所以我们以 hostPath 方式来提供最终的存储;
- 通过专用的存储节点,即 Kubernetes Worker 但是不会向该节点调度 Pod 实例(通过 Taint 及 Namespace defaultTolerations 来实现);
准备工作
1 | # Taint node,以专用于存储 |
第一步、部署 NFS Operator 组件
1 | git clone --single-branch --branch v1.7.3 https://github.com/rook/nfs.git |
补充说明:
- Operator 是否调度到 k8s-storage(专用存储节点)并不重要;
第二步、创建 NFS Server 服务
rbac.yaml
1 |
|
nfs-server.yaml
1 |
|
查看结果:
1 | # kubectl -n rook-nfs get nfsservers.nfs.rook.io |
第三步、使用 NFS 存储
storage-class.yaml
1 | apiVersion: storage.k8s.io/v1 |
testing.yaml
1 | apiVersion: v1 |
补充说明
Pod 通过 Service 进行 NFS 挂载:
1 | # kubectl -n rook-nfs get service rook-nfs |
调试追踪
1 | kubectl -n rook-nfs-system logs -l app=rook-nfs-operator |
参考文献
- Default Toleration at Namespace Level | by Zhimin Wen | Medium
- DaemonSet not respecting Namespace defaultTolerations · Issue #94722 · kubernetes/kubernetes
- Taints and Tolerations | Kubernetes
- plugins - k3s node restriction for namespace - Stack Overflow
- Rook NFS/v1.7.3/Network Filesystem (NFS) Quickstart