nfs网络存储
数据持久化的一种方法,相当于docker的volume存储卷
我们这里使用nfs提供远程的存储机制,选择主机192.168.1.22
(所有节点都需要安装nfs的客户端方便自动挂载 yum -y install nfs-utils)
1.配置nfs服务端(192.168.1.22)
#创建目录
mkdir /data/nfs -p
#设置要共享的目录
echo "/data/nfs *(rw,no_root_squash)" >> /etc/exports
#按照顺序启动服务
systemctl restart rpcbind
systemctl restart nfs
#查看是否共享成功
[root@k8s-node02 ~]# showmount -e 192.168.1.22
Export list for 192.168.1.22:
/data/nfs *
2. 部署应用 (master)
cat > deployment.yaml <<EOF
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-dep1
spec:
replicas: 1
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.15
ports:
- containerPort: 80
volumeMounts: #挂载到容器
- name: wwwroot #设备名称
mountPath: /usr/share/nginx/html #挂载到容器的位置
volumes: #添加要挂载的设备,和containers平级
- name: wwwroot #挂载设备的名称
nfs: #nfs模式
server: 192.168.1.22 #地址
path: /data/nfs #挂载目录
EOF
部署
kubectl create -f deployment.yaml
测试
#查看容器
[root@k8s-master01 ~]# kubectl get pod
NAME READY STATUS RESTARTS AGE
nginx-dep1-7b8b548d9b-dr4g5 1/1 Running 0 3s
#登陆容器
kubectl exec -it nginx-dep1-7b8b548d9b-dr4g5 bash
#登陆到挂载进容器的目录
root@nginx-dep1-7b8b548d9b-dr4g5:/# cd /usr/share/nginx/html/
root@nginx-dep1-7b8b548d9b-dr4g5:/usr/share/nginx/html# ls
可以看到是没有数据的,因为我们以挂载形式进来是会覆盖掉该目录的,我们需要给他创建一个测试文件
#回到nfs服务端节点(192.168.1.22)
#切换到共享挂载的目录
[root@k8s-node02 ~]# cd /data/nfs/
#添加测试文件
[root@k8s-node02 nfs]# echo "hello world" > index.html
然后将这个应用的端口暴露出来(回到master节点)
kubectl expose deployment nginx-dep1 --port=80 --target-port=80 --type=NodePort
访问测试
[root@k8s-master01 ~]# kubectl get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.0.0.1 <none> 443/TCP 54d
nginx-dep1 NodePort 10.0.0.23 <none> 80:30664/TCP 69s
#访问
[root@k8s-master01 ~]# curl 192.168.1.20:30664
hello world
发现可以访问到我们在nfs共享中添加的测试文件,表示nfs挂载成功。
但是nfs网络存储有一个缺陷,如果想要使用持久化,就必须要知道nfs的地址和挂载目录
这对于存储安全来说并不友好,k8s中的方案 就是"pv","pvc"
二. PV和PVC初步使用
1. pv #持久化存储的一个比较抽象的概念,对外提供调用的地方
(通俗来说就是他会在本地存放远程存储主机的ip和共享目录,再由pvc来调用)
#PV 是Volume 之类的卷插件,但具有独立于使用PV的Pod的生命周期。
#pod挂载到pv上,即使pod死亡也不会删除
2. pvc #用于调用,不需要关系内部实现的细节,只需要调用 (就是绑定应用容器和pv卷的)
#Pod 可以请求特定级别的资源(CPU 和内存)。
#声明可以请求特定的大小和访问模式(例如,可以以读/写一次或 只读多次模式挂载)
1. 定义pv卷
cat > pv.yaml <<EOF
apiVersion: v1
kind: PersistentVolume
metadata:
name: my-pv
spec:
capacity: #设置卷属性
storage: 5Gi #设置卷大小为5G
accessModes: #访问策略
- ReadWriteMany #读写(只能有一个人保持读写)
nfs: #nfs地址
path: /data/nfs
server: 192.168.1.22
EOF
2. 定义pvc 去调用这个pv
cat > pvc.yaml <<EOF
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: my-pvc #和上面对应
spec:
accessModes: #匹配模式
- ReadWriteMany #读写更多
resources:
requests:
storage: 5Gi
EOF
3. 部署应用,调用pvc
cat > deployment.yaml <<EOF
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-dep2
spec:
replicas: 3
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.15
volumeMounts:
- name: wwwroot
mountPath: /usr/share/nginx/html
ports:
- containerPort: 80
volumes:
- name: wwwroot
persistentVolumeClaim: #指定pvc
claimName: my-pvc #pvc的名称
EOF
部署
kubectl create -f pv.yaml
kubectl create -f pvc.yaml
kubectl create -f deployment.yaml
测试
[root@k8s-master01 ~]# kubectl get pod -o wide | grep nginx-dep2
nginx-dep2-566f9b4466-hwpbf 1/1 Running 0 58s 10.244.0.7 192.168.1.20 <none> <none>
nginx-dep2-566f9b4466-m8wrg 1/1 Running 0 90s 10.244.2.11 192.168.1.21 <none> <none>
nginx-dep2-566f9b4466-qxl9r 1/1 Running 0 81s 10.244.1.10 192.168.1.22 <none> <none>
#直接访问任意pod的ip地址
[root@k8s-master01 ~]# curl 10.244.0.7
hello world
[root@k8s-master01 ~]# curl 10.244.2.11
hello world
[root@k8s-master01 ~]# curl 10.244.1.10
hello world
#发现都可以访问到,因为这里是通过pvc链接pv的nfs存储