kubernetes部署NFS持久存儲(chǔ)(靜態(tài)和動(dòng)態(tài))

參考文獻(xiàn):https://blog.csdn.net/networken/article/details/86697018
本篇文章絕大部分(幾乎完全)復(fù)制粘貼,他的文章給了我很大幫助,現(xiàn)在在這里寫這篇文章,一是為了記錄,CSDN有時(shí)候文章會(huì)損壞或者服務(wù)器正在維修,二是我覺得這是一個(gè)很好的文章,自己收藏;三是自己遇到了問題,記錄一下



NFS簡介
NFS是網(wǎng)絡(luò)文件系統(tǒng)Network File System的縮寫,NFS服務(wù)器可以讓PC將網(wǎng)絡(luò)中的NFS服務(wù)器共享的目錄掛載到本地的文件系統(tǒng)中,而在本地的系統(tǒng)中來看,那個(gè)遠(yuǎn)程主機(jī)的目錄就好像是自己的一個(gè)磁盤分區(qū)一樣。

kubernetes使用NFS共享存儲(chǔ)有兩種方式:

1.手動(dòng)方式靜態(tài)創(chuàng)建所需要的PV和PVC。
2.通過創(chuàng)建PVC動(dòng)態(tài)地創(chuàng)建對(duì)應(yīng)PV,無需手動(dòng)創(chuàng)建PV。
下面對(duì)這兩種方式進(jìn)行配置并進(jìn)行演示。

搭建NFS服務(wù)器
k8s集群準(zhǔn)備,以這篇文章為例:https://blog.csdn.net/networken/article/details/84991940

我的集群是一主一從,master的IP是192.168.88.111,node1的IP是192.168.88.114

這里作為測試,臨時(shí)在master節(jié)點(diǎn)上部署NFS服務(wù)器。

#master節(jié)點(diǎn)安裝nfs
yum -y install nfs-utils

#創(chuàng)建nfs目錄
mkdir -p /nfs/data/

#修改權(quán)限
chmod -R 777 /nfs/data

#編輯export文件,這個(gè)文件就是nfs默認(rèn)的配置文件
vim /etc/exports
/nfs/data *(rw,no_root_squash,sync)

#配置生效
exportfs -r
#查看生效
exportfs

#啟動(dòng)rpcbind、nfs服務(wù)
systemctl restart rpcbind && systemctl enable rpcbind
systemctl restart nfs && systemctl enable nfs

#查看 RPC 服務(wù)的注冊狀況
rpcinfo -p localhost

#showmount測試
showmount -e 192.168.88.111

所有node節(jié)點(diǎn)安裝客戶端,開機(jī)啟動(dòng)

yum -y install nfs-utils
systemctl start nfs && systemctl enable nfs

作為準(zhǔn)備工作,我們已經(jīng)在 k8s-master(192.168.88.111) 節(jié)點(diǎn)上搭建了一個(gè) NFS 服務(wù)器,目錄為 /nfs/data

靜態(tài)申請(qǐng)PV卷
添加pv卷對(duì)應(yīng)目錄,這里創(chuàng)建2個(gè)pv卷,則添加2個(gè)pv卷的目錄作為掛載點(diǎn)。

#創(chuàng)建pv卷對(duì)應(yīng)的目錄
mkdir -p /nfs/data/pv001

#配置exportrs(我覺得可以不用這步,因?yàn)楦改夸?nfs/data,已經(jīng)設(shè)為共享文件夾)
vim /etc/exports
/nfs/data *(rw,no_root_squash,sync)
/nfs/data/pv001 *(rw,no_root_squash,sync)

#配置生效
exportfs -r
#重啟rpcbind、nfs服務(wù)
systemctl restart rpcbind && systemctl restart nfs

創(chuàng)建PV
下面創(chuàng)建名為pv001的PV卷,配置文件 nfs-pv001.yaml 如下:

[centos@k8s-master ~]$ vim nfs-pv001.yaml 
apiVersion: v1
kind: PersistentVolume
metadata:
name: nfs-pv001
labels:
  pv: nfs-pv001
spec:
capacity:
  storage: 1Gi
accessModes:
  - ReadWriteOnce
persistentVolumeReclaimPolicy: Recycle
storageClassName: nfs
nfs:
  path: /nfs/data/pv001
  server: 192.168.88.111

配置說明:
① capacity 指定 PV 的容量為 1G。
② accessModes 指定訪問模式為 ReadWriteOnce,支持的訪問模式有:

2.1ReadWriteOnce – PV 能以 read-write 模式 mount 到單個(gè)節(jié)點(diǎn)。
2.2ReadOnlyMany – PV 能以 read-only 模式 mount 到多個(gè)節(jié)點(diǎn)。
2.3ReadWriteMany – PV 能以 read-write 模式 mount 到多個(gè)節(jié)點(diǎn)。
③ persistentVolumeReclaimPolicy 指定當(dāng) PV 的回收策略為 Recycle,支持的策略有:

3.1Retain – 需要管理員手工回收。
3.2Recycle – 清除 PV 中的數(shù)據(jù),效果相當(dāng)于執(zhí)行 rm -rf /thevolume/*。
3.3Delete – 刪除 Storage Provider 上的對(duì)應(yīng)存儲(chǔ)資源,例如 AWS EBS、GCE PD、Azure
Disk、OpenStack Cinder Volume 等。
④ storageClassName 指定 PV 的 class 為 nfs。相當(dāng)于為 PV 設(shè)置了一個(gè)分類,PVC 可以指定 class 申請(qǐng)相應(yīng) class 的 PV。
⑤ 指定 PV 在 NFS 服務(wù)器上對(duì)應(yīng)的目錄。

創(chuàng)建 pv:

[centos@k8s-master ~]$ kubectl apply -f nfs-pv001.yaml 
persistentvolume/nfs-pv001 created

[centos@k8s-master ~]$ kubectl get pv
NAME    CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS      CLAIM   STORAGECLASS   REASON   AGE
nfs-pv001   1Gi        RWO            Recycle          Available           nfs                     4s

STATUS 為 Available,表示 pv就緒,可以被 PVC 申請(qǐng)。
創(chuàng)建PVC
接下來創(chuàng)建一個(gè)名為pvc001的PVC,配置文件 nfs-pvc001.yaml 如下:

[centos@k8s-master ~]$ vim nfs-pvc001.yaml               
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: nfs-pvc001
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 1Gi
  storageClassName: nfs
  selector:
    matchLabels:
      pv: nfs-pv001

執(zhí)行yaml文件創(chuàng)建 pvc:

[centos@k8s-master ~]$ kubectl apply -f nfs-pvc001.yaml 
persistentvolumeclaim/nfs-pvc001 created

[centos@k8s-master ~]$ kubectl get pvc
NAME     STATUS   VOLUME   CAPACITY   ACCESS MODES   STORAGECLASS   AGE
nfs-pvc001   Bound    pv001    1Gi        RWO            nfs            6s

[centos@k8s-master ~]$ kubectl get pv
NAME    CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS   CLAIM            STORAGECLASS   REASON   AGE
nfs-pv001   1Gi        RWO            Recycle          Bound    default/pvc001   nfs                     9m12s

從 kubectl get pvc 和 kubectl get pv 的輸出可以看到 pvc001綁定到pv001,申請(qǐng)成功。注意pvc綁定到對(duì)應(yīng)pv通過labels標(biāo)簽方式實(shí)現(xiàn),也可以不指定,將隨機(jī)綁定到pv。
接下來就可以在 Pod 中使用存儲(chǔ)了,Pod 配置文件 nfs-pod001.yaml 如下:

[centos@k8s-master ~]$ vim nfs-pod001.yaml 
kind: Pod
apiVersion: v1
metadata:
  name: nfs-pod001
spec:
  containers:
    - name: myfrontend
      image: nginx
      volumeMounts:
      - mountPath: "/var/www/html"
        name: nfs-pv001
  volumes:
    - name: nfs-pv001
      persistentVolumeClaim:
        claimName: nfs-pvc001

與使用普通 Volume 的格式類似,在 volumes 中通過 persistentVolumeClaim 指定使用nfs-pvc001申請(qǐng)的 Volume。
執(zhí)行yaml文件創(chuàng)建nfs-pdo001:

[centos@k8s-master ~]$ kubectl apply -f nfs-pod001.yaml 
pod/nfs-pod001 created

[centos@k8s-master ~]$ kubectl get pod
NAME                                      READY   STATUS    RESTARTS   AGE
nfs-client-provisioner-75bf876d88-sqqpv   1/1     Running   0          25m
nfs-pod001                                1/1     Running   0          12s

驗(yàn)證 PV 是否可用:

[centos@k8s-master ~]$ kubectl exec nfs-pod001 touch /var/www/html/index001.html                  

[centos@k8s-master ~]$ ls /nfs/data/pv001/
index001.html

進(jìn)入pod查看掛載情況

[centos@k8s-master ~]$ kubectl exec -it nfs-pod001 /bin/bash
root@nfs-pod001:/# df -h
......
192.168.92.56:/nfs/data/pv001   47G  5.2G   42G  11% /var/www/html
......
root@nfs-pod001:/# 

刪除pv
刪除pod,pv和pvc不會(huì)被刪除,nfs存儲(chǔ)的數(shù)據(jù)不會(huì)被刪除。

[centos@k8s-master ~]$ kubectl delete -f nfs-pod001.yaml 
pod "nfs-pod001" deleted

[centos@k8s-master ~]$ kubectl get pv
NAME    CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS   CLAIM            STORAGECLASS   REASON   AGE
nfs-pv001   1Gi        RWO            Recycle          Bound    default/pvc001   nfs                     34m

[centos@k8s-master ~]$ kubectl get pvc
NAME     STATUS   VOLUME   CAPACITY   ACCESS MODES   STORAGECLASS   AGE
nfs-pvc001   Bound    pv001    1Gi        RWO            nfs            25m

[centos@k8s-master ~]$ ls /nfs/data/pv001/
index001.html

繼續(xù)刪除pvc,pv將被釋放,處于 Available 可用狀態(tài),并且nfs存儲(chǔ)中的數(shù)據(jù)被刪除。

[centos@k8s-master ~]$ kubectl delete -f nfs-pvc001.yaml 
persistentvolumeclaim "nfs-pvc001" deleted

[centos@k8s-master ~]$ kubectl get pv
NAME    CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS      CLAIM            STORAGECLASS   REASON   AGE
nfs-pv001   1Gi        RWO            Recycle          Available                    nfs                     35m

[centos@k8s-master ~]$ ls /nfs/data/pv001/
[centos@k8s-master ~]$ 

繼續(xù)刪除pv

[centos@k8s-master ~]$ kubectl delete -f nfs-pv001.yaml 
persistentvolume "pv001" deleted


動(dòng)態(tài)申請(qǐng)PV卷
External NFS驅(qū)動(dòng)的工作原理
K8S的外部NFS驅(qū)動(dòng),可以按照其工作方式(是作為NFS server還是NFS client)分為兩類:
1.nfs-client:
也就是我們接下來演示的這一類,它通過K8S的內(nèi)置的NFS驅(qū)動(dòng)掛載遠(yuǎn)端的NFS服務(wù)器到本地目錄;然后將自身作為storage provider,關(guān)聯(lián)storage class。當(dāng)用戶創(chuàng)建對(duì)應(yīng)的PVC來申請(qǐng)PV時(shí),該provider就將PVC的要求與自身的屬性比較,一旦滿足就在本地掛載好的NFS目錄中創(chuàng)建PV所屬的子目錄,為Pod提供動(dòng)態(tài)的存儲(chǔ)服務(wù)。
2.nfs:
與nfs-client不同,該驅(qū)動(dòng)并不使用k8s的NFS驅(qū)動(dòng)來掛載遠(yuǎn)端的NFS到本地再分配,而是直接將本地文件映射到容器內(nèi)部,然后在容器內(nèi)使用ganesha.nfsd來對(duì)外提供NFS服務(wù);在每次創(chuàng)建PV的時(shí)候,直接在本地的NFS根目錄中創(chuàng)建對(duì)應(yīng)文件夾,并export出該子目錄。
利用NFS動(dòng)態(tài)提供Kubernetes后端存儲(chǔ)卷
本文將介紹使用nfs-client-provisioner這個(gè)應(yīng)用,利用NFS Server給Kubernetes作為持久存儲(chǔ)的后端,并且動(dòng)態(tài)提供PV。前提條件是有已經(jīng)安裝好的NFS服務(wù)器,并且NFS服務(wù)器與Kubernetes的Slave節(jié)點(diǎn)都能網(wǎng)絡(luò)連通。將nfs-client驅(qū)動(dòng)做一個(gè)deployment部署到K8S集群中,然后對(duì)外提供存儲(chǔ)服務(wù)。
nfs-client-provisioner 是一個(gè)Kubernetes的簡易NFS的外部provisioner,本身不提供NFS,需要現(xiàn)有的NFS服務(wù)器提供存儲(chǔ)

部署nfs-client-provisioner
(在master上操作,即192.168.88.111)
首先克隆倉庫獲取yaml文件

git clone https://github.com/kubernetes-incubator/external-storage.git
cp -R external-storage/nfs-client/deploy/ $HOME
cd deploy

修改deployment.yaml文件
這里修改的參數(shù)包括NFS服務(wù)器所在的IP地址(192.168.88.111),以及NFS服務(wù)器共享的路徑(/nfs/data),兩處都需要修改為你實(shí)際的NFS服務(wù)器和共享目錄。

[root@K8S-M1 deploy]# cat deployment.yaml
apiVersion: v1
kind: ServiceAccount
metadata:
  name: nfs-client-provisioner
---
kind: Deployment
apiVersion: extensions/v1beta1
metadata:
  name: nfs-client-provisioner
spec:
  replicas: 1
  strategy:
    type: Recreate
  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: fuseim.pri/ifs
            - name: NFS_SERVER
              value: 192.168.88.111
            - name: NFS_PATH
              value: /nfs/data
      volumes:
        - name: nfs-client-root
          nfs:
            server: 192.168.88.111
            path: /nfs/data

這里我就有點(diǎn)疑惑了,這里既部署了deployment,也部署了ServiceAccount,在后面的rbac.yaml里也有同樣的,所以我認(rèn)為是應(yīng)該是現(xiàn)在不需要這個(gè)ServiceAccount的創(chuàng)建??赡芫褪且?yàn)檫@個(gè),所以我的pvc動(dòng)態(tài)創(chuàng)建就出現(xiàn)了問題

部署deployment.yaml
(修改部分信息,參考上面)

kubectl apply -f deployment.yaml

查看創(chuàng)建的POD

[centos@k8s-master deploy]$ kubectl get pod -o wide
NAME                                      READY   STATUS             RESTARTS   AGE   IP             NODE        NOMINATED NODE   READINESS GATES
nfs-client-provisioner-75bf876d88-578lg   1/1     Running            0          51m   10.244.2.131   k8s-node2   <none>           <none>

創(chuàng)建StorageClass
storage class的定義,需要注意的是:provisioner屬性要等于驅(qū)動(dòng)所傳入的環(huán)境變量PROVISIONER_NAME的值。否則,驅(qū)動(dòng)不知道知道如何綁定storage class。
此處可以不修改,或者修改provisioner的名字,需要與上面的deployment的PROVISIONER_NAME名字一致。
(此yaml無需修改)

[centos@k8s-master deploy]$ cat class.yaml 
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"

部署yaml文件

kubectl apply -f class.yaml

查看創(chuàng)建的storageclass

[centos@k8s-master deploy]$ kubectl get sc
NAME                  PROVISIONER      AGE
managed-nfs-storage   fuseim.pri/ifs   95m
[centos@k8s-master deploy]$ 

配置授權(quán)
如果集群啟用了RBAC,則必須執(zhí)行如下命令授權(quán)provisioner。(k8s1.6+默認(rèn)開啟)
此yaml無需修改

[centos@k8s-master deploy]$ cat rbac.yaml 
kind: ServiceAccount
apiVersion: v1
metadata:
  name: nfs-client-provisioner
---
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
    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
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

部署yaml文件

kubectl create -f rbac.yaml

測試

創(chuàng)建測試PVC

kubectl create -f test-claim.yaml

這里指定了其對(duì)應(yīng)的storage-class的名字為managed-nfs-storage,如下:

[centos@k8s-master deploy]$ cat test-claim.yaml 
kind: PersistentVolumeClaim
apiVersion: v1
metadata:
  name: test-claim
  annotations:
    volume.beta.kubernetes.io/storage-class: "managed-nfs-storage"
spec:
  accessModes:
    - ReadWriteMany
  resources:
    requests:
      storage: 1Mi

查看創(chuàng)建的PVC
可以看到PVC狀態(tài)為Bound,綁定的volume為pvc-a17d9fd5-237a-11e9-a2b5-000c291c25f3。

[centos@k8s-master deploy]$ kubectl get pvc
NAME         STATUS   VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS          AGE
test-claim   Bound    pvc-a17d9fd5-237a-11e9-a2b5-000c291c25f3   1Mi        RWX            managed-nfs-storage   34m

查看自動(dòng)創(chuàng)建的PV

[centos@k8s-master deploy]$ kubectl get pv
NAME                                       CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS   CLAIM                STORAGECLASS          REASON   AGE
pvc-a17d9fd5-237a-11e9-a2b5-000c291c25f3   1Mi        RWX            Delete           Bound    default/test-claim   managed-nfs-storage            34m
[centos@k8s-master deploy]$ 

然后,我們進(jìn)入到NFS的export目錄,可以看到對(duì)應(yīng)該volume name的目錄已經(jīng)創(chuàng)建出來了。
其中volume的名字是namespace,PVC name以及uuid的組合:

[root@k8s-master ~]# cd /nfs/data/
[root@k8s-master data]# ll
total 0
drwxrwxrwx 2 root root 21 Jan 29 12:03 default-test-claim-pvc-a17d9fd5-237a-11e9-a2b5-000c291c25f3

創(chuàng)建測試Pod
指定該pod使用我們剛剛創(chuàng)建的PVC:test-claim,另外注意這里將鏡像改為dockerhub鏡像。
完成之后,如果attach到pod中執(zhí)行一些文件的讀寫操作,就可以確定pod的/mnt已經(jīng)使用了NFS的存儲(chǔ)服務(wù)了。

[centos@k8s-master deploy]$ vim test-pod.yaml 
kind: Pod
apiVersion: v1
metadata:
  name: test-pod
spec:
  containers:
  - name: test-pod
    image: willdockerhub/busybox:1.24
    command:
      - "/bin/sh"
    args:
      - "-c"
      - "touch /mnt/SUCCESS && exit 0 || exit 1"
    volumeMounts:
      - name: nfs-pvc
        mountPath: "/mnt"
  restartPolicy: "Never"
  volumes:
    - name: nfs-pvc
      persistentVolumeClaim:
        claimName: test-claim

執(zhí)行yaml文件

kubectl create -f test-pod.yaml

查看創(chuàng)建的測試POD

[centos@k8s-master ~]$ kubectl get pod -o wide
NAME                                      READY   STATUS             RESTARTS   AGE   IP             NODE        NOMINATED NODE   READINESS GATES
nfs-client-provisioner-75bf876d88-578lg   1/1     Running            0          51m   10.244.2.131   k8s-node2   <none>           <none>
test-pod                                  0/1     Completed          0          41m   10.244.1.

在NFS服務(wù)器上的共享目錄下的卷子目錄中檢查創(chuàng)建的NFS PV卷下是否有"SUCCESS" 文件。

[root@k8s-master ~]# cd /nfs/data/
[root@k8s-master data]# ll
total 0
drwxrwxrwx 2 root root 21 Jan 29 12:03 default-test-claim-pvc-a17d9fd5-237a-11e9-a2b5-000c291c25f3
[root@k8s-master data]# 

[root@k8s-master data]# cd default-test-claim-pvc-a17d9fd5-237a-11e9-a2b5-000c291c25f3/
[root@k8s-master default-test-claim-pvc-a17d9fd5-237a-11e9-a2b5-000c291c25f3]# ll
total 0
-rw-r--r-- 1 root root 0 Jan 29 12:03 SUCCESS

清理測試環(huán)境
刪除測試POD

kubectl delete -f test-pod.yaml

刪除測試PVC

kubectl delete -f test-claim.yaml

在NFS服務(wù)器上的共享目錄下查看NFS的PV卷已經(jīng)被刪除。

ok,成功了



說一下我當(dāng)時(shí)遇到的問題,當(dāng)時(shí)創(chuàng)建pv后,pv顯示pending

[root@K8S-M1 deploy]# kubectl describe pvc test-claim
Name:          test-claim
Namespace:     default
StorageClass:  managed-nfs-storage
Status:        Bound
Volume:        pvc-962a06fa-67db-11e9-963d-000c29619b15
Labels:        <none>
Annotations:   pv.kubernetes.io/bind-completed: yes
               pv.kubernetes.io/bound-by-controller: yes
               volume.beta.kubernetes.io/storage-class: managed-nfs-storage
               volume.beta.kubernetes.io/storage-provisioner: fuseim.pri/ifs
Finalizers:    [kubernetes.io/pvc-protection]
Capacity:      1Mi
Events:
  Type    Reason                Age   From                         Message
  ----    ------                ----  ----                         -------
  Normal  ExternalProvisioning  10s   persistentvolume-controller  waiting for a volume to be created, either by external provisioner "fuseim.pri/ifs" or manually created by system administrator

即正在等待外部設(shè)置程序“fuseim.pri/ifs”或系統(tǒng)管理員手動(dòng)創(chuàng)建卷
我參考了這個(gè)文章
https://github.com/kubernetes-incubator/external-storage/issues/754
試著執(zhí)行此yaml

apiVersion: rbac.authorization.k8s.io/v1beta1
kind: ClusterRoleBinding
metadata:
  name: default-admin-rbac (or whatever)
subjects:
  - kind: ServiceAccount
    name: default
    namespace: default
roleRef:
  kind: ClusterRole
  name: cluster-admin
  apiGroup: rbac.authorization.k8s.io

試過,依舊不可以
我發(fā)現(xiàn)我的nfs-client-provisioner-xxx的pod會(huì)出現(xiàn)running后,過一陣子后出現(xiàn)CrashLoopBackOff ,即說明容器曾經(jīng)啟動(dòng)了,但又異常退出了。
通過kubectl logs -f 命令查看,發(fā)現(xiàn)

nfs-client-provisioner: dial tcp 192.168.88.114:10250: connect: connection refused

或者(我不記得是哪個(gè)了)

[root@K8S-M1 deploy]# kubectl get pod
NAME                                      READY   STATUS             RESTARTS   AGE
nfs-client-provisioner-648f9b65c6-snsc6   0/1     CrashLoopBackOff   6          14m
[root@K8S-M1 deploy]# kubectl logs -f nfs-client-provisioner-648f9b65c6-snsc6
F0427 02:58:21.988130       1 provisioner.go:180] Error getting server version: Get https://10.10.10.1:443/version?timeout=32s: dial tcp 10.10.10.1:443: i/o timeout

192.168.88.114是我的node,也是此pod所在的node。 所以我覺得是我的provisioner的原因,但是你刪除pod,還是不可以,pod的狀態(tài)和pvc的狀態(tài)依舊。
或者第二種情況,不過這種我也找不出原因

當(dāng)我把provisioner的deployment刪除后,(我不記得是否重啟了虛擬機(jī)),重新 kubectl create -f ,創(chuàng)建deployment和pod,這次觀察pod ,一直running,查看日志

[root@K8S-M1 deploy]# kubectl logs -f nfs-client-provisioner-c85fbcc5d-mtgb8
I0426 05:03:50.995699       1 leaderelection.go:185] attempting to acquire leader lease  default/fuseim.pri-ifs...
I0426 05:03:51.083275       1 leaderelection.go:194] successfully acquired lease default/fuseim.pri-ifs
I0426 05:03:51.084006       1 controller.go:631] Starting provisioner controller fuseim.pri/ifs_nfs-client-provisioner-c85fbcc5d-mtgb8_ae87400d-67e0-11e9-84ac-0242ac110304!
I0426 05:03:51.084350       1 event.go:221] Event(v1.ObjectReference{Kind:"Endpoints", Namespace:"default", Name:"fuseim.pri-ifs", UID:"ae9593ed-67e0-11e9-963d-000c29619b15", APIVersion:"v1", ResourceVersion:"246640", FieldPath:""}): type: 'Normal' reason: 'LeaderElection' nfs-client-provisioner-c85fbcc5d-mtgb8_ae87400d-67e0-11e9-84ac-0242ac110304 became leader
I0426 05:03:51.205879       1 controller.go:680] Started provisioner controller fuseim.pri/ifs_nfs-client-provisioner-c85fbcc5d-mtgb8_ae87400d-67e0-11e9-84ac-0242ac110304!
I0426 05:03:51.206648       1 controller.go:987] provision "default/test-claim" class "managed-nfs-storage": started

這時(shí)再查看pvc,發(fā)現(xiàn)成功(或者你重新創(chuàng)建pvc)

[root@K8S-M1 deploy]# kubectl get pvc
NAME                     STATUS   VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS          AGE
test-claim               Bound    pvc-962a06fa-67db-11e9-963d-000c29619b15   1Mi        RWX            managed-nfs-storage   40m

[root@K8S-M1 deploy]# kubectl get pv
NAME                                       CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS      CLAIM                            STORAGECLASS          REASON   AGE
pvc-962a06fa-67db-11e9-963d-000c29619b15   1Mi        RWX            Delete           Bound       default/test-claim               managed-nfs-storage            3m59s

發(fā)現(xiàn)成功創(chuàng)建了pv,并且綁定
再次查看provisioner的pod的日志,發(fā)現(xiàn)在上次的記錄之外,多了下面的記錄

I0426 05:03:51.213869       1 event.go:221] Event(v1.ObjectReference{Kind:"PersistentVolumeClaim", Namespace:"default", Name:"test-claim", UID:"962a06fa-67db-11e9-963d-000c29619b15", APIVersion:"v1", ResourceVersion:"244152", FieldPath:""}): type: 'Normal' reason: 'Provisioning' External provisioner is provisioning volume for claim "default/test-claim"
I0426 05:03:51.224187       1 controller.go:1087] provision "default/test-claim" class "managed-nfs-storage": volume "pvc-962a06fa-67db-11e9-963d-000c29619b15" provisioned
I0426 05:03:51.224252       1 controller.go:1101] provision "default/test-claim" class "managed-nfs-storage": trying to save persistentvvolume "pvc-962a06fa-67db-11e9-963d-000c29619b15"
I0426 05:03:51.299834       1 controller.go:1108] provision "default/test-claim" class "managed-nfs-storage": persistentvolume "pvc-962a06fa-67db-11e9-963d-000c29619b15" saved
I0426 05:03:51.299895       1 controller.go:1149] provision "default/test-claim" class "managed-nfs-storage": succeeded
I0426 05:03:51.300609       1 event.go:221] Event(v1.ObjectReference{Kind:"PersistentVolumeClaim", Namespace:"default", Name:"test-claim", UID:"962a06fa-67db-11e9-963d-000c29619b15", APIVersion:"v1", ResourceVersion:"244152", FieldPath:""}): type: 'Normal' reason: 'ProvisioningSucceeded' Successfully provisioned volume pvc-962a06fa-67db-11e9-963d-000c29619b15

說明provisioner成功工作,nfs動(dòng)態(tài)存儲(chǔ)也成功了。我想了一下,可能是再創(chuàng)建provisioner的deployment時(shí),也創(chuàng)建了ServiceAccount,但是這個(gè)ServiceAccount還沒有綁定具有權(quán)限的ClusterRole,雖然后面的rbac.yaml里寫入了,但是deployment已經(jīng)把沒有綁定權(quán)限的ClusterRole的ServiceAccount寫入到環(huán)境里,它已經(jīng)不受后面操作的影響了,所以pvc才說正在等待外部設(shè)置程序“fuseim.pri/ifs”或系統(tǒng)管理員手動(dòng)創(chuàng)建卷,pod無法作為provisioner來創(chuàng)建pvc,所以pvc一直pending。

1.所以deployment就只需要?jiǎng)?chuàng)建provisioner的deployment,可以把創(chuàng)建ServiceAccount的代碼刪除,由rbac.yaml去統(tǒng)一創(chuàng)建綁定。
2.也可能需要需要先創(chuàng)建rbac.yaml,再創(chuàng)建deployment和storageClass。
3.也可能就是偶然,出現(xiàn)這種情況就刪除deployment,重新創(chuàng)建
4.因?yàn)槲沂窃诠P記本上用虛擬機(jī)創(chuàng)建k8s集群,所以有時(shí)候node會(huì)noready,出現(xiàn)了很多次,需要重啟node,錯(cuò)誤過程中(這幾個(gè)小時(shí)里)也出現(xiàn)了,我不知道是不是一直NotReady。所以可能是因?yàn)閚ode NotReady,所以pod才會(huì)重啟為CrashLoopBackOff,所以日志會(huì)顯示nfs-client-provisioner: dial tcp 192.168.88.114:10250: connect: connection refused,無法作為provisioner來動(dòng)態(tài)創(chuàng)建pv,這也是一種可能
5.虛擬機(jī)掛起,關(guān)機(jī)后啟動(dòng)出現(xiàn)某種緩存類似的問題,
也可能是都不對(duì),哈哈,只是舉了我的幾個(gè)想法,不完全。


我剛剛又重新創(chuàng)建pvc,發(fā)現(xiàn)

[root@K8S-M1 deploy]# kubectl describe pvc test-claim
Name:          test-claim
Namespace:     default
StorageClass:  managed-nfs-storage
Status:        Bound
Volume:        pvc-0d94a6a4-6800-11e9-963d-000c29619b15
Labels:        <none>
Annotations:   pv.kubernetes.io/bind-completed: yes
               pv.kubernetes.io/bound-by-controller: yes
               volume.beta.kubernetes.io/storage-class: managed-nfs-storage
               volume.beta.kubernetes.io/storage-provisioner: fuseim.pri/ifs
Finalizers:    [kubernetes.io/pvc-protection]
Capacity:      1Mi
Access Modes:  RWX
Events:
  Type       Reason                 Age                From                                                                                        Message
  ----       ------                 ----               ----                                                                                        -------
  Normal     ExternalProvisioning   76s (x2 over 76s)  persistentvolume-controller                                                                 waiting for a volume to be created, either by external provisioner "fuseim.pri/ifs" or manually created by system administrator
  Normal     Provisioning           76s                fuseim.pri/ifs_nfs-client-provisioner-c85fbcc5d-mtgb8_ae87400d-67e0-11e9-84ac-0242ac110304  External provisioner is provisioning volume for claim "default/test-claim"
  Normal     ProvisioningSucceeded  76s                fuseim.pri/ifs_nfs-client-provisioner-c85fbcc5d-mtgb8_ae87400d-67e0-11e9-84ac-0242ac110304  Successfully provisioned volume pvc-0d94a6a4-6800-11e9-963d-000c29619b15
Mounted By:  <none>

也是出現(xiàn)了waiting for a volume to be created, either by external provisioner "fuseim.pri/ifs" or manually created by system administrator,后面External provisioner給他創(chuàng)建pv來提供。一會(huì)時(shí)間。但是之前那個(gè)是一直創(chuàng)建不了,一直pending,那就是External provisioner的pod(deployment)有問題。這只是補(bǔ)充情況


虛擬機(jī)掛起后啟動(dòng)(從掛起到啟動(dòng))出現(xiàn)了下面的情況,pod重新創(chuàng)建了

[root@K8S-M1 deploy]# kubectl get pod
NAME                                      READY   STATUS             RESTARTS   AGE
nfs-client-provisioner-648f9b65c6-snsc6   0/1     CrashLoopBackOff   6          14m
[root@K8S-M1 deploy]# kubectl logs -f nfs-client-provisioner-648f9b65c6-snsc6
F0427 02:58:21.988130       1 provisioner.go:180] Error getting server version: Get https://10.10.10.1:443/version?timeout=32s: dial tcp 10.10.10.1:443: i/o timeout

不過如果虛擬機(jī)一直開著,那么不會(huì)出現(xiàn)這種情況,應(yīng)該是虛擬機(jī)掛起到啟動(dòng),k8s的某種緩存或者其他原因?qū)е聲?huì)出現(xiàn)這種情況。如果你裝nfs-provisioner,出現(xiàn)這種情況,那么就重啟虛擬機(jī),不行就重啟電腦,再重新部署deployment(可能也不需要吧,就刪除pod)



OK,感覺已經(jīng)解決了
在我掛起(可能關(guān)機(jī))虛擬機(jī)后,啟動(dòng)(從掛起到啟動(dòng))虛擬機(jī)后,k8s的provisioner的pod就出現(xiàn)了上面的情況,即使重新部署deployment,也不行。我重啟k8s(master和node),好像也不行。我后面重啟電腦后,打開虛擬機(jī)后,再次部署provisioner的deployment,就OK了。說明這是偶然的,重啟虛擬機(jī)的k8s就可能解決,起因可能是虛擬機(jī)掛起后重新啟動(dòng),k8s就出現(xiàn)某種問題,解決方案 重啟虛擬機(jī)或者直接重啟電腦。說明應(yīng)該是原因5。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 230,321評(píng)論 6 543
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 99,559評(píng)論 3 429
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事?!?“怎么了?”我有些...
    開封第一講書人閱讀 178,442評(píng)論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,835評(píng)論 1 317
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 72,581評(píng)論 6 412
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 55,922評(píng)論 1 328
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼。 笑死,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,931評(píng)論 3 447
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 43,096評(píng)論 0 290
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 49,639評(píng)論 1 336
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 41,374評(píng)論 3 358
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 43,591評(píng)論 1 374
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,104評(píng)論 5 364
  • 正文 年R本政府宣布,位于F島的核電站,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 44,789評(píng)論 3 349
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,196評(píng)論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,524評(píng)論 1 295
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 52,322評(píng)論 3 400
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 48,554評(píng)論 2 379