今日天气
  1. 博客/

在 Kubernetes 中部署 nfs storageClass

·1026 字·3 分钟· ·
devops k8s storage-class nfs
Johny
作者
Johny
熟练的 云原生搬砖师
Table of Contents

环境说明:
#

  • helm version: v3.4.2
  • kubernetes version: v1.19.6
  • nfs server: 192.168.8.66
  • sub-net: 192.168.8.0/24

nfs 服务端配置
#

yum install rpcbind nfs-utils -y  # 安装 nfs server

创建用户 & 数据目录
#

groupadd -g 2233 nfs-user

useradd nfs-user -M -s /sbin/nologin -u 2233 -g nfs-user

id  nfs-user

mkdir -p /data/nfs.sharedir

chown -R nfs-user /data/nfs.sharedir

服务端 配置文件修改
#

cat /etc/exports # 配置文件 如下:

/data/nfs.sharedir 192.168.8.0/24(rw,no_root_squash,no_all_squash,sync,anonuid=2233,anongid=2233)

​ 参数说明:

  • read-write,可读写;
  • ro:read-only,只读;
  • sync:文件同时写入硬盘和内存;
  • async:文件暂存于内存,而不是直接写入内存;
  • no_root_squash:NFS客户端连接服务端时如果使用的是 root 的话,那么对服务端分享的目录来说,也拥有 root 权限。显然开启这项是不安全的。
  • root_squash:NFS客户端连接服务端时如果使用的是 root 的话,那么对服务端分享的目录来说,拥有匿名用户权限,通常他将使用 nobody 或 nfsnobody 身份;
  • all_squash:不论NFS客户端连接服务端时使用什么用户,对服务端分享的目录来说都是拥有匿名用户权限;
  • anonuid:匿名用户的 UID 值,可以在此处自行设定。
  • anongid:匿名用户的 GID 值

执行配置 生效
#

exportfs -r

启动服务 & 设置服务开机自启
#

service rpcbind start  

service nfs start

systemctl enable nfs \
&& systemctl enable rpcbind  

nfs 客户端配置
#

⚠️ 注意如果在 k8s 中使用 nfs时,需要在每一个节点中多配置安装 rpcbind,因为 nfs 依赖于使用 rpc 协议进行通讯。

yum install rpcbind  rpcbind nfs-utils -y

service rpcbind start 
systemctl enable rpcbind  

客户端测试挂载
#

showmount -e [nfs-server]  # 查看服务端 可挂载目录

示例 showmount -e 192.168.8.66

image-20210119170611572

mount -t nfs 192.168.8.66:/data/nfs.sharedir /mnt

如网络不太稳定时,可以尝试切换为 tcp 协议

mount -t nfs 192.168.8.66:/data/nfs.sharedir /mnt -o proto=tcp -o nolock

部署 nfs storageClass
#

helm 添加仓库
#

helm repo add stable https://charts.helm.sh/stable

helm repo update

创建 helm 部署文件
#

cat > prod-values.yaml << EOF
storageClass:
  name: nfs-retain  
  reclaimPolicy: Retain 
nfs:
  server: 192.168.8.66
  path: '/data/nfs.sharedir'
EOF

reclaimPolicyPersistentVolumes(pv) 的回收策略,包括 “Retain”、“Recycle” 和 “Delete”。 对于动态配置的 PersistentVolumes 来说,默认回收策略为 “Delete”。 这表示当用户删除对应的 PersistentVolumeClaim 时,动态配置的 volume 将被自动删除。 如果 volume 包含重要数据时,这种自动行为可能是不合适的。 那种情况下,更适合使用 “Retain” 策略。 使用 “Retain” 时,如果用户删除 PersistentVolumeClaim,对应的 PersistentVolume 不会被删除。 相反,它将变为 Released 状态,表示所有的数据可以被手动恢复。

部署
#

部署至 kube-system 命名空间, storageClass 为 集群 概念,集群内任意命名空间多可以使用。

helm upgrade --install nfs-storage-class -f ./prod-values.yaml -n kube-system stable/nfs-client-provisioner

image-20210119205725301

image-20210119205744586

部署后的测试
#

cat <<EOF | kubectl apply -f -
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: sc-nginx-pvc
spec:
  accessModes:
    - ReadWriteOnce
  storageClassName: nfs-retain
  resources:
    requests:
      storage: 1Gi

---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: sc-nginx
  namespace: default
  labels:
    name: sc-nginx
spec:
  replicas: 2
  selector:
    matchLabels:
      name: sc-nginx
  template:
    metadata:
      labels:
       name: sc-nginx
    spec:
      containers:
      - name: sc-nginx
        image: nginx:1.16.0
        volumeMounts:
        - mountPath: /usr/share/nginx/html
          name: nginx-data
        ports:
        - containerPort: 80
      volumes:
      - name: nginx-data
        persistentVolumeClaim:
          claimName: sc-nginx-pvc
EOF

image-20210119201907839

nfs server 端口 echo 数据 至目录下的 index.html 文件内

echo 'hello' >>  /data/nfs.sharedir/default-sc-nginx-pvc-pvc-bd14929c-ed1f-4ede-baa7-a39de13ee169/index.html

image-20210119202614660

相关文章

初探 Traefik ingress gateway
·1594 字·4 分钟·
k8s devops traefik
Kind 部署本地k8s集群的使用记录
·326 字·1 分钟·
k8s docker devops centos7 kind
使用 Confluentinc 在 Kubernetes 集群中部署 Kafka 集群
·1133 字·3 分钟·
k8s kafka zookeeper helm
Rancher 单机部署,进行升级后,导致docker无法正常启动
·586 字·2 分钟·
k8s fix docker rancher
Coredns 出现间断性无法正常解析域名问题
·1536 字·4 分钟·
k8s coredns dns
使用 Docker 部署 Nexus3 私服的详细记录总结
·2798 字·6 分钟·
docker devops nexus3 install