一.利用NFS-[pv/pvc]实现k8s持久化存储
1.安装NFS
这里在master上安装:
mkdir -p /server/yaml/{pod,configmap,pv,pvc,deployment,service}
mkdir /NFS && chmod 777 NFS
yum -y install nfs-util*
cat >/etc/exports<<EOF
/home *(rw,sync,no_root_squash)
EOF
#* 表示所有ip都可以挂载我的nfs,可以写成192.168.0.0/24
systemctl start rpcbind
systemctl start nfs
测试:
showmount -e 127.0.0.1
出现:
Export list for 127.0.0.1:
/NFS *
表示OK
出现测试报错: mount -t nfs 192.168.0.124:/NFS /mntmount.nfs: access denied by server while mounting 192.168.0.124:/NFSvi 修改为:/etc/exports
/NFS * (insecure,rw,sync,no_root_squash)重启即可
客户端安装测试:
yum install nfs-utils rpcbind -y
#/etc/init.d/rpcbind start
systemctl restart rpcbind
showmount -e 192.168.0.124 && echo "nfs安装成功"
###############################################################
pod.yaml:创建基础pod信息包括环境变量等等
server.yaml:创建一个内部不的虚拟ip:port(供集群内部客户端访问服务的入口),暴露一个nodePort端口供集群外部访问的入口(还有一种方式是LoadBalance方式),并指定目标端口(pod的端口)
Deployment.yaml:对pod副本数量,内容更新,回滚等
StatefulSet.yaml:有状态的服务
configmap.yaml:类似于Deployment.yaml,在Kind为:Deployment中挂在volumes configMap.
PersistentVolume.yaml:pv 是集群的一个网络存储资源。如现实中可将存储如:nfs,ceph等划分多个为pv,用于pvc的消费。创建后可在Deployment.yaml中使用pvc来消费pv
PersistentVolumeClaim:pvc 是pv的一个请求用于消费pv。类似于pod消费node的资源一样。这里pvc消费pv资源。pod 借助pvc来访问后面真正的pv。这两者的使用需要在Deployment.yaml中挂在使用。
2.创建相关挂在目录(Pod挂在NFS作为所有pod共享存储如:nginx的项目目录。挂载pv作为pod自身持久化存储如:nginx 的log日志.这里主要测试两种挂在方式。其实可以全部使用pv/pvc方式进行共享存储,没必要进行NFS的单独挂载,设置访问方式为:ReadWriteMany多节点可读可写)
利用NFS作为网站程序的共享目录,利用pv作为nginx pod日志持久化目录。所以需要在NFS上先创建出相关目录
#在NFS的共享目录(/NFS)下创建创建pv01,pv02,pv03目录.作为三个pv的绑定目录.用于存储pod的日志
#NFS服务器上操作如下命令
cd /NFS && mkdir pv01 pv02 pv03
#在NFS的共享目录(/NFS)下创建创建wwwroot目录.作为三个pv的绑定目录。用于存储nginx的项目目录
cd /NFS && mkdir wwwroot
3.创建pv yaml文件 (pv可以创建多个,这里创建三个pv 并绑定NFS上的刚才创建的三个目录)
cd /server/yaml/pv
cat>nfs-pv.yaml<<EOF
apiVersion: v1
kind: PersistentVolume
metadata:
name: pv-nfs-pv01
spec:
capacity:
storage: 1Gi
accessModes:
- ReadWriteMany
nfs:
path: /NFS/pv01
server: 192.168.0.14
---
apiVersion: v1
kind: PersistentVolume
metadata:
name: pv-nfs-pv02
spec:
capacity:
storage: 1Gi
accessModes:
- ReadWriteMany
#persistentVolumeReclaimPolicy: Retain #回收策略-手动回收
nfs:
path: /NFS/pv02
type: DirectoryOrCreate #没有此目录就会自行创建.(尚未验证)
server: 192.168.0.14
---
apiVersion: v1
kind: PersistentVolume
metadata:
name: pv-nfs-pv03
spec:
capacity:
storage: 1Gi
accessModes:
- ReadWriteMany
nfs:
path: /NFS/pv03
server: 192.168.0.14
EOF
4.创建pvc yaml文件 (pvc定义pod请求的pv容量,这里我们定义一个名为nfs-data的pvc,定义的请求大小为1G,在创建pod的时候挂载调用pvc)
cd /server/yaml/pvc
cat>nfs-pvc.yaml<<EOF
kind: PersistentVolumeClaim
apiVersion: v1
metadata:
name: nfs-data
spec:
accessModes:
- ReadWriteMany
resources:
requests:
storage: 1Gi
EOF
#定义pvc名称,此名称会在定义pod的时候用到。pod会调用pvc名为:nfs-data的pvc 请求大小为1G的pv
5.创建nginx pod yaml文件(挂在NFS和pvc)
1.定义pod将pvc挂载到nginx日志目录下:/var/log/nginx 作为日志持久化目录(pvc根据自身定义的容量大小与我们刚才定义的3个pv中的大小进行批量。如果匹配成功那么pod就成功与相对应的pv进行绑定,实现数据的持久化。
2.定义pod将NFS的挂载到nginx-pod的/usr/share/nginx/html 作为项目目录。
cd /server/yaml/deployment
cat >deployment.yaml<<EOF
apiVersion: extensions/v1beta1 #接口版本
kind: Deployment #接口类型
metadata:
name: wyl-nginx #Deployment名称
spec:
replicas: 3
strategy:
rollingUpdate: ##由于replicas为3,则整个升级,pod个数在2-4个之间
maxSurge: 1 #滚动升级时会先启动1个pod
maxUnavailable: 1 #滚动升级时允许的最大Unavailable的pod个数
template:
metadata:
labels:
app: wyl-nginx #模板名称必填
spec: #定义容器模板,该模板可以包含多个容器
containers:
- name: nginx
image: nginx:latest
imagePullPolicy: IfNotPresent
ports:
- name: http
containerPort: 80
volumeMounts:
- name: nginx-nfs
mountPath: /usr/share/nginx/html
- name: nginx-pvc
mountPath: /var/log/nginx
volumes:
- name: nginx-nfs
nfs:
server: 192.168.0.14
path: /NFS/wwwroot
- name: nginx-pvc
persistentVolumeClaim:
claimName: nfs-data
EOF
6.创建server yaml文件.针对目标(targetPort: 80)端口 创建内外集群访问端口 (集群内网访问端口3017,集群外部端口:33333)
cat >nginx-server.yaml<<EOF
kind: Service
apiVersion: v1
metadata:
name: wyl-nginx
spec:
selector:
app: wyl-nginx
type: NodePort
ports:
- protocol: TCP
port: 3017
targetPort: 80
nodePort: 33333
EOF
7.分别创建pv,pvc,pod,service
kubectl create -f /server/yaml/pv/nfs-pv.yaml #创建pv
kubectl create -f /server/yaml/pvc/nfs-pvc.yaml #创建pvc
kubectl create -f /server/yaml/deployment/deployment.yaml #创建pod
kubectl create -f /server/yaml/service/nginx-server.yaml #创建server
8.(1)测试在NFS的wwwroot目录下创建index.html作为项目程序的测试文件
echo "NFS-wwwroot">/NFS/wwwroot/index.html
测试项目访问是否正常
(2)测试nginx日志是否持久化
kubectl get pvc -o wide #查看pvc绑定的pv为pv-nfs-pv01
[root@k8s-master wwwroot]# kubectl get pvc -o wide
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE
nfs-data Bound pv-nfs-pv01 1Gi RWX
进入NFS查看/NFS/pv-nfs-pv01下是否有nginx日志
可以看出已经挂在成功.
8.注:pv,pvc,service,pod 可以同时写到一个文件中利用'---'隔开
[root@k8s-master deployment]# cat deployment.yaml
#-----------------------------创建命名空间----------------------------
apiVersion: v1
kind: Namespace
metadata:
name: mt-math #创建的命名空间名称为mt-math
---
#----------------------------创建pv---------------------------------
apiVersion: v1
kind: PersistentVolume
metadata:
name: pv-nfs-pv01 #创建的pv名称可创建多个.
namespace: mt-math #属于的命名空间
labels:
pv: pv-nfs-01 #定义pv标签,后续通过pvc绑定特定的pv标签。通常如果不写标签则默认通过访问方式和storage大小进行批量绑定。(重要)
spec:
capacity:
storage: 1Gi #创建的pv-nfs-pv01大小为1G
accessModes:
- ReadWriteMany
nfs: #创建的pv数据来源
path: /NFS/pv01 #数据源目录
server: 192.168.0.14 #数据源ip
#--------------------------------创建pvc--------------------------------
---
kind: PersistentVolumeClaim
apiVersion: v1
metadata:
name: nfs-data-pvc #创建的pvc名称
namespace: mt-math #属于的命名空间
spec:
accessModes:
- ReadWriteMany
resources:
requests:
storage: 1Gi #请求大小为1G
selector: #定义标签选择器,此时k8s会根据标签,storage,访问方式 进行匹配。三者同时满足才会绑定。如果不定义,则系统会根据storage的大小和访问方式进行匹配绑定.
matchLabels:
pv: pv-nfs-01 #定义请求标签为pv-nfs-pv01的pv且大小为1G
#--------------------------------创建pod------------------------------------
---
apiVersion: extensions/v1beta1 #接口版本
kind: Deployment #接口类型
metadata: #基础标签名称信息
name: wyl-nginx #创建的pod名称
namespace: mt-math #创建的pod属于mt-math命名空间
spec: #详细参数设置
replicas: 3 #副本数量
selector: #标签选择器
matchLabels:
app: wyl-nginx #正对标签为wyl-nginx的pod进行副本的创建
strategy:
rollingUpdate: #由于replicas为3,则整个升级,pod个数在2-4个之间
maxSurge: 1 #滚动升级时会先启动1个pod
maxUnavailable: 1 #滚动升级时允许的最大Unavailable的pod个数
template: #模板
metadata:
labels:
app: wyl-nginx #模板pod名称必填
spec: #定义容器模板信息,该模板可以包含多个容器
containers:
- name: nginx
image: nginx:latest
imagePullPolicy: IfNotPresent
ports:
- name: http
containerPort: 80
volumeMounts:
- name: nginx-nfs
mountPath: /usr/share/nginx/html
- name: nginx-pvc
mountPath: /var/log/nginx
volumes: #设置挂载
- name: nginx-nfs #挂载的服务名称
nfs: #挂载的服务类型
server: 192.168.0.14 #服务Ip
path: /NFS/wwwroot #挂载数据目录
- name: nginx-pvc #挂载服务名称
persistentVolumeClaim: #服务类型
claimName: nfs-data-pvc #数据源名称
---
#-----------------------创建server-------------------------------------------
kind: Service
apiVersion: v1
metadata:
name: wyl-nginx
namespace: mt-math #属于的命名空间
spec:
selector:
app: wyl-nginx #针对标签为wyl-nginx的标签进行负载
type: NodePort #正对Node节点进行端口暴露
ports:
- protocol: TCP #使用端口的协议
port: 3017 #供内网访问暴露的端口
targetPort: 80 #目标pod的端口
nodePort: 33333 #node节点暴露的端口
#简单说明-------------------------------------------------------------------
#1.创建了mt-math命名空间,删除命名空间默认删除该命名空间下的所有资源服务
#2.创建了pv,pv不属于任何命名空间
#3.创建了pvc,pvc属于mt-math命名空间
#4.创建了pod属于mt-math命名空间
#5.创建了server属于mt-math命名空间
#6.建议将pv单独写到一个文件中.否则在我们删除改命名空间下的所有服务后,利用该文件再次创建时会报pv已经创建.
#---------------------------------------------------------------------------
#注意这里说明一下 上面创建了一个pv 挂在了所有的nginx日志目录是有问题的, nginx日志目录应该单独存储,单独存储nginx日志设置:可手动创建多个pvc进行挂在或者进行 volumeClaimTemplates: 自动创建pvc进行挂在。