(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