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
网友评论