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

