1. 程式人生 > 其它 >Java-IO流系列-緩衝流

Java-IO流系列-緩衝流

1.什麼是StorageClass

Kubernetes提供了一套可以自動建立PV的機制,即:Dynamic Provisioning.而這個機制的核心在於:StorageClass這個API物件.

StorageClass物件會定義下面兩部分內容:
1,PV的屬性.比如,儲存型別,Volume的大小等.
2,建立這種PV需要用到的儲存外掛
有了這兩個資訊之後,Kubernetes就能夠根據使用者提交的PVC,找到一個對應的StorageClass,之後Kubernetes就會呼叫該StorageClass宣告的儲存外掛,進而創建出需要的PV.
但是其實使用起來是一件很簡單的事情,你只需要根據自己的需求,編寫YAML檔案即可,然後使用kubectl create命令執行即可

2.為什麼需要StorageClass

在一個大規模的Kubernetes叢集裡,可能有成千上萬個PVC,這就意味著運維人員必須實現創建出這個多個PV,此外,隨著專案的需要,會有新的PVC不斷被提交,那麼運維人員就需要不斷的新增新的,滿足要求的PV,否則新的Pod就會因為PVC繫結不到PV而導致建立失敗.而且通過 PVC 請求到一定的儲存空間也很有可能不足以滿足應用對於儲存裝置的各種需求
而且不同的應用程式對於儲存效能的要求可能也不盡相同,比如讀寫速度、併發效能等,為了解決這一問題,Kubernetes 又為我們引入了一個新的資源物件:StorageClass,通過 StorageClass 的定義,管理員可以將儲存資源定義為某種型別的資源,比如快速儲存、慢速儲存等,使用者根據 StorageClass 的描述就可以非常直觀的知道各種儲存資源的具體特性了,這樣就可以根據應用的特性去申請合適的儲存資源了。

3.StorageClass執行原理及部署流程

要使用 StorageClass,我們就得安裝對應的自動配置程式,比如我們這裡儲存後端使用的是 nfs,那麼我們就需要使用到一個 nfs-client 的自動配置程式,我們也叫它 Provisioner,這個程式使用我們已經配置好的 nfs 伺服器,來自動建立持久卷,也就是自動幫我們建立 PV。
1.自動建立的 PV 以${namespace}-${pvcName}-${pvName}這樣的命名格式建立在 NFS 伺服器上的共享資料目錄中
2.而當這個 PV 被回收後會以archieved-${namespace}-${pvcName}-${pvName}這樣的命名格式存在 NFS 伺服器上。

4.搭建StorageClass+NFS,大致有以下幾個步驟

1.建立一個可用的NFS Serve
2.建立Service Account.這是用來管控NFS provisioner在k8s叢集中執行的許可權
3.建立StorageClass.負責建立PVC並呼叫NFS provisioner進行預定的工作,並讓PV與PVC建立管理
4.建立NFS provisioner.有兩個功能,一個是在NFS共享目錄下建立掛載點(volume),另一個則是建了PV並將PV與NFS的掛載點建立關聯  

5.建立StorageClass

1.建立nfs服務(百度)
2.使用以下文件配置account及相關許可權

[root@master01 storageClass]# cat rbac.yaml 
apiVersion: v1
kind: ServiceAccount
metadata:
  name: nfs-client-provisioner
  # replace with namespace where provisioner is deployed
  namespace: default        #根據實際環境設定namespace,下面類同
---
kind: ClusterRole
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  name: nfs-client-provisioner-runner
rules:
  - apiGroups: [""]
    resources: ["persistentvolumes"]
    verbs: ["get", "list", "watch", "create", "delete"]
  - apiGroups: [""]
    resources: ["persistentvolumeclaims"]
    verbs: ["get", "list", "watch", "update"]
  - apiGroups: ["storage.k8s.io"]
    resources: ["storageclasses"]
    verbs: ["get", "list", "watch"]
  - apiGroups: [""]
    resources: ["events"]
    verbs: ["create", "update", "patch"]
---
kind: ClusterRoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  name: run-nfs-client-provisioner
subjects:
  - kind: ServiceAccount
    name: nfs-client-provisioner
    # replace with namespace where provisioner is deployed
    namespace: default
roleRef:
  kind: ClusterRole
  name: nfs-client-provisioner-runner
  apiGroup: rbac.authorization.k8s.io
---
kind: Role
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  name: leader-locking-nfs-client-provisioner
    # replace with namespace where provisioner is deployed
  namespace: default
rules:
  - apiGroups: [""]
    resources: ["endpoints"]
    verbs: ["get", "list", "watch", "create", "update", "patch"]
---
kind: RoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  name: leader-locking-nfs-client-provisioner
subjects:
  - kind: ServiceAccount
    name: nfs-client-provisioner
    # replace with namespace where provisioner is deployed
    namespace: default
roleRef:
  kind: Role
  name: leader-locking-nfs-client-provisioner
  apiGroup: rbac.authorization.k8s.io

3.建立NFS資源的StorageClass

[root@master01 storageClass]# cat nfs-StorageClass.yaml 
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: managed-nfs-storage
provisioner: qgg-nfs-storage #這裡的名稱要和provisioner配置檔案中的環境變數PROVISIONER_NAME保持一致
parameters:
  archiveOnDelete: "false"

4.建立NFS provisioner

[root@master01 storageClass]# cat nfs-provisioner.yaml 
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nfs-client-provisioner
  labels:
    app: nfs-client-provisioner
  # replace with namespace where provisioner is deployed
  namespace: default  #與RBAC檔案中的namespace保持一致
spec:
  replicas: 1
  selector:
    matchLabels:
      app: nfs-client-provisioner
  strategy:
    type: Recreate
  selector:
    matchLabels:
      app: nfs-client-provisioner
  template:
    metadata:
      labels:
        app: nfs-client-provisioner
    spec:
      serviceAccountName: nfs-client-provisioner
      containers:
        - name: nfs-client-provisioner
          image: quay.io/external_storage/nfs-client-provisioner:latest
          volumeMounts:
            - name: nfs-client-root
              mountPath: /persistentvolumes
          env:
            - name: PROVISIONER_NAME
              value: qgg-nfs-storage  #provisioner名稱,請確保該名稱與 nfs-StorageClass.yaml檔案中的provisioner名稱保持一致
            - name: NFS_SERVER
              value: 192.168.0.120   #NFS Server IP地址
            - name: NFS_PATH  
              value: /data/k8s    #NFS掛載卷
      volumes:
        - name: nfs-client-root
          nfs:
            server: 192.168.0.120  #NFS Server IP地址
            path: /data/k8s     #NFS 掛載卷

5.建立測試pod,檢查是否部署成功

[root@master01 storageClass]# cat test-pvc.yaml 
kind: PersistentVolumeClaim
apiVersion: v1
metadata:
  name: test-claim
  annotations:
    volume.beta.kubernetes.io/storage-class: "managed-nfs-storage"   #與nfs-StorageClass.yaml metadata.name保持一致
spec:
  accessModes:
    - ReadWriteMany
  resources:
    requests:
      storage: 1Mi
[root@master01 storageClass]# kubectl get pvc
NAME         STATUS   VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS          AGE
test-claim   Bound    pvc-2089e4b4-2464-4585-9775-a217ae0e341c   1Mi        RWX            managed-nfs-storage   17m
[root@master01 storageClass]# cat test-pod.yaml 
kind: Pod
apiVersion: v1
metadata:
  name: test-pod
spec:
  containers:
  - name: test-pod
    image: busybox:1.24
    command:
      - "/bin/sh"
    args:
      - "-c"
      - "touch /mnt/SUCCESS && exit 0 || exit 1"   #建立一個SUCCESS檔案後退出
    volumeMounts:
      - name: nfs-pvc
        mountPath: "/mnt"
  restartPolicy: "Never"
  volumes:
    - name: nfs-pvc
      persistentVolumeClaim:
        claimName: test-claim  #與PVC名稱保持一致

6.檢查結果

[root@master01 default-test-claim-pvc-2089e4b4-2464-4585-9775-a217ae0e341c]# pwd
/data/k8s/default-test-claim-pvc-2089e4b4-2464-4585-9775-a217ae0e341c
[root@master01 default-test-claim-pvc-2089e4b4-2464-4585-9775-a217ae0e341c]# ll
-rw-r--r-- 1 root root 0 Jul  1 11:57 SUCCESS

文章轉自:https://www.cnblogs.com/panwenbin-logs/p/12196286.html