1. 程式人生 > >淺析kubernetes創建Pv、Pvc、Deployment

淺析kubernetes創建Pv、Pvc、Deployment

quest 一個 aml bound ref volume minor repl rec

淺析kubernetes創建Pv、Pvc、Deployment

  1. 基本環境
    #系統環境
    cat /etc/redhat-release
    CentOS Linux release 7.4.1708 (Core)
    #k8s client 和 server 的版本信息
    kubectl version
    Client Version: version.Info{Major:"1", Minor:"10", GitVersion:"v1.10.0", GitCommit:"fc32d2f3698e36b93322a3465f63a14e9f0eaead", GitTreeState:"clean", BuildDate:"2018-03-26T16:55:54Z", GoVersion:"go1.9.3", Compiler:"gc", Platform:"linux/amd64"}
    Server Version: version.Info{Major:"1", Minor:"10", GitVersion:"v1.10.1", GitCommit:"d4ab47518836c750f9949b9e0d387f20fb92260b", GitTreeState:"clean", BuildDate:"2018-04-12T14:14:26Z", GoVersion:"go1.9.3", Compiler:"gc", Platform:"linux/amd64"}
  2. 創建有狀態服務的操作順序
    #值得註意的是創建順序非常關鍵
    (1)Volume
    (2)Persistent Volume
    (3)Persistent Volume Claim
    (4)Service
    (5)StatefulSet
  3. 創建PV
    我這裏使用的是NFS服務,點擊NFS部署及優化,搭建自己的NFS服務。
    #註意兩點:
    (1)請先部署好自己的NFS服務;
    (2)在使用共享之前,必須運行自己的NFS服務器並運行共享。
    ##持久性存儲卷
    apiVersion: v1
    kind: PersistentVolume
    metadata:
    name: data-nfs      ##名字任意取
    labels: 
      type: nfs
    spec:
    capacity:
      storage: 8Gi
    volumeMode: Filesystem
    accessModes:
      - ReadWriteOnce
    persistentVolumeReclaimPolicy: Recycle
    mountOptions:
      - hard
      - nfsvers=4.1
    nfs:
      path: /data  ##NFS服務器上的共享目錄
      server: 192.168.246.168   ##NFS服務器的ip地址
  4. 創建PVC
    ##pvc的yaml
    apiVersion: v1
    kind: PersistentVolumeClaim
    metadata:
    name: datadir-nginx-0
    spec:
    accessModes:
      - ReadWriteOnce
    resources:
      requests:
        storage: 1Gi
    selector:
      matchLabels:
        type: nfs 
    #說明:
    創建PVC的名稱和Deployment中的名稱要對應上,要不然Deployment中的Pod就肯定
    創建不成功!簡單說一下PVC和Deployment中的命名的規律:
    如上面創建PVC的yaml文件,我們在這裏創建了一個叫做datadir-nginx-0的PVC,
    粗略一看這個名字有點奇怪,因為這個yaml文件中並沒有提到PV的名字,所以PV和PVC
    是怎麽bound起來的呢?是通過labels標簽下的type: nfs鍵值對來進行匹配的,我們
    在創建PV時指定了label的鍵值對,在PVC裏通過selector可以指定label。
    關於這個PVC的名稱定義:datadir-nginx-0,我們需要看一下下面
    創建Deployment中的yaml:
  5. 創建Deployment
    apiVersion: apps/v1
    kind: Deployment
    metadata:
    name: nginx-deployment
    labels:
      app: nginx
    spec:
    replicas: 1
    selector:
      matchLabels:
        app: nginx
    template:
      metadata:
        labels:
          app: nginx
      spec:
        containers:
        - name: nginx
          image: nginx:1.7.9
          volumeMounts:
            - mountPath: "/wtf"
              name: datadir
        volumes:
        - name: datadir
          persistentVolumeClaim:
            claimName: datadir-nginx-0
      volumeClaimTemplates:
      - metadata:
        name: datadir
        labels: 
          type: nfs
        annotations:
          volume.alpha.kubernetes.io/storage-class: anything
        spec:
          accessModes: [ "ReadWriteOnce" ]
          resources:
            requests:
              storage: 1Gi
    #說明:
    接著說PVC的名稱定義,首先我們看到Deployment的name叫nginx-deployment,設置
    的replicas為1個,volumeMounts和volumeClaimTemplates的name必須相同,為datadir,
    所以Deployment創建的第一個Pod的name應該為nginx-0,第二個為nginx-1,依此類推,
    這裏只定義了一個replicas,所以pod的名字是nginx-0。
    這裏Deployment中的Pod與PVC之間的綁定關系是通過名稱來匹配的,即:
    PVC_name === volumeClaimTemplates_name + "-" + pod_name

淺析kubernetes創建Pv、Pvc、Deployment