一.利用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 /mnt mount.nfs: access denied by server while mounting 192.168.0.124:/NFS vi 修改为:/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进行挂在。
所有评论(0)