K8S 利用NFS提供共享卷部署网站

部署NFS

# yum -y install  nfs*

配置NFS

# vim /etc/exports
/nfs/data *(insecure,rw,no_root_squash,sync)

重启NFS

# systemctl restart nfs

查看挂载点

# showmount  -e #后面可以加server ip
Export list for a-k8snode-02.com:
/nfs/data *

注意

如果我们在启动了NFS之后又修改了/etc/exports,是不是还要重新启动nfs呢?这个时候我们就可以用exportfs命令来使改动立刻生效,该命令格式如下:

exportfs [-aruv]

-a :全部mount或者unmount /etc/exports中的内容
-r :重新mount /etc/exports中分享出来的目录
-u :umount 目录
-v :在 export 的时候,将详细的信息输出到屏幕上。
PV创建

首先在K8S master 检查NFS共享的目录

# showmount  -e 172.16.250.241
Export list for 172.16.250.241:
/nfs/data *

注意:在使用NFS作为共享存储最好在每个K8S节点上都要安装nfs依赖包  

yum -y install nfs-untils 或者yum -y install    nfs*

创建PV yaml文件

# vim nginx_pv.yaml
apiVersion: v1
kind: PersistentVolume
metadata:
  name: nginx-example
  labels:
    name: nfs-pv
spec:
  nfs:
    path: /nfs/data
    server: 172.16.250.241
  accessModes: ["ReadWriteMany","ReadWriteOnce"]
  capacity:
    storage: 2Gi #指定pv 大小,pvc 会匹配存储大小

运行kubectl  生成PV

# kubectl apply -f nginx_pv.yaml
# kubectl  apply -f nginx_pvc.yaml 
persistentvolumeclaim/nginx-example-pvc created

  

查看pv

# kubectl  get pv
NAME                                       CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS      CLAIM                                STORAGECLASS      REASON   AGE
nginx-example                              2Gi        RWO,RWX        Retain           Available                                                                   3m36s

PV 的访问模式(accessModes)有三种:

· ReadWriteOnce(RWO):是最基本的方式,可读可写,但只支持被单个 Pod 挂载。
· ReadOnlyMany(ROX):可以以只读的方式被多个 Pod 挂载。
· ReadWriteMany(RWX):这种存储可以以读写的方式被多个 Pod 共享。

 PV 3种回收策略三种: 

白话解释:persistentVolumeReclaimPolicy,即 PVC 释放卷的时候 PV 该如何操作

Retain,不清理, 保留 Volume(需要手动清理) Recycle,删除数据,即 rm -rf /thevolume/*(只有 NFS 和 HostPath 支持) Delete,删除存储资源,比如删除 AWS EBS 卷(只有 AWS EBS, GCE PD, Azure Disk 和 Cinder 支持)

 创建PVC Yaml文件

因为我们的K8S 资源对象使用过PVC来识别存储卷的

# vim nginx_pvc.yaml 
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: nginx-example-pvc
  namespace: default
spec:
  accessModes: ["ReadWriteMany"]
  resources:
    requests:
      storage: 2Gi #要小于等于PV的大小,否则将匹配合适的PV

 运行kubectl 生成pvc

# kubectl  apply -f nginx_pvc.yaml 
persistentvolumeclaim/nginx-example-pvc created

 查看PVC

# kubectl  get pvc
NAME                STATUS   VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS      AGE
nginx-example-pvc   Bound    nginx-example                              2Gi        RWO,RWX                          47s  

再次查看pv 状态

[root@a-k8smaster-01 nginx_example]# kubectl  get pv
NAME                                       CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS     CLAIM                                STORAGECLASS      REASON   AGE
nginx-example                              2Gi        RWO,RWX        Retain           Bound      default/nginx-example-pvc                                       8m30

从CLAIM 可以看出已经被default 空间的nginx-example-pvc绑定了

创建POD用于测试pvc

# vim nginx_example.yaml 

apiVersion: v1
kind: Pod
metadata:
  name: nginx-example
label:
app: nginx-example
spec: containers: - image: nginx name: nginx-example imagePullPolicy: Always volumeMounts: - mountPath: "/usr/share/nginx/html/" #容器中指定路径(可自己指定),挂载到容器的某个路径下 name: index-html #挂载设备的名字,与volumes[*].name 需要对应 volumes: - name: index-html #与上面volumeMounts的name对应 persistentVolumeClaim: claimName: nginx-example-pvc

 查看pod

# kubectl  get pod -l=app=nginx-example
NAME            READY   STATUS    RESTARTS   AGE
nginx-example   1/1     Running   0          32m

 验证方式有两种

1.在共享NFS提供的pvc 创建index.html,然后进入pod 访问nginx 网址,操作如下

pod->volumes->persistentVolumeClaim->claimName->nginx-example->pvc->pv->nginx-example->nfs:/nfs/data#这是pod 共享文件存储的流程,所以我们只需要在nfs 共享目录/nfs/data创建index.html,然后进入pod通过 curl 命令验证

# mkdir /nginx-example-html
# mount  172.16.250.241:/nfs/data /nginx-example-html/
# cd /nginx-example-html/
# ll
total 0
# echo "hello  k8s " >> index.html
# cat index.html 
hello  k8s   

进入pod curl

# kubectl  exec -it pod/nginx-example /bin/bash
root@nginx-example:/# curl  127.0.0.1
hello  k8s 

 2.创建SVC以及结合ingress用于访问

# vim nginx_svc.yaml

apiVersion: v1
kind: Service
metadata:
   name: nginx-example-svc
labels:
svc: nginx-example spec: selector: app: nginx
-example ports: - name: web protocol: TCP port: 80 targetPort: 80

 运行创建SVC

# kubectl  apply -f nginx_svc.yaml 

 查看svc

# kubectl  get svc -l=svc=nginx-example
NAME                TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)   AGE
nginx-example-svc   ClusterIP   10.97.254.230   <none>        80/TCP    5m55s

 通过curl CLYSTER-IP 验证

# curl 10.97.254.230
hello  k8s 

 暴露配置nodeport 让我们本地的笔记本也可以访问到

再次更新nginx_svc.yaml文件

# vim nginx_svc.yaml 
apiVersion: v1
kind: Service
metadata:
   name: nginx-example-svc
   labels:
     svc: nginx-example
spec:
  selector:
    app: nginx-example
  ports:
    - name: web
      protocol: TCP
      port: 80
      targetPort: 80
      nodePort: 31000
  type: NodePort
#蓝色部分是增加的内容

 运行kubectl 重新加载svc

# kubectl apply -f  nginx_svc.yaml

 查看新生成的svc

[root@a-k8smaster-01 nginx_example]# kubectl  get svc |grep nginx
nginx-example-svc                                        NodePort    10.97.254.230    <none>        80:31000/TCP   13m

 在自己的笔记本访问http://宿主机ip:31000

更新一下index.html内容

# vim /nginx-example-html/index.html 

<Title> This is pvc TestPage</Title>
<H1>hello  k8s</H1>

 在访问一下

 

 会发现网页已是已经更新的内容了

接下来是通过域名实现访问

前提已经部署一套了ingress ,下面是我的基于Traefik(基于Treafik 部署ingress blog)创建ingress配置文件 

# vim example.yaml 

apiVersion: traefik.containo.us/v1alpha1
kind: IngressRoute
metadata:
  name: nginx-example
spec:
  entryPoints:
    - web
  routes:
    - match: Host(`nginx.example.com`)
      kind: Rule
      services:
        - name: nginx-example-svc
          port: 80

运行kubectls apply

# kubectl apply -f  example.yaml 

查看

# kubectl  get ingressroute
NAME            AGE
nginx-example   4m46s

在恁地笔记本运行cmd输入drivers 找到hosts 文件,将域名和对应宿主机进行绑定,最后访问

 

posted @ 2020-07-04 15:16  91King  阅读(341)  评论(0)    收藏  举报