美文网首页
K8S之NFS存储卷

K8S之NFS存储卷

作者: david161 | 来源:发表于2022-03-23 10:02 被阅读0次

NFS介绍

NFS 是 Network FileSystem 的缩写,顾名思义就是网络文件存储系统, 分为服务端(Server)和客户端(Client)。最早由 sun 公司开发,是类 unix 系统间实现磁盘共享的一种方法。 它允许网络中的计算机之间通过 TCP/IP 网络共享资源。通过 NFS,我们本地 NFS 的客户端应用可以透明地读写位于服务端 NFS 服务器上的文件,就像访问本地文件一样方便。简单的理解,NFS 就是可以透过网络,让不同的主机、不同的操作系统可以共享存储的服务。
NFS 在文件传送或信息传送过程中依赖于 RPC(Remote Procedure Call) 协议,即远程过程调用,NFS 的各项功能都必须要向 RPC 来注册,如此一来 RPC 才能了解 NFS 这个服务的各项功能 Port、PID、NFS 在服务器所监听的 IP 等,而客户端才能够透过 RPC 的询问找到正确对应的端口,所以,NFS必须要有 RPC 存在时才能成功的提供服务,简单的理解二者关系:NFS是 一个文件存储系统,而 RPC是负责信息的传输。

NFS共享存储方式

1)手动方式静态创建所需要的PV和PVC。
2)通过创建PVC动态地创建对应PV,无需手动创建PV。

NFS安装

k8s集群所有节点都需要安装NFS服务。本章节实验我们选用k8s的master节点作为NFS服务的server端。
yum install -y nfs-utils rpcbind

创建共享目录

在master节点创建目录 
mkdir -p /nfs/mariadb 
chmod 777 /nfs/mariadb 

更改归属组与用户 
chown nfsnobody /nfs/mariadb 
或者
chown -R nfsnobody:nfsnobody /nfs/mariadb 

vi /etc/exports 
/nfs/mariadb *(rw,no_root_squash,no_all_squash,sync)
参数说明
image.png
启动NFS服务

k8s集群所有节点启动NFS服务。

systemctl start rpcbind 
systemctl start nfs 

设置开启启动 
systemctl enable rpcbind 
systemctl enable nfs
测试NFS服务
在另一台 Linux 虚拟机上测试一下,是否能够正确挂载: 
showmount -e 192.168.198.156 

在客户端创建挂在目录 
mkdir -p /data/mariadb 

挂载远端目录到本地 /data/mariadb 目录 
mount 192.168.198.156:/nfs/mariadb /data/mariadb 

NFS服务端写入 
$ echo "This is NFS server." > /nfs/mariadb/nfs.txt 

客户端读取 
cat /data/mariadb/nfs.txt 

客户端写入 
$ echo "This is NFS client." >> /data/mariadb/nfs.txt 

服务端读取 
$ cat /nfs/mariadb/nfs.txt 

都是没问题的,这是因为上边设置了 NFS 远端目录权限为 rw 拥有读写权限,如果设置为 ro,那么 
客户端只能读取,不能写入,根据实际应用场景合理配置,这里就不在演示了。这里提一下,NFS 默认 
使用 UDP 协议来进行挂载,为了提高 NFS 的稳定性,可以使用 TCP 协议挂载,那么客户端挂载命 
令可使用如下命令 

mount 192.168.198.156:/nfs/mysql /data/mysql -o proto=tcp -o nolock

客户端卸载 NFS 挂载目录

umount /data/mariadb/ 

强制卸载 
umount -l /data/mariadb/

NFS4服务

使用NFS4协议方式进行多共享目录配置。所有共享目录的根目录为/nfs/data。服务器端的/etc/exports文件中的配置为: 
vi /etc/exports 

/nfs/data *(rw,fsid=0,sync,no_wdelay,insecure_locks,no_root_squash) 

K8S的静态NFS服务PV的nfs:path 的值不用写共享根目录,直接写/mariadb即可。K8S会帮我们配置成
/nfs/data/mariadb目录 

重启NFS 
systemctl restart rpcbind 
systemctl restart nfs

pv配置

mountOptions: 
  - hard 
  - nfsvers=4.1 
nfs:
  path: /mariadb 
  server: 192.168.198.156

全部配置文件清单

pv

nfs/mariadbpv.yml

apiVersion: v1 
kind: PersistentVolume 
metadata: 
  name: data-mariadb-pv 
  labels: 
    app: mariadb-pv 
spec: 
  accessModes: 
    - ReadWriteOnce 
  capacity: 
    storage: 10Gi 
  mountOptions:
    - hard 
    - nfsvers=4.1 
  nfs:
    path: /mariadb 
    server: 192.168.198.156 
  persistentVolumeReclaimPolicy: Retain 
  storageClassName: standard 
  volumeMode: Filesystem

pvc
nfs/mariadbpvc.yml

apiVersion: v1 
kind: PersistentVolumeClaim 
metadata: 
  name: mariadb-pvc 
  labels: 
    app: mariadb-pvc 
spec: 
  accessModes: 
    - ReadWriteOnce 
  storageClassName: standard 
  resources: 
    requests: 
      storage: 5Gi

service
nfs/mariadb.yml

apiVersion: apps/v1 
kind: Deployment 
metadata: 
  name: mariadb-deploy 
  labels: 
    app: mariadb-deploy 
spec: 
  replicas: 1 
  template: 
    metadata: 
      name: mariadb-deploy 
      labels: 
        app: mariadb-deploy 
    spec: 
      imagePullSecrets: 
        - name: lagouharbor 
      containers: 
        - name: mariadb-deploy 
          image: 192.168.198.155:5000/lagouedu/mariadb:10.5.2 
          imagePullPolicy: IfNotPresent 
          ports: 
            - containerPort: 3307
          env:
            - name: MYSQL_ROOT_PASSWORD 
              #这是mysqlroot用户的密码 
              valueFrom: 
                secretKeyRef: 
                  key: password 
                  name: mariadbsecret 
            - name: TZ 
              value: Asia/Shanghai 
              args: 
                - "--character-set-server=utf8mb4" 
                - "--collation-server=utf8mb4_unicode_ci" 
              volumeMounts: 
                - mountPath: /etc/mysql/mariadb.conf.d/  #容器内的挂载目录 
                  name: lagoumariadb #随便给一个名字,这个名字必须与volumes.name一致 
                - mountPath: /var/lib/mysql #容器内的挂载目录 
                  name: volume-mariadb 
      restartPolicy: Always 
      volumes: 
        - name: lagoumariadb 
          configMap: 
            name: mariadbconfigmap 
        - name: volume-mariadb 
            persistentVolumeClaim: 
              claimName: mariadb-pvc 
  selector: 
    matchLabels: 
      app: mariadb-deploy 
--- 
apiVersion: v1 
kind: Service 
metadata: 
  name: mariadb-svc 
spec: 
  selector: 
    app: mariadb-deploy 
  ports: 
    - port: 3307 
      targetPort: 3307 
      nodePort: 30036 
  type: NodePort

secret
nfs/mariadbsecret.yml

apiVersion: v1 
kind: Secret 
metadata: 
  name: mariadbsecret 
type: Opaque 
data: 
  password: YWRtaW4=

configmap
nfs/mariadb.yml

apiVersion: v1 
data: 
  my.cnf: "省略中间数据部分,请各位同学前面章节" 
kind: ConfigMap 
metadata: 
    name: mariadbconfigmap

客户端测试

IP:192.168.198.157 
username:root 
password:admin 
prot: 30036

集群调度

k8s内pod由scheduler调度,scheduler的任务是把pod分配到合适的node节点上。scheduler调度时会考虑到node节点的资源使用情况、port使用情况、volume使用情况等等...在此基础之上,我们也可以控制pod的调度。
Scheduler 是 kubernetes 调度器,主要的任务是把定义的 pod 分配到集群的节点上。但要很多要考虑的问题:
1)公平:如何保证每个节点都能被合理分配资源,不要造成一个节点忙死,一个节点闲死局面。
2)资源高效利用:集群所有资源最大化被使用。内存、硬盘、CPU等因素。
3)效率:调度的性能要好,能够尽快地对大批量的 pod 完成调度工作。
4)灵活:允许用户根据自己的需求控制调度的逻辑。
Sheduler 是作为单独的程序运行,启动之后会一直与 API Server保持通讯,获取
PodSpec.NodeName 为空的 pod,对每个 pod 都会创建一个 binding,表明该 pod 应该放到哪个节点上 。

固定节点

Pod.spec.nodeSelector

前边的课程已经给大家介绍过 

关键技能点: 
1.给某一个节点打标签 
kubectl label nodes k8s-node01 mariadb=mariadb

2.pod的控制器中增加配置属性 
... 
    spec: 
      nodeSelector: 
        mariadb: mariadb 
...
Pod.spec.nodeName
删除k8s-node01节点mariadb的label 
kubectl label nodes k8s-node02 mariadb- 

kubectl label nodes k8s-node02 --show-labels

修改label案例用于演示nodeName属性,pod控制器关键代码

spec: 
  nodeName: k8s-node02

全部资源文件清单

controller

labels/mariadb.yml

apiVersion: apps/v1 
kind: Deployment 
metadata: 
  name: mariadb-deploy 
  labels: 
    app: mariadb-deploy 
spec: 
  replicas: 1 
  template: 
    metadata: 
      name: mariadb-deploy 
      labels: 
        app: mariadb-deploy 
    spec: 
      nodeName: k8s-node02 
      imagePullSecrets: 
        - name: lagouharbor 
      containers: 
        - name: mariadb-deploy 
          image: 192.168.198.155:5000/lagouedu/mariadb:10.5.2 
          imagePullPolicy: IfNotPresent 
          ports: 
            - containerPort: 3307
          env:
            - name: MYSQL_ROOT_PASSWORD 
              #这是mysqlroot用户的密码 
              valueFrom: 
                secretKeyRef: 
                  key: password 
                  name: mariadbsecret 
            - name: TZ 
              value: Asia/Shanghai 
          args: 
            - "--character-set-server=utf8mb4" 
            - "--collation-server=utf8mb4_unicode_ci" 
          volumeMounts: 
            - mountPath: /etc/mysql/mariadb.conf.d/ #容器内的挂载目录 
              name: lagoumariadb #随便给一个名字,这个名字必须与volumes.name一致 
      restartPolicy: Always 
        volumes: 
          - name: lagoumariadb 
            configMap: 
              name: mariadbconfigmap 
  selector: 
    matchLabels: 
      app: mariadb-deploy
--- 
apiVersion: v1 
kind: Service 
metadata: 
  name: mariadb-svc 
spec: 
  selector: 
    app: mariadb-deploy 
  ports: 
    - port: 3307 
      targetPort: 3307 
      nodePort: 30036 
  type: NodePort

secret
labels/mariadbsecret.yml

apiVersion: v1 
kind: Secret 
metadata: 
  name: mariadbsecret 
type: Opaque 
data: 
  password: YWRtaW4=

configmap
labels/mariadb.yml

apiVersion: v1 
data: 
  my.cnf: "省略中间数据部分,请各位同学前面章节" 
kind: ConfigMap 
metadata: 
  name: mariadbconfigmap

相关文章

网友评论

      本文标题:K8S之NFS存储卷

      本文链接:https://www.haomeiwen.com/subject/jwwzdrtx.html