Kubernetes使用NFS作為共享存儲
kubernetes管理的容器是封裝的,有時候我們需要將容器運行的日誌,放到本地來或是共享存儲來,以防止容器宕掉,日誌還在還可以分析問題。kubernetes的共享存儲方案目前比較流行的一般是三個,分別是:nfs,Glusterfs和ceph。
前面寫過一篇kubernetes使用GlusterFS的文章,如果有興趣也可以去實踐下:http://blog.51cto.com/passed/2139299
今天要講的是kubernetes使用nfs作為共享存儲
一. 創建 NFS 服務器
NFS 允許系統將其目錄和文件共享給網絡上的其他系統。通過 NFS,用戶和應用程序可以訪問遠程系統上的文件,就象它們是本地文件一樣。
1、安裝
CentOS 7.x鍵放以下命令安裝NFS服務器:
yum -y install nfs*
2、配置
編輯/etc/exports文件添加需要共享目錄,每個目錄的設置獨占一行,編寫格式如下:
NFS共享目錄路徑 客戶機IP或者名稱(參數1,參數2,...,參數n)
例如:
/home *(ro,sync,insecure,no_root_squash)
/data/nginx 192.168.1.*(rw,sync,insecure,no_subtree_check,no_root_squash)
參數 說明 ro 只讀訪問 rw 讀寫訪問 sync 所有數據在請求時寫入共享 async nfs在寫入數據前可以響應請求 secure nfs通過1024以下的安全TCP/IP端口發送 insecure nfs通過1024以上的端口發送 wdelay 如果多個用戶要寫入nfs目錄,則歸組寫入(默認) no_wdelay 如果多個用戶要寫入nfs目錄,則立即寫入,當使用async時,無需此設置 hide 在nfs共享目錄中不共享其子目錄 no_hide 共享nfs目錄的子目錄 subtree_check 如果共享/usr/bin之類的子目錄時,強制nfs檢查父目錄的權限(默認) no_subtree_check 不檢查父目錄權限 all_squash 共享文件的UID和GID映射匿名用戶anonymous,適合公用目錄 no_all_squash 保留共享文件的UID和GID(默認) root_squash root用戶的所有請求映射成如anonymous用戶一樣的權限(默認) no_root_squash root用戶具有根目錄的完全管理訪問權限 anonuid=xxx 指定nfs服務器/etc/passwd文件中匿名用戶的UID anongid=xxx 指定nfs服務器/etc/passwd文件中匿名用戶的GID
註1:盡量指定主機名或IP或IP段最小化授權可以訪問NFS 掛載的資源的客戶端
註2:經測試參數insecure必須要加,否則客戶端掛載出錯mount.nfs: access denied by server while mounting
3、啟動
配置完成後,您可以在終端提示符後運行以下命令來啟動 NFS 服務器:
systemctl start nfs.service
4、客戶端掛載
CentOS 7, 需要安裝 nfs-utils 包
yum install nfs-utils
使用 mount 命令來掛載其他機器共享的 NFS 目錄。可以在終端提示符後輸入以下類似的命令:
mount nfs_server_ip:/data/nginx /mnt
掛載點/mnt 目錄必須已經存在。而且在 /mnt目錄中沒有文件或子目錄。
另一個掛載NFS 共享的方式就是在 /etc/fstab 文件中添加一行。該行必須指明 NFS 服務器的主機名、服務器輸出的目錄名以及掛載 NFS 共享的本機目錄。
以下是在 /etc/fstab 中的常用語法:nfs_server_ip:/data/nginx /mnt nfs rsize=8192,wsize=8192,timeo=14,intr
二、Kubernetes上部署一個應用nginx使用nfs共享存儲
來到kubernetes主節點上,創建kubernetes部署的yaml文件:nfs-nginx.yaml
##創建namespaces
apiVersion: v1
kind: Namespace
metadata:
name: test
labels:
name: test
##創建nfs-PV
---
apiVersion: v1
kind: PersistentVolume
metadata:
name: nfs-pv
namespace: test
labels:
pv: nfs-pv
spec:
capacity:
storage: 10Gi
accessModes:
- ReadWriteMany
persistentVolumeReclaimPolicy: Retain
nfs:
path: /data/nginx
server: 192.168.22.8
##創建 NFS-pvc
---
kind: PersistentVolumeClaim
apiVersion: v1
metadata:
name: nfs-pvc
namespace: test
spec:
accessModes:
- ReadWriteMany
resources:
requests:
storage: 10Gi
selector:
matchLabels:
pv: nfs-pv
## 部署應用Nginx
---
apiVersion: v1
kind: ReplicationController
metadata:
name: nginx-test
labels:
name: nginx-test
namespace: test
spec:
replicas: 2
selector:
name: nginx-test
template:
metadata:
labels:
name: nginx-test
spec:
containers:
- name: nginx-test
image: docker.io/nginx
volumeMounts:
- mountPath: /usr/share/nginx/html
name: nginx-data
ports:
- containerPort: 80
volumes:
- name: nginx-data
persistentVolumeClaim:
claimName: nfs-pvc
##創建Service
---
apiVersion: v1
kind: Service
metadata:
name: nginx-test
labels:
name: nginx-test
namespace: test
spec:
type: NodePort
ports:
- port: 80
protocol: TCP
targetPort: 80
name: http
nodePort: 20080
selector:
name: nginx-test
[root@qa-k8s-master-01 ]# kubectl create -f nfs-nginx.yaml
namespace/test created
persistentvolume/nfs-pv created
persistentvolumeclaim/nfs-pvc created
replicationcontroller/nginx-test created
service/nginx-test created
[root@qa-k8s-master-01 ~]# kubectl get pod -n test
NAME READY STATUS RESTARTS AGE
nginx-test-ssbnr 1/1 Running 0 4m
nginx-test-zl7vk 1/1 Running 0 4m
[root@qa-k8s-master-01 ~]# kubectl get service -n test
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
nginx-test NodePort 10.68.145.112 <none> 80:20080/TCP 5m
可以看到,nginx應用已經部署成功。
nginx應用的數據目錄是使用的nfs共享存儲,我們在nfs共享的目錄裏加入index.html文件,然後再訪問nginx-service 暴露的端口
來到nfs服務器上
[root@harbor ~]# echo "Test NFS Share discovery"> /data/nginx/index.html
在瀏覽器上訪問kubernetes主節點的ip:20080 就能看到上面的內容
end 結束。
Kubernetes使用NFS作為共享存儲