k8s--數據存儲、HostPath、NFS 存儲


HostPath

在使用 EmptyDir 的時候,EmptyDir 中數據不會被持久化,它會隨着 pod 的結束而銷毀,如果想簡單的將數據持久化到主機中,可以選擇 HostPath

HostPath 就是將 Node 主機中一個實際目錄掛載到 pod 中,以供容器使用,這樣的設計就可以保證 pod 銷毀了,但是數據依然可以存在於 Node 主機上

創建一個 volume-hostpath.yaml,內容如下

apiVersion: v1
kind: Pod # 類型為 pod
metadata:
  name: volume-hostpath # pod 的名稱
  namespace: zouzou
spec:
  containers:
  - name: nginx
    image: nginx:1.14
    ports:
    - containerPort: 80 # 暴露容器的端口
    volumeMounts: # 掛載
    - name: logs-volume # 要和 volumes 的name 一致
      mountPath: /var/log/nginx
  - name: busybox
    image: busybox:1.30
    command: ["/bin/sh","-c","tail -f /logs/access.log"]
    volumeMounts:
    - name: logs-volume
      mountPath: /logs
  volumes:
  - name: logs-volume  # 
    hostPath: 
      path: /tmp/logs # 掛載到 node 主機上的 /tmp/log 目錄下
      type: DirectoryOrCreate  # 目錄存在就使用,不存在就先創建后使用

關於type的值的一點說明:

  • DirectoryOrCreate:目錄存在就使用,不存在就先創建后使用
  • Directory:目錄必須存在
  • FileOrCreate:文件存在就使用,不存在就先創建后使用
  • File:文件必須存在
  • Socket:unix 套接字必須存在
  • CharDevice:字符設備必須存在
  • BlockDevice:塊設備必須存在

創建 pod

# 創建 pod
[root@dce-10-6-215-215 pod-dir]# kubectl apply -f volume-hostpath.yaml
pod/volume-hostpath created

查看 pod

# pod 的 ip 地址為 172.29.35.63,並且在 dce-10-6-215-200 的節點上創建了
[root@dce-10-6-215-215 pod-dir]# kubectl get pod -n zouzou -o wide
NAME              READY   STATUS    RESTARTS   AGE   IP             NODE               NOMINATED NODE   READINESS GATES
volume-hostpath   2/2     Running   0          32s   172.29.35.63   dce-10-6-215-200   <none>           <none>

我們登錄到 dce-10-6-215-200 的 node 節點上,看 /tmp/logs 目錄存在不

可以看到,目錄自動創建了,並且創建了兩個日志文件,我們打印下 access.log 文件里的內容

# 實時查看日志,在 node 節點上查看
tail -f access.log

因為 pod 是我們剛創建的,還沒有訪問 nginx,所以還沒有日志產生,接下來,我們訪問下 nginx

# ip 換成你自己的 ip
curl 172.29.35.63:80

訪問幾次后,在 node 節點上去查看日志,這時候發現已經有日志輸出了

然后我們刪除 pod,查看文件里里面的內容是否還存在

# 刪除 pod
kubectl delete -f volume-hostpath.yaml

刪除 pod 之前在去 dce-10-6-215-200 的 node 節點上查看,發現文件和文件里面的內容還是存在的。當我們重新創建 pod 時,在訪問,日志會接着往里面寫入,不會刪除之前的日志

NFS

HostPath 可以解決數據持久化的問題,但是一旦 Node 節點故障了,pod 如果轉移到了別的節點,又會出現問題了,此時需要准備單獨的網絡存儲系統,比較常用的是 NFS、CIFS

NFS 是一個網絡文件存儲系統,可以搭建一台 NFS 服務器,然后將 pod 中的存儲直接連接到 NFS 系統上,這樣的話,無論 pod 在節點上怎么轉移,只要 Node 跟 NFS 的對接沒問題,數據就可以訪問成功

首先要准備 nfs 的服務器,這里為了簡單,直接是 master 節點做 nfs 服務器

在 master 機器上安裝 nfs 服務

# 安裝 nfs 服務
yum install nfs-utils -y

在 master 上准備一個共享目錄

# 創建一個共享目錄,-p 遞歸創建,-v 顯示創建信息
[root@dce-10-6-215-215 ~]# mkdir /root/data/nfs -pv
mkdir: created directory ‘/root/data’
mkdir: created directory ‘/root/data/nfs’

將共享目錄以讀寫權限暴露給 10.6.215.0/24 網段中的所有主機(注意,網段要是你自己的網段,我這里 master 和 node 節點的 ip 都是 10.6.215.xxx

# 在 /etc 創建個 exports 文件
vim /etc/exports

將下面內容寫入到文件里

/root/data/nfs     10.6.215.0/24(rw,no_root_squash)
  • rw :表示讀寫模式
  • no_root_squash :登入 NFS 主機使用分享目錄的使用者,如果是 root 的話,那么對於這個分享的目錄來說,他就具有 root 的權限

啟動 nfs 服務

systemctl restart nfs

接下來,要在每 個node 節點上都安裝下 nfs,這樣的目的是為了 node 節點可以驅動 nfs 設備。只安裝就可以了,不需要啟動 nfs 服務

# 在所有 node 節點上安裝 nfs,不需要啟動
yum install nfs-utils -y

接下來,就可以編寫 pod 的配置文件了,創建 volume-nfs.yaml,內容如下

apiVersion: v1
kind: Pod # 類型為 pod
metadata:
  name: volume-nfs # pod 的名稱
  namespace: zouzou
spec:
  containers:
  - name: nginx
    image: nginx:1.14
    ports:
    - containerPort: 80 # 暴露容器里面的 80 端口
    volumeMounts: # 掛載
    - name: logs-volume # 名字要和 volumes 里的一致
      mountPath: /var/log/nginx
  - name: busybox
    image: busybox:1.30
    command: ["/bin/sh","-c","tail -f /logs/access.log"] 
    volumeMounts:
    - name: logs-volume
      mountPath: /logs
  volumes:
  - name: logs-volume
    nfs: # nfs 類型
      server: 10.6.215.215  # nfs 服務器地址
      path: /root/data/nfs # 共享文件路徑

創建 pod

# 創建 pod
[root@dce-10-6-215-215 nfs]# kubectl apply -f volume-nfs.yaml
pod/volume-nfs created

查看 pod

# 查看 pod,pod 的 ip 為 172.29.35.63
[root@dce-10-6-215-215 nfs]# kubectl get pods volume-nfs -n zouzou -o wide
NAME         READY   STATUS    RESTARTS   AGE   IP             NODE               NOMINATED NODE   READINESS GATES
volume-nfs   2/2     Running   0          98s   172.29.35.63   dce-10-6-215-200   <none>           <none>

查看 nfs 服務器上的共享目錄,發現已經有文件了

查看下 access.log 文件里的內容

tail -f access.log

剛開始是沒有的,用 pod 的 ip 訪問下 nginx

curl 172.29.35.63:80

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM