天天看點

使用nfs 作為PV 學習StatefulSet

使用 quay.io/external_storage/nfs-client-provisioner 作為動态pv的storageClass來測試StatefuleSet。

注意nfs-client-provisioner 會不時連接配接不到api-server,原因不詳。

先上關鍵配置,StorageClass及nfs 對應的deamon(deployment):

---
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: managed-nfs-storage
provisioner: fuseim.pri/ifs # or choose another name, must match deployment's env PROVISIONER_NAME'
parameters:
  archiveOnDelete: "false"
allowedTopologies:
- matchLabelExpressions:
  - key: kubernetes.io/hostname
    values:
    - node1.localdomain
apiVersion
---
: apps/v1
kind: Deployment
metadata:
  name: nfs-client-provisioner
  labels:
    app: nfs-client-provisioner
  # replace with namespace where provisioner is deployed
  namespace: default
spec:
  replicas: 1
  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
          imagePullPolicy: IfNotPresent
          volumeMounts:
            - name: nfs-client-root
              mountPath: /persistentvolumes
          env:
            - name: PROVISIONER_NAME
              value: fuseim.pri/ifs
            - name: NFS_SERVER
              value: 192.168.157.132
            - name: NFS_PATH
              value: /root/nfsroot
      volumes:
        - name: nfs-client-root
          nfs:
            server: 192.168.157.132
            path: /root/nfsroot
           

然後是StatefulSet的yaml

---
apiVersion: v1
kind: Service
metadata:
  name: nginx
  labels:
    app: nginx
spec:
  ports:
  - port: 80
    name: web
  clusterIP: None
  selector:
    app: nginx
---
apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: web
spec:
  selector:
    matchLabels:
      app: nginx
  serviceName: "nginx"
  replicas: 1
  updateStrategy: 
    type: RollingUpdate
    rollingUpdate: 
      partition: 1
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:1.9
        ports:
        - containerPort: 80
          name: web
        volumeMounts:
        - name: example-local-claim
          mountPath: /data1
  volumeClaimTemplates:
  - metadata:
      name: example-local-claim
    spec:
      accessModes:
      - ReadWriteOnce
      storageClassName: managed-nfs-storage  
      resources:
        requests:
          storage: 1Mi
           

順利運作後先檢視pod定義,發現自動生成如下内容

volumes:
  - name: example-local-claim
    persistentVolumeClaim:
      claimName: example-local-claim-web-0
           

claimName的格式為volumeClaimTemplates裡面的

volumeClaimTemplates:
  - metadata:
      name: example-local-claim
           

裡面name+podname

檢視pvc資訊

[[email protected] ~]# kubectl get pvc example-local-claim-web-0 -o yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  annotations:
    pv.kubernetes.io/bind-completed: "yes"
    pv.kubernetes.io/bound-by-controller: "yes"
    volume.beta.kubernetes.io/storage-provisioner: fuseim.pri/ifs
  creationTimestamp: "2020-04-03T08:52:08Z"
  finalizers:
  - kubernetes.io/pvc-protection
  labels:
    app: nginx
  name: example-local-claim-web-0
  namespace: default
  resourceVersion: "609339"
  selfLink: /api/v1/namespaces/default/persistentvolumeclaims/example-local-claim-web-0
  uid: 5970b55f-0230-4fce-a762-c3bb264e5c4c
spec:
  accessModes:
  - ReadWriteOnce
  resources:
    requests:
      storage: 1Mi
  storageClassName: managed-nfs-storage
  volumeMode: Filesystem
  volumeName: pvc-5970b55f-0230-4fce-a762-c3bb264e5c4c
status:
  accessModes:
  - ReadWriteOnce
  capacity:
    storage: 1Mi
  phase: Bound
           

自動綁定了一個名稱随機的pv : volumeName: pvc-5970b55f-0230-4fce-a762-c3bb264e5c4c

檢視pv資訊

[[email protected] ~]# kubectl get pv -o yaml
apiVersion: v1
items:
- apiVersion: v1
  kind: PersistentVolume
  metadata:
    annotations:
      pv.kubernetes.io/provisioned-by: fuseim.pri/ifs
    creationTimestamp: "2020-04-03T09:13:19Z"
    finalizers:
    - kubernetes.io/pv-protection
    name: pvc-5970b55f-0230-4fce-a762-c3bb264e5c4c
    resourceVersion: "609336"
    selfLink: /api/v1/persistentvolumes/pvc-5970b55f-0230-4fce-a762-c3bb264e5c4c
    uid: e5d4627d-83fe-4c7c-8891-0f943b4f2952
  spec:
    accessModes:
    - ReadWriteOnce
    capacity:
      storage: 1Mi
    claimRef:
      apiVersion: v1
      kind: PersistentVolumeClaim
      name: example-local-claim-web-0
      namespace: default
      resourceVersion: "606112"
      uid: 5970b55f-0230-4fce-a762-c3bb264e5c4c
    nfs:
      path: /root/nfsroot/default-example-local-claim-web-0-pvc-5970b55f-0230-4fce-a762-c3bb264e5c4c
      server: 192.168.157.132
    persistentVolumeReclaimPolicy: Delete
    storageClassName: managed-nfs-storage
    volumeMode: Filesystem
  status:
    phase: Bound
kind: List
metadata:
  resourceVersion: ""
  selfLink: ""
           

可以看到自動在nfs server生成了一個目錄:default-example-local-claim-web-0-pvc-5970b55f-0230-4fce-a762-c3bb264e5c4c