基礎(chǔ)知識(shí)之 PV PVC 理解

基礎(chǔ)重要的服務(wù)介紹


Master 上運(yùn)行的服務(wù)

  • etcd 服務(wù):

k8s 內(nèi)部關(guān)系圖:


image
k8s內(nèi)對(duì)象名字 作用
daemonSet 用來描述每個(gè)宿主機(jī)上必須且只能運(yùn)行一個(gè)副本的守護(hù)進(jìn)程服務(wù)
Job 用來描述一次性運(yùn)行的 Pod(比如,大數(shù)據(jù)任務(wù))
CronJob 用于描述定時(shí)任務(wù)

==Kubernetes 項(xiàng)目如何啟動(dòng)一個(gè)容器化任務(wù)呢?==

實(shí)例:NGINX 負(fù)載

  1. 定義一個(gè) deployment yaml文件
apiVersion: apps/v1
kind: Deployment   #yaml類型名
metadata:
  name: nginx-deployment
  labels:
    app: nginx
spec:
  replicas: 2
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:1.7.9
        ports:
        - containerPort: 80
  1. 創(chuàng)建這個(gè)yaml
$ kubectl create -f nginx-deployment.yaml

這樣就創(chuàng)建了兩個(gè) NGINX 的 部署


kubeadm 集群構(gòu)建命令:

# 創(chuàng)建一個(gè) Master 節(jié)點(diǎn)
$ kubeadm init

# 將一個(gè) Node 節(jié)點(diǎn)加入到當(dāng)前集群中
$ kubeadm join <Master 節(jié)點(diǎn)的 IP 和端口 >

==部署 kubeadm master 節(jié)點(diǎn)==

  1. 安裝 kubeadm
$ apt-get install kubeadm

  1. 初始化master 節(jié)點(diǎn)
kubeadm init

static pod 的簡(jiǎn)介
[圖片上傳失敗...(image-228f2-1541571599035)]

apiVersion: v1
kind: Pod
metadata:
  annotations:
    scheduler.alpha.kubernetes.io/critical-pod: ""
  creationTimestamp: null
  labels:
    component: kube-apiserver
    tier: control-plane
  name: kube-apiserver
  namespace: kube-system
spec:
  containers:
  - command:
    - kube-apiserver
    - --authorization-mode=Node,RBAC
    - --runtime-config=api/all=true
    - --advertise-address=10.168.0.2
    ...
    - --tls-cert-file=/etc/kubernetes/pki/apiserver.crt
    - --tls-private-key-file=/etc/kubernetes/pki/apiserver.key
    image: k8s.gcr.io/kube-apiserver-amd64:v1.11.1
    imagePullPolicy: IfNotPresent
    livenessProbe:
      ...
    name: kube-apiserver
    resources:
      requests:
        cpu: 250m
    volumeMounts:
    - mountPath: /usr/share/ca-certificates
      name: usr-share-ca-certificates
      readOnly: true
    ...
  hostNetwork: true
  priorityClassName: system-cluster-critical
  volumes:
  - hostPath:
      path: /etc/ca-certificates
      type: DirectoryOrCreate
    name: etc-ca-certificates
  ...


==PV &PVC==

目的:實(shí)現(xiàn)存儲(chǔ)的持久化,在k8s中并非綁定宿主機(jī)的目錄即為存儲(chǔ)持久化

PV &PVC 的關(guān)聯(lián):

PVC 如果想要和pod結(jié)合起來需要與PV結(jié)合起來才能被使用

==創(chuàng)建PV==-->==開發(fā)聲明PVC對(duì)象==--> ==確認(rèn)PV的大小與PVC的spec字段,對(duì)比== --> ==storageClassName 字段要一致== -->綁定

創(chuàng)建PV示例 (示例為NFS網(wǎng)絡(luò)存儲(chǔ)類示例)

apiVersion: v1
kind: PersistentVolume
metadata:
  name: nfs
spec:
  storageClassName: manual
  capacity:
    storage: 1Gi
  accessModes:
    - ReadWriteMany
  nfs:
    server: 10.244.1.4
    path: "/"

創(chuàng)建PVCyaml示例:
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: nfs
spec:
  accessModes:
    - ReadWriteMany
  storageClassName: manual
  resources:
    requests:
      storage: 1Gi

pod 綁定PVC 示例

apiVersion: v1
kind: Pod
metadata:
  labels:
    role: web-frontend
spec:
  containers:
  - name: web
    image: nginx
    ports:
      - name: web
        containerPort: 80
    volumeMounts:
        - name: nfs
          mountPath: "/usr/share/nginx/html"
  volumes:
  - name: nfs
    persistentVolumeClaim: ## <--這字段
      claimName: nfs

問題點(diǎn):創(chuàng)建 Pod 的時(shí)候,系統(tǒng)里并沒有合適的 PV 跟它定義的PVC綁定

所以就引進(jìn)了k8s的 Volume Controller

==PersistentVolumeController== :不斷的查看當(dāng)前每個(gè)PVC,確認(rèn)他們是否處于bond狀態(tài),如果不是會(huì)遍歷所有的PV并嘗試將PVC與合適的PV進(jìn)行綁定

PV生效階段:

二段式

  1. attach: 即將塊存儲(chǔ)于宿主機(jī)進(jìn)行接入
  2. mount:將存儲(chǔ)掛載至宿主機(jī)的某個(gè)目錄用于容器進(jìn)行映射持久化使用
這些二段式準(zhǔn)備階段在k8s中是依賴kubelet的主控制循環(huán)來實(shí)現(xiàn)的,分別是:

==AtttachDetachController(檢查pod對(duì)應(yīng)的宿主機(jī)與該pod的PV 的掛載情況)==

==VolumeManagerReconciler()==

==StorageClass==

就是創(chuàng)建PV的模板,包含兩部分內(nèi)容:PV屬性 & 創(chuàng)建此PV所需要的插件

示例:Volume 的類型是GCE 的persistent DISK:

apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: block-service
provisioner: kubernetes.io/gce-pd  #k8s內(nèi)置的GCE PD 存儲(chǔ)插件的名字
parameters:   # PV參數(shù)字段
  type: pd-ssd   ##PV的類型,這里的類型是 SSD格式的GCE遠(yuǎn)程磁盤。

創(chuàng)建StorageClass 的命令:
$ kubectl create -f sc.yaml
接下來可以創(chuàng)建所需要的PVC :
PVC 的yaml文件內(nèi)容:
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: claim1
spec:
  accessModes:
    - ReadWriteOnce
  storageClassName: block-service   ## 這個(gè)名字就是上面所創(chuàng)建的StorageClass的名字
  resources:
    requests:
      storage: 30Gi

創(chuàng)建PVC 的命令(示例):

$ kubectl create -f pvc.yaml
$ kubectl describe pvc claim1
Name:           claim1
Namespace:      default
StorageClass:   block-service
Status:         Bound
Volume:         pvc-e5578707-c626-11e6-baf6-08002729a32b   ## 由storageClass創(chuàng)建的PV
Labels:         <none>
Capacity:       30Gi
Access Modes:   RWO
No Events.

$ kubectl describe pv pvc-e5578707-c626-11e6-baf6-08002729a32b
Name:            pvc-e5578707-c626-11e6-baf6-08002729a32b
Labels:          <none>
StorageClass:    block-service
Status:          Bound
Claim:           default/claim1
Reclaim Policy:  Delete
Access Modes:    RWO
Capacity:        30Gi
...
No events.

==疑問:創(chuàng)建的PV 具體位置在哪?實(shí)現(xiàn)存儲(chǔ)的持久化 莫非需要PVC的名字一個(gè)pod唯一對(duì)應(yīng)一個(gè)PVC?==

有了Dynamic Provisioning 機(jī)制,只需要在k8S中創(chuàng)建出數(shù)量有限的StoreageClass 的對(duì)象就可以了。當(dāng)提交包含StorageClass 字段的PVC之后,k8s會(huì)根據(jù)這個(gè)StoreageClass 字段來創(chuàng)建出相應(yīng)的PV 


注意:開頭的PV PVC 示例中都聲明了StoreageClassName=manual 的yaml, 這樣做的,并不是集群中有一個(gè)名字叫manual的SC,而這個(gè)時(shí)候是k8s進(jìn)行了 Static Provisioning ,這樣做的好處就是 PV 與PVC 的關(guān)系掌控在自己手中。

PV、PVC 、 StorageClass 的關(guān)系:

[圖片上傳失敗...(image-b2dfa1-1541571599035)]

如圖關(guān)系:

  • PVC:Pod 想要使用的持久化存儲(chǔ)的屬性,比如存儲(chǔ)的大小、讀寫權(quán)限等。
  • PV:一個(gè)具體volume 的屬性,比如 volume的類型、掛載目錄、遠(yuǎn)程存儲(chǔ)服務(wù)地址等。
  • StorageClass 的作用是:只有同屬于一個(gè)StorageClass的PV和PVC才能綁定在一起。

心得:

==PV & PVC 關(guān)聯(lián)有兩種方式:靜態(tài)&動(dòng)態(tài) 靜態(tài)的缺點(diǎn)是如果PVC需求的不存在需要人工確認(rèn)==
==疑問:創(chuàng)建新的PV?還是如果有舊的StoreageClass de PV會(huì)進(jìn)行綁定?==
==疑問:如何跟AWS 的塊存儲(chǔ)關(guān)聯(lián)起來?(參照下面博客)==
==什么存儲(chǔ)介質(zhì)可以用作PV?(NFS、AWS的EBS)==

AWS EBS 創(chuàng)建PV

AWS 做PV國外博客

博友參考博客


Local Persistent Volume

即node節(jié)點(diǎn)上、宿主機(jī)自身的存儲(chǔ),類似于 docker 映射。

優(yōu)點(diǎn): 讀寫速度快

缺點(diǎn):節(jié)點(diǎn)宕機(jī)且不能恢復(fù)時(shí)則存儲(chǔ)消失。

==注意這個(gè)本地的PV 并不能等同于 hostPath的NodeAffinity==

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容