一.利用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进行挂在。

转载于:https://my.oschina.net/wangyunlong/blog/3053618

Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐