zoukankan      html  css  js  c++  java
  • Kubernetes集群使用网络存储NFS

    NFS存储

    NFS即网络文件系统Network File System,它是一种分布式文件系统协议,最初是由Sun MicroSystems公司开发的类Unix操作系统之上的一款经典网络存储方案,其功能是在允许客户端主机可以像访问本地存储一样通过网络访问服务端文件。

    Kubernetes的NFS存储用于将某事先存在的NFS服务器导出export的存储空间挂载到Pod中来供Pod容器使用。与emptyDir不同的是,NFS存储在Pod对象终止后仅是被卸载而非删除。另外,NFS是文件系统及共享服务,它支持同时存在多路挂载请求。定义NFS存储时,常用到以下字段。

    •server:NFS服务器的IP地址或者主机名,必选字段。
    •path:NFS服务器导出(共享)的文件系统路径,必选字段。
    •readOnly:是否以只读挂载,默认为false。
    1.部署一个NFS服务 在集群之外的节点192.168.31.241

    #ubuntu部署
    sudo apt install nfs-kernel-server

    #centos部署
    yum -y install rpcbind nfs-utils
    #创建要共享的目录
    mkdir /data/redis -p

    #编辑NFS配置并加入以下内容
    vim /etc/exports
    /data/redis 192.168.31.0/24(rw,sync,no_all_squash,no_subtree_check)

    #载入配置
    exportfs -rv
    •/data/redis:NFS服务要共享的目录
    •192.168.31.0/24:允许访问NFS服务器的网段,也可以写 * ,表示所有地址都可以访问NFS服务
    •rw:访问到此目录的服务器都具备读写权限
    •sync:数据同步写入内存和硬盘
    •no_all_squash:所有用户对根目录具备完全管理访问权限
    •no_subtree_check:不检查父目录的权限
    启动NFS服务

    #ubuntu启动
    systemctl start nfs-kernel-server

    #centos启动
    systemctl start rpcbind nfs
    服务检查

    #查看NFS配置是否生效
    cat /var/lib/nfs/etab
    /data/redis 192.168.31.0/24(rw,sync,wdelay,hide,nocrossmnt,secure,root_squash,no_all_squash,no_subtree_check,secure_locks,acl,no_pnfs,anonuid=65534,anongid=65534,sec=sys,rw,secure,root_squash,no_all_squash)

    #通过showmount命令查看NFS共享情况
    showmount -e 192.168.31.241
    Export list for 192.168.31.241:
    /data/redis 192.168.31.0/24
    2.创建Pod资源配置清单 Pod中使用Redis镜像来运行容器,将Redis数据持久化至NFS服务器上,下面是简单实用Redis的一个示例:

    cat redis-nfs.yaml
    apiVersion: v1
    kind: Pod
    metadata:
    name: vol-nfs-pod
    labels:
    app: redis
    spec:
    containers:
    - name: redis
    image: redis:5.0 #镜像版本
    ports:
    - containerPort: 6379 #容器端口
    name: redisport
    volumeMounts:
    - mountPath: /data #卷挂载到容器中的目录
    name: redisdata #卷名称
    volumes:
    - name: redisdata #卷名称
    nfs: #使用NFS网络存储卷
    server: 192.168.31.241 #NFS服务器地址
    path: /data/redis #NFS服务器共享的目录
    readOnly: false #是否为只读
    上面的示例定义在资源配置文件vol-nfs.yaml中,其中的Pod资源拥有一个关联至NFS服务器192.168.31.241的存储卷,Redis容器将其挂载到容器中的/data目录上,它是运行于容器中的redis-server数据的持久保持位置。

    提示:这里应确保事先要存在一个名为192.168.31.241的NFS服务器,其输出了/data/redis目录,并授权给Kubernetes集群中的节点访问。主机和目录都可以按需进行调整。
    3.创建Pod对象并查看配置信息

    kubectl apply -f redis-nfs.yaml
    如下vol-nfs-pod被调度到了k8s-node03上

    kubectl get pods -o wide -l app=redis
    NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
    vol-nfs-pod 1/1 Running 0 106s 172.20.3.31 k8s-node03 <none> <none>
    kubectl describe pods/vol-nfs-pod
    Name: vol-nfs-pod
    Namespace: default
    Priority: 0
    Node: k8s-node03/192.168.31.233
    Start Time: Tue, 23 Jun 2020 13:47:29 +0800
    Labels: app=redis
    Annotations: Status: Running
    IP: 172.20.3.31
    IPs:
    IP: 172.20.3.31
    Containers:
    redis:
    Container ID: docker://dfa1a8202b39460db9e1d9849d6a4d416ab50a33e48fae556d1248a8efb3193b
    Image: redis:5.0
    Image ID: docker-pullable://redis@sha256:faea2a6e7fbd7e144cdb15e12ff16c24a5b8d9469e25796ec6d3b7a82a817e1b
    Port: 6379/TCP
    Host Port: 0/TCP
    State: Running
    Started: Tue, 23 Jun 2020 13:47:30 +0800
    Ready: True
    Restart Count: 0
    Environment: <none>
    Mounts:
    /data from redisdata (rw) #挂载到容器中的路径
    /var/run/secrets/kubernetes.io/serviceaccount from default-token-xxqkj (ro)
    Conditions:
    Type Status
    Initialized True
    Ready True
    ContainersReady True
    PodScheduled True
    Volumes:
    redisdata:
    Type: NFS (an NFS mount that lasts the lifetime of a pod) #NFS类型挂载
    Server: 192.168.31.241 #Server是192.168.31.241
    Path: /data/redis #Server的路径
    ReadOnly: false #不是只读
    default-token-xxqkj:
    Type: Secret (a volume populated by a Secret)
    SecretName: default-token-xxqkj
    Optional: false
    QoS Class: BestEffort
    Node-Selectors: <none>
    Tolerations: node.kubernetes.io/not-ready:NoExecute for 300s
    node.kubernetes.io/unreachable:NoExecute for 300s
    Events:
    Type Reason Age From Message
    ---- ------ ---- ---- -------
    Normal Scheduled 2m29s default-scheduler Successfully assigned default/vol-nfs-pod to k8s-node03
    Normal Pulled 2m28s kubelet, k8s-node03 Container image "redis:5.0" already present on machine
    Normal Created 2m28s kubelet, k8s-node03 Created container redis
    Normal Started 2m28s kubelet, k8s-node03 Started container redis
    4.查看容器挂载情况

    kubectl exec -it vol-nfs-pod -- df -hT | grep data
    Filesystem Type Size Used Avail Use% Mounted on
    192.168.31.241:/data/redis nfs4 59G 9.4G 47G 17% /data

    #查看/data目录下的数据
    kubectl exec -it vol-nfs-pod -- ls /data
    dump.rdb
    5.资源创建完成后,可通过其命令客户端redis-cli创建测试数据,并手动触发其同步于存储系统中

    kubectl exec -it vol-nfs-pod -- redis-cli
    127.0.0.1:6379> set mykey 'hello world'
    OK
    127.0.0.1:6379> get mykey
    "hello world"
    127.0.0.1:6379> BGSAVE
    Background saving started
    127.0.0.1:6379> exit
    6.测试数据持久化 为了测试数据持久化效果,下面删除Pod资源vol-nfs-pod,然后再对该Pod重建查看数据是否能够正常访问

    #删除Pod
    kubectl delete pods vol-nfs-pod

    #重建Pod
    kubectl apply -f redis-nfs.yaml

    #连接到Redis容器并查看数据持久化效果
    kubectl exec -it vol-nfs-pod -- redis-cli
    127.0.0.1:6379> keys *
    1) "mykey"
    127.0.0.1:6379> get mykey
    "hello world"
    如上所示可以看到,此前创建的mykey及其数据在Pod资源重建后依然存在。

  • 相关阅读:
    填空:类型转换1
    :其他基本数据类型存储空间大小
    10:Hello, World!的大小
    09:整型与布尔型的转换
    08:打印字符
    07:打印ASCII码
    06:浮点数向零舍入
    05:填空:类型转换2
    04:填空:类型转换1
    03:其他基本数据类型存储空间大小
  • 原文地址:https://www.cnblogs.com/guarderming/p/13237844.html
Copyright © 2011-2022 走看看