NFS介紹
NFS 是 Network FileSystem 的縮寫,顧名思義就是網(wǎng)絡文件存儲系統(tǒng), 分為服務端(Server)和客戶端(Client)。最早由 sun 公司開發(fā),是類 unix 系統(tǒng)間實現(xiàn)磁盤共享的一種方法。 它允許網(wǎng)絡中的計算機之間通過 TCP/IP 網(wǎng)絡共享資源。通過 NFS,我們本地 NFS 的客戶端應用可以透明地讀寫位于服務端 NFS 服務器上的文件,就像訪問本地文件一樣方便。簡單的理解,NFS 就是可以透過網(wǎng)絡,讓不同的主機、不同的操作系統(tǒng)可以共享存儲的服務。
NFS 在文件傳送或信息傳送過程中依賴于 RPC(Remote Procedure Call) 協(xié)議,即遠程過程調(diào)用,NFS 的各項功能都必須要向 RPC 來注冊,如此一來 RPC 才能了解 NFS 這個服務的各項功能 Port、PID、NFS 在服務器所監(jiān)聽的 IP 等,而客戶端才能夠透過 RPC 的詢問找到正確對應的端口,所以,NFS必須要有 RPC 存在時才能成功的提供服務,簡單的理解二者關系:NFS是 一個文件存儲系統(tǒng),而 RPC是負責信息的傳輸。
NFS共享存儲方式
1)手動方式靜態(tài)創(chuàng)建所需要的PV和PVC。
2)通過創(chuàng)建PVC動態(tài)地創(chuàng)建對應PV,無需手動創(chuàng)建PV。
NFS安裝
k8s集群所有節(jié)點都需要安裝NFS服務。本章節(jié)實驗我們選用k8s的master節(jié)點作為NFS服務的server端。
yum install -y nfs-utils rpcbind
創(chuàng)建共享目錄
在master節(jié)點創(chuàng)建目錄
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)
參數(shù)說明

啟動NFS服務
k8s集群所有節(jié)點啟動NFS服務。
systemctl start rpcbind
systemctl start nfs
設置開啟啟動
systemctl enable rpcbind
systemctl enable nfs
測試NFS服務
在另一臺 Linux 虛擬機上測試一下,是否能夠正確掛載:
showmount -e 192.168.198.156
在客戶端創(chuàng)建掛在目錄
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,那么
客戶端只能讀取,不能寫入,根據(jù)實際應用場景合理配置,這里就不在演示了。這里提一下,NFS 默認
使用 UDP 協(xié)議來進行掛載,為了提高 NFS 的穩(wěn)定性,可以使用 TCP 協(xié)議掛載,那么客戶端掛載命
令可使用如下命令
mount 192.168.198.156:/nfs/mysql /data/mysql -o proto=tcp -o nolock
客戶端卸載 NFS 掛載目錄
umount /data/mariadb/
強制卸載
umount -l /data/mariadb/
NFS4服務
使用NFS4協(xié)議方式進行多共享目錄配置。所有共享目錄的根目錄為/nfs/data。服務器端的/etc/exports文件中的配置為:
vi /etc/exports
/nfs/data *(rw,fsid=0,sync,no_wdelay,insecure_locks,no_root_squash)
K8S的靜態(tài)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/ #容器內(nèi)的掛載目錄
name: lagoumariadb #隨便給一個名字,這個名字必須與volumes.name一致
- mountPath: /var/lib/mysql #容器內(nèi)的掛載目錄
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: "省略中間數(shù)據(jù)部分,請各位同學前面章節(jié)"
kind: ConfigMap
metadata:
name: mariadbconfigmap
客戶端測試
IP:192.168.198.157
username:root
password:admin
prot: 30036
集群調(diào)度
k8s內(nèi)pod由scheduler調(diào)度,scheduler的任務是把pod分配到合適的node節(jié)點上。scheduler調(diào)度時會考慮到node節(jié)點的資源使用情況、port使用情況、volume使用情況等等...在此基礎之上,我們也可以控制pod的調(diào)度。
Scheduler 是 kubernetes 調(diào)度器,主要的任務是把定義的 pod 分配到集群的節(jié)點上。但要很多要考慮的問題:
1)公平:如何保證每個節(jié)點都能被合理分配資源,不要造成一個節(jié)點忙死,一個節(jié)點閑死局面。
2)資源高效利用:集群所有資源最大化被使用。內(nèi)存、硬盤、CPU等因素。
3)效率:調(diào)度的性能要好,能夠盡快地對大批量的 pod 完成調(diào)度工作。
4)靈活:允許用戶根據(jù)自己的需求控制調(diào)度的邏輯。
Sheduler 是作為單獨的程序運行,啟動之后會一直與 API Server保持通訊,獲取
PodSpec.NodeName 為空的 pod,對每個 pod 都會創(chuàng)建一個 binding,表明該 pod 應該放到哪個節(jié)點上 。
固定節(jié)點
Pod.spec.nodeSelector
前邊的課程已經(jīng)給大家介紹過
關鍵技能點:
1.給某一個節(jié)點打標簽
kubectl label nodes k8s-node01 mariadb=mariadb
2.pod的控制器中增加配置屬性
...
spec:
nodeSelector:
mariadb: mariadb
...
Pod.spec.nodeName
刪除k8s-node01節(jié)點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/ #容器內(nèi)的掛載目錄
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: "省略中間數(shù)據(jù)部分,請各位同學前面章節(jié)"
kind: ConfigMap
metadata:
name: mariadbconfigmap