Skip to content

初始化存储节点

概述

  Kubernetes 支持多种类型的存储,如 NFS、Rook、Ceph 集群、Minio 等,这些存储将会被声明成卷,从而支持应用进行一些持久化存储。

  本文将列出一些常用的存储搭建过程,运维人员应根据实际情况选择。同时,为了减少 Kubernetes 管理员管理 PV 的工作量,在本文也提供了这些存储类型对应的 StorageClass 来自动管理 PV 的申请和释放的过程。

NFS

  NFS 是非常常用的文件存储技术,但是其存在单点故障,因此在生产环境需要慎用。

安装 NFS 服务

  选择一台服务器作为存储服务器,安装 nfs 相关服务。

bash
# 安装 nfs-utils 和 rpcbind
$ yum install -y nfs-utils rpcbind

# 启用 rpcbind
$ systemctl start rpcbind && systemctl enable rpcbind

# 测试 rpcbind 是否在运行
$ telnet 10.10.20.1 111
Trying 10.10.20.1...
Connected to 10.10.20.1.
Escape character is '^]'.
Connection closed by foreign host.

# 查看端口占用情况
$ netstat -tunlp | grep 111
tcp        0      0 0.0.0.0:111             0.0.0.0:*               LISTEN      6734/rpcbind        
tcp6       0      0 :::111                  :::*                    LISTEN      6734/rpcbind        
udp        0      0 0.0.0.0:111             0.0.0.0:*                           6734/rpcbind        
udp6       0      0 :::111                  :::*                                6734/rpcbind 

# 对外暴露存储
$ nano /etc/exports

# 以下是 /etc/exports 文件的内容
# /root/permanent 和 /root/temporary 是对外暴露的存储目录
# 10.10.20.0/24 表示只有 10.10.20.* 网段的服务器可以访问这个共享目录
# rw 表示读写权限,no_root_squash 表示使用者是 root 时,其权限转为匿名使用者
/root/permanent 10.10.20.0/24(rw,no_root_squash)
/root/temporary 10.10.20.0/24(rw,no_root_squash)

# 启用 nfs 服务
$ systemctl start nfs && systemctl enable nfs

# 测试
$ showmount -e 10.10.20.1
Export list for 10.10.20.1:
/root/temporary 10.10.20.0/24
/root/permanent 10.10.20.0/24

  由于不知道 Pod 会被调度到哪个节点,因此所有服务器的节点都需要安装上 nfs-utils 才能正常挂载(这个步骤在通用步骤时已经完成了)。

bash
# 其余工作节点只需要安装了就可以了,不需要做配置
$ yum install -y nfs-utils

使用 NFS

  在声明 Pod 时,可以直接使用这个 NFS 存储。

yaml
apiVersion: apps:/v1
kind: Deployment
metadta:
  name: deployment_name
spec:
  template:
    spec:
      containers:
        - name: container_name
          image: nginx:1.24.0
          volumeMounts:
            - name: data
              mountPath: /data
      volumes:
        - name: data
          nfs:
            server: 10.10.20.1
            path: /root/permanent

  物理/虚拟机如果想直接挂载 NFS,可以通过以下方式完成:

bash
# 启动 rpcbind 服务
$ systemctl enable rpcbind && systemctl start rpcbind

# 挂载 nfs 到指定目录
$ mkdir -p /nfs/permanent
$ mount -t nfs 10.10.20.1:/root/permanent /nfs/permanent

# 开机自动挂载 nfs
# 修改以下文件,在该文件最后一行加入以下代码即可
$ nano /etc/fstab

10.10.20.1:/root/permanent   /nfs/permanent   nfs   efaults  0 0

提示

  以上命令与 Kubernetes 的存储没有任何关系,不需要在物理/虚拟机上执行,仅做扩展知识。

StorageClass

  Kubernetes 在私有部署时,没有包含内置的 NFS StorageClasse 提供程序,因此需要运维人员安装额外的 StorageClass。这里使用 NFS Subdirectory External Provisione[链接]。为了方便开发者使用,在定义 StorageClass 时,将存储分为持久化存储和临时存储:

  • 持久化存储(nfs-permanent):pvc 删除时,其申请的空间会被立即回收,但不会被物理删除,需要管理员手动删除目录。
  • 临时存储(nfs-temporary):pvc 删除时,其申请的空间会被立即回收、删除。

  注意,nfs-permanentnfs-temporary 都是 nfs 存储,两者的区别只是提前定义好了回收策略和 StorageClass 名称,其余配置都是一致的。使用 Helm 来安装两个 StorageClass。

bash
# 安装 nfs-permanent
# nfs.server 是 NFS 服务器地址
# nfs.path 是 NFS 提供的挂载地址
$ helm install nfs-permanent mirror/nfs-permanent \
  -n kube-system \
  --set nfs.server=10.10.20.1 \
  --set nfs.path=/root/permanent

NAME: nfs-permanent
LAST DEPLOYED: Thu Jul 27 04:39:13 2023
NAMESPACE: kube-system
STATUS: deployed
REVISION: 1
TEST SUITE: None

# 安装 nfs-temporary
# nfs.server 是 NFS 服务器地址
# nfs.path 是 NFS 提供的挂载地址
$ helm install nfs-temporary mirror/nfs-temporary \
  -n kube-system \
  --set nfs.server=10.10.20.1 \
  --set nfs.path=/root/temporary

NAME: nfs-temporary
LAST DEPLOYED: Thu Jul 27 04:39:36 2023
NAMESPACE: kube-system
STATUS: deployed
REVISION: 1
TEST SUITE: None

# 查看 helm 部署情况
$ helm list -n kube-system
NAME         	NAMESPACE  	REVISION	UPDATED                                	STATUS  	CHART               	APP VERSION
kube-flannel 	kube-system	1       	2023-07-27 04:20:53.353204291 +0800 CST	deployed	kube-flannel-v0.22.0	v0.22.0    
nfs-permanent	kube-system	1       	2023-07-27 04:39:13.846105718 +0800 CST	deployed	nfs-permanent-4.0.18	4.0.2      
nfs-temporary	kube-system	1       	2023-07-27 04:39:36.230024145 +0800 CST	deployed	nfs-temporary-4.0.18	4.0.2      

# 查看 StorageClass 的部署情况
$ kubectl get sc
NAME                  PROVISIONER                   RECLAIMPOLICY   VOLUMEBINDINGMODE   ALLOWVOLUMEEXPANSION   AGE
permanent (default)   cluster.local/nfs-permanent   Delete          Immediate           true                   67s
temporary             cluster.local/nfs-temporary   Delete          Immediate           true                   45s

提示

  nfs-subdir-external-provisioner 还提供了很多高级选项,包括 PV 回收策略、磁盘回收策略等等。可以通过 helm pull mirror/nfs-subdir-external-provisioner 将 helm 包拉取到本地后,解压查看 values.yaml 文件了解更多。


Released under the MIT license.