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 文件,将域名和对应宿主机进行绑定,最后访问


浙公网安备 33010602011771号