(1). NFS网络存储

emptyDir会随着Pod的消失,数据也会消失.而NFS是利用一台主机专门存储数据.容器启动时挂载NFS.

(2). NFS服务器配置

# 1. 安装nfs
[root@master ~]# yum -y install nfs-utils

# 2. 创建挂载目录
[root@master ~]# mkdir -p /data/volumes

# 3. 配置挂载路径
[root@master ~]# cat /etc/exports
/data/volumes  *(rw,no_root_squash)

# 启动rpcbind,如果不启用rpcbind:会报错:mount.nfs: Connection refused
[root@master ~]# systemctl daemon-reload
[root@master ~]# systemctl enable rpcbind.service
[root@master ~]# systemctl start rpcbind.service

# 4. 启动nfs服务
[root@master ~]# systemctl start nfs

# 检查是否启动成功
[root@master ~]# ps -ef|grep nfs
root     25209     2  0 15:49 ?        00:00:00 [nfsd4_callbacks]

(3). K8S Node(宿主机上)安装nfs

# 在Node(宿主机上)都要安装nfs
[root@node-1 ~]# yum -y install nfs-utils
[root@node-2 ~]# yum -y install nfs-utils

(4). K8S启动容器,挂载NFS文件

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx
  labels:
    name: nginx
spec:
  replicas: 1
  selector:
    matchLabels:
      name: nginx
  template:
    metadata:
      labels:
        name: nginx
    spec:
      containers:
        - name: nginx
          image: nginx:latest
          ports:
          - containerPort: 80
          volumeMounts:
            - name: wwwroot
              mountPath: /usr/share/nginx/html
      volumes:
        - name: wwwroot
          nfs:
            server: 10.211.55.100
            path: "/data/volumes/www-lixin-help"

(5). 创建nginx信息

# 创建Nginx挂载目录文件夹
[root@master ~]# mkdir -p /data/volumes/www-lixin-help

# 创建index.html
[root@master ~]# echo "welcome to use nginx" > /data/volumes/www-lixin-help/index.html

(6). 部署应用

# 部署应用
[root@master ~]# kubectl apply -f nfs-nginx.yml
deployment.apps/nginx created

# 查看pod状态
[root@master ~]# kubectl describe pod  nginx-6f7f894b8-m8zwm
Name:           nginx-6f7f894b8-m8zwm
Namespace:      default
Priority:       0
Node:           node-2/10.211.55.102
Start Time:     Mon, 18 Jan 2021 16:11:24 +0800
Labels:         name=nginx
                pod-template-hash=6f7f894b8
Annotations:    <none>
Status:         Pending
IP:
Controlled By:  ReplicaSet/nginx-6f7f894b8
Containers:
  nginx:
    Container ID:
    Image:          nginx:latest
    Image ID:
    Port:           80/TCP
    Host Port:      0/TCP
    State:          Waiting
      Reason:       ContainerCreating
    Ready:          False
    Restart Count:  0
    Environment:    <none>
    Mounts:
      /usr/share/nginx/html from wwwroot (rw)
      /var/run/secrets/kubernetes.io/serviceaccount from default-token-9dkwx (ro)
Conditions:
  Type              Status
  Initialized       True
  Ready             False
  ContainersReady   False
  PodScheduled      True
Volumes:
  wwwroot:
    Type:      NFS (an NFS mount that lasts the lifetime of a pod)
    Server:    10.211.55.100
    Path:      /data/volumes/www-lixin-help
    ReadOnly:  false
  default-token-9dkwx:
    Type:        Secret (a volume populated by a Secret)
    SecretName:  default-token-9dkwx
    Optional:    false
QoS Class:       BestEffort
Node-Selectors:  <none>
Tolerations:     node.kubernetes.io/not-ready:NoExecute for 300s
                 node.kubernetes.io/unreachable:NoExecute for 300s
Events:
  Type     Reason       Age    From               Message
  ----     ------       ----   ----               -------
  Normal   Scheduled    3m17s  default-scheduler  Successfully assigned default/nginx-6f7f894b8-m8zwm to node-2
  Warning  FailedMount  74s    kubelet, node-2    Unable to mount volumes for pod "nginx-6f7f894b8-m8zwm_default(34d2cc4a-9883-436e-a54d-51aa39e51a24)": timeout expired waiting for volumes to attach or mount for pod "default"/"nginx-6f7f894b8-m8zwm". list of unmounted volumes=[wwwroot]. list of unattached volumes=[wwwroot default-token-9dkwx]
  Warning  FailedMount  71s    kubelet, node-2    MountVolume.SetUp failed for volume "wwwroot" : mount failed: exit status 32
Mounting command: systemd-run
Mounting arguments: --description=Kubernetes transient mount for /var/lib/kubelet/pods/34d2cc4a-9883-436e-a54d-51aa39e51a24/volumes/kubernetes.io~nfs/wwwroot --scope -- mount -t nfs 10.211.55.100:/data/volumes/www-lixin-help /var/lib/kubelet/pods/34d2cc4a-9883-436e-a54d-51aa39e51a24/volumes/kubernetes.io~nfs/wwwroot
Output: Running scope as unit run-4873.scope.
mount.nfs: Connection refused
  Warning  FailedMount  25s  kubelet, node-2  MountVolume.SetUp failed for volume "wwwroot" : mount failed: exit status 32

(7). mount.nfs: Connection refused

# 启用(动)rpcbind
[root@master ~]# systemctl daemon-reload
[root@master ~]# systemctl enable rpcbind.service
[root@master ~]# systemctl start rpcbind.service

(8). 再次查看Pod信息

nginx挂载并启动成功.

[root@master ~]# kubectl describe pod  nginx-6f7f894b8-m8zwm
Name:           nginx-6f7f894b8-m8zwm
Namespace:      default
Priority:       0
Node:           node-2/10.211.55.102
Start Time:     Mon, 18 Jan 2021 16:11:24 +0800
Labels:         name=nginx
                pod-template-hash=6f7f894b8
Annotations:    <none>
Status:         Running
IP:             10.244.2.106
Controlled By:  ReplicaSet/nginx-6f7f894b8
Containers:
  nginx:
    Container ID:   docker://02e6eeddab185738e950954e23834a219a210a3c63a0e65add3d8221b5248ca2
    Image:          nginx:latest
    Image ID:       docker-pullable://nginx@sha256:10b8cc432d56da8b61b070f4c7d2543a9ed17c2b23010b43af434fd40e2ca4aa
    Port:           80/TCP
    Host Port:      0/TCP
    State:          Running
      Started:      Mon, 18 Jan 2021 16:18:25 +0800
    Ready:          True
    Restart Count:  0
    Environment:    <none>
    Mounts:
      /usr/share/nginx/html from wwwroot (rw)
      /var/run/secrets/kubernetes.io/serviceaccount from default-token-9dkwx (ro)
Conditions:
  Type              Status
  Initialized       True
  Ready             True
  ContainersReady   True
  PodScheduled      True
Volumes:
  wwwroot:
    Type:      NFS (an NFS mount that lasts the lifetime of a pod)
    Server:    10.211.55.100
    Path:      /data/volumes/www-lixin-help
    ReadOnly:  false
  default-token-9dkwx:
    Type:        Secret (a volume populated by a Secret)
    SecretName:  default-token-9dkwx
    Optional:    false
QoS Class:       BestEffort
Node-Selectors:  <none>
Tolerations:     node.kubernetes.io/not-ready:NoExecute for 300s
                 node.kubernetes.io/unreachable:NoExecute for 300s
Events:
  Type     Reason       Age    From               Message
  ----     ------       ----   ----               -------
  Normal   Scheduled    8m57s  default-scheduler  Successfully assigned default/nginx-6f7f894b8-m8zwm to node-2
  Warning  FailedMount  6m51s  kubelet, node-2    MountVolume.SetUp failed for volume "wwwroot" : mount failed: exit status 32
Mounting command: systemd-run
Mounting arguments: --description=Kubernetes transient mount for /var/lib/kubelet/pods/34d2cc4a-9883-436e-a54d-51aa39e51a24/volumes/kubernetes.io~nfs/wwwroot --scope -- mount -t nfs 10.211.55.100:/data/volumes/www-lixin-help /var/lib/kubelet/pods/34d2cc4a-9883-436e-a54d-51aa39e51a24/volumes/kubernetes.io~nfs/wwwroot
Output: Running scope as unit run-4873.scope.
mount.nfs: Connection refused
  Warning  FailedMount  4m45s  kubelet, node-2  MountVolume.SetUp failed for volume "wwwroot" : mount failed: exit status 32
Mounting command: systemd-run
Mounting arguments: --description=Kubernetes transient mount for /var/lib/kubelet/pods/34d2cc4a-9883-436e-a54d-51aa39e51a24/volumes/kubernetes.io~nfs/wwwroot --scope -- mount -t nfs 10.211.55.100:/data/volumes/www-lixin-help /var/lib/kubelet/pods/34d2cc4a-9883-436e-a54d-51aa39e51a24/volumes/kubernetes.io~nfs/wwwroot
Output: Running scope as unit run-5573.scope.
mount.nfs: Connection refused
  Warning  FailedMount  2m39s  kubelet, node-2  MountVolume.SetUp failed for volume "wwwroot" : mount failed: exit status 32
Mounting command: systemd-run
Mounting arguments: --description=Kubernetes transient mount for /var/lib/kubelet/pods/34d2cc4a-9883-436e-a54d-51aa39e51a24/volumes/kubernetes.io~nfs/wwwroot --scope -- mount -t nfs 10.211.55.100:/data/volumes/www-lixin-help /var/lib/kubelet/pods/34d2cc4a-9883-436e-a54d-51aa39e51a24/volumes/kubernetes.io~nfs/wwwroot
Output: Running scope as unit run-6219.scope.
mount.nfs: Connection refused
  Warning  FailedMount  2m20s (x3 over 6m54s)  kubelet, node-2  Unable to mount volumes for pod "nginx-6f7f894b8-m8zwm_default(34d2cc4a-9883-436e-a54d-51aa39e51a24)": timeout expired waiting for volumes to attach or mount for pod "default"/"nginx-6f7f894b8-m8zwm". list of unmounted volumes=[wwwroot]. list of unattached volumes=[wwwroot default-token-9dkwx]
  Normal   Pulling      2m1s                   kubelet, node-2  Pulling image "nginx:latest"
  Normal   Pulled       116s                   kubelet, node-2  Successfully pulled image "nginx:latest"
  Normal   Created      116s                   kubelet, node-2  Created container nginx
  Normal   Started      116s                   kubelet, node-2  Started container nginx

(9). 测试

# 获取:nginx pod的:IP
[root@master ~]# kubectl get pods -o wide
NAME                           READY   STATUS    RESTARTS   AGE   IP             NODE     NOMINATED NODE   READINESS GATES
nginx-6f7f894b8-m8zwm         1/1     Running   0          47s   10.244.1.107   node-1   <none>           <none>

# 测试访问是否自己创建的index.html内容
[root@master ~]# curl http://10.244.1.107
welcome to use nginx

(10). NFS相关知识链接

“https://www.jianshu.com/p/90f9fb5d8f27”