k8存儲使用介紹


hostPath
hostPath 卷能將主機節點文件系統上的文件或目錄掛載到您的 Pod 中

代碼示例:

kind: Deployment
metadata:
  name: nginx-pod
  namespace: default
spec:
  replicas: 3
  template:
    metadata:
      labels:
        k8s-app: nginx-pod
    spec:
      containers:
      - name: nginx
        image: nginx
        imagePullPolicy: IfNotPresent
        volumeMounts:
        # 在容器中的路徑    node節點上的內容被關聯到 pod containr的 /test-pd路徑下 exec進入pod容器的路徑內可以看到節點上的內容
        - mountPath: /test-pod
          name: test-volume
      volumes:
      - name: test-volume
        hostPath:
           #directory location on host 綁定的節點的文件路徑
           path: /data
           # this field is optional 類型為目錄,此目錄必須存在
           type: Directory
---
apiVersion: v1
kind: Service
metadata:
  name: nginx-svc
  namespace: default
spec:
  type: NodePort
  ports:
  - port: 80
    targetPort: 80
    nodePort: 32000
  selector:
    k8s-app: nginx-pod

k8存儲介紹之 PV PVC

PV全稱叫做PersistentVolume ,持久化存儲卷。它是用來描述或者說用來定義一個存儲卷的。

PersistentVolumeClaim 持久卷聲明 (PVC)

PVC全稱 PersistentVolumeClaim 是用來描述希望使用什么樣的或者說是滿足什么條件的存儲,也就是持久化存儲聲明。使用這個來描述該容器需要一個什么存儲。比如下面使用NFS的PVC:

Persistent Volume主要是為了管理集群的存儲,供pod通過pvc來申請使用.

自己的理解是這樣的.

在存儲卷上面創建PV持久卷,pod 通過pvc申請pv資源,來供pod使用,大概就是這樣的調用邏輯.調用拓撲圖如下:

實驗示例:

使用nfs類型的PV,並使用Deployment部署nginx服務來驗證PV創建是否創建成功.

一、安裝nfs服務

在k8s master節點 上創建nfs服務器,用於提供存儲

1、安裝nfs服務端:
# yum install nfs-utils rpcbind
2、創建用於nfs服務的存儲文件夾:
# mkdir -p /data/nfs-server
3、編輯/etc/exports文件:
[root@k8s-master ~]# vim /etc/exports
/data/nfs-server  192.168.10.0/24(rw,async)
4、開啟nfs服務:
# systemctl start nfs-server.service

檢驗是否開啟成功:
[root@k8s-master ~]# showmount -e
Export list for k8s-master:
/data/nfs-server 192.168.10.0/24
[root@k8s-master ~]# 
#創建好nfs服務后不需要再客戶端掛載,保證nfs服務端服務正常即可.

二、創建pv對象
1、編輯pv資源的配置文件,文件如下:

[root@k8s-master ~]# cat pv.yaml 
---
apiVersion: v1
kind: PersistentVolume
metadata:
  name: nfs-testpv
  labels:
    name: nfs-testpv
spec:
  #指定pv為nfs服務器上對應的目錄
  nfs:
    path: /data/nfs-server
    server: 192.168.10.10
  #指定pv的回收策略,即pvc資源釋放后的事件,recycle刪除pvc的所有文件(不建議生產環境使用)
  persistentVolumeReclaimPolicy: Recycle
  #pv存儲類名稱
  storageClassName: mynfs-pv
  #指定訪問模式
  accessModes:
    - ReadWriteOnce
  # 設置存儲空間大小
  capacity:
    storage: 2Gi

[root@k8s-master ~]# 

accessModes:支持三種類型

  • ReadWriteMany 多路讀寫,卷能被集群多個節點掛載並讀寫

  • ReadWriteOnce 單路讀寫,卷只能被單一集群節點掛載讀寫

  • ReadOnlyMany 多路只讀,卷能被多個集群節點掛載且只能讀

2、創建該PV資源:

[root@k8s-master ~]# kubectl apply -f pv.yaml 
persistentvolume/nfs-testpv created
[root@k8s-master ~]# 

3、查看該pv資源:

[root@k8s-master ~]# kubectl get pv
NAME            CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS      CLAIM      STORAGECLASS      REASON   AGE
nfs-testpv      2Gi        RWO            Recycle          Available               mynfs-pv                   52s

至此,PV資源創建成功,接下來創建pvc,供pod來申請使用

三、創建pvc資源
1、編輯pvc資源配置文件:

[root@k8s-master ~]# cat pvc.yaml 
kind: PersistentVolumeClaim
apiVersion: v1
metadata:
  name: nfs-testpvc
spec:
  # PVC也需要定義訪問模式,不過它的模式一定是和現有PV相同或者是它的子集,否則匹配不到PV.
  accessModes:
    - ReadWriteOnce
  # 定義資源要求PV滿足這個PVC的要求才會被匹配到
  resources:
    requests:
      storage: 2Gi
  storageClassName: mynfs-pv
[root@k8s-master ~]# 

這個PVC就會和上面的PV進行綁定,它也有一些原則:

1>.PV和PVC中的spec關鍵字段要匹配,比如存儲(storage)大小,訪問模式.

2>. PV和PVC中的storageClassName字段必須一致.

2、應用pvc配置文件:

[root@k8s-master ~]# kubectl apply -f pvc.yaml 
persistentvolumeclaim/nfs-testpvc created

3、查看該pvc資源:

[root@k8s-master ~]# kubectl get pvc
NAME                          STATUS    VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS   AGE
nfs-testpvc                   Bound     nfs-testpv                                 2Gi        RWO            mynfs-pv       5m1s

到這里,pvc也就創建完成了,接下來就是pod怎么去使用pvc.

四、創建nginx pod資源,使用pvc存儲.

1、這里使用 Deployment 創建3副本的nginx pod,使用volumes來綁定pvc的信息,並創建svc來訪問pod來驗證.

[root@k8s-master ~]# cat  pvc-pod-nginx.yml 
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: nginx-pod
  namespace: default
spec:
  replicas: 3
  template:
    metadata:
      labels:
        k8s-app: nginx-pod
    spec:
      containers:
      - name: nginx
        image: nginx
        #容器策略
        imagePullPolicy: IfNotPresent
        #容器內部的掛載點,就是將pvc的卷掛載到pod容器的這個目錄下.
        volumeMounts:
        - mountPath: /usr/share/nginx/html/
          name: test-volume
      #這里是掛載卷部分,這是最最最重點部分,volumes name 要和volumeMounts name名稱一致,claimName為pvc的名稱.
      volumes:
      - name: test-volume
        persistentVolumeClaim:
          claimName: nfs-testpvc
---
apiVersion: v1
kind: Service
metadata:
  name: nginx-svc
  namespace: default
spec:
  type: NodePort
  ports:
  - port: 80
    targetPort: 80
    nodePort: 32000
  selector:
    k8s-app: nginx-pod
[root@k8s-master ~]# 

2、創建nginx pod及svc

root@k8s-master ~]# kubectl apply -f pvc-pod-nginx.yml

3、查看pod及svc創建信息.

root@k8s-master ~]# kubectl get pod -o wide
NAME                                    READY   STATUS                  RESTARTS   AGE     IP            NODE         NOMINATED NODE   READINESS GATES
nginx-pod-5bdcc49bb7-6f7b7              1/1     Terminating             1          57m     10.244.2.44   k8s-node01   <none>           <none>
nginx-pod-5bdcc49bb7-8grz9              1/1     Terminating             1          57m     10.244.2.45   k8s-node01   <none>           <none>
nginx-pod-5bdcc49bb7-dxn56              1/1     Running                 0          57m     10.244.3.55   k8s-node02   <none>           <none>
nginx-pod-5bdcc49bb7-mz9cm              1/1     Running                 0          43m     10.244.3.58   k8s-node02   <none>           <none>
nginx-pod-5bdcc49bb7-tcx48              1/1     Running                 0          43m     10.244.3.57   k8s-node02   <none>           <none>

[root@k8s-master ~]# kubectl get svc -o wide
NAME                      TYPE        CLUSTER-IP    EXTERNAL-IP   PORT(S)        AGE    SELECTOR
nginx-svc                 NodePort    10.1.131.6    <none>        80:32000/TCP   58m    k8s-app=nginx-pod

由於我是將nfs的 /data/nfs-server目錄作為pvc申請的存儲掛載到nginx pod的訪問目錄下,所以我在/data/nfs-server目錄創建一個index.html文件,nginx是可以訪問到的

root@k8s-master ~]# cat /data/nfs-server/index.html 
hello pvc
[root@k8s-master ~]# 

我的pod都是在node2節點上面,所以我用node2節點的ip:32000就可以訪問到我定義的index.html內容.

 

至此,pod使用pvc完成,這種是靜態pv使用的申請,后面會在總結pv動態申請,此處明白使用的方法和內在邏輯就可以.

 


免責聲明!

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



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