Kubernetes使用NFS作爲共享存儲

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"&gt; /data/nginx/index.html

在瀏覽器上訪問kubernetes主節點的ip:20080 就能看到上面的內容

end 結束。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章