K8S之NFS存儲卷

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ù)說明
image.png
啟動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
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容