1、创建NFS服务
[root@k8s-node01 nginx]# cat /etc/exports
/home/pvdata/nfs01 *(rw,sync,insecure,no_subtree_check,no_root_squash)
/home/pvdata/nfs02 *(rw,sync,insecure,no_subtree_check,no_root_squash)
/home/pvdata/nfs03 *(rw,sync,insecure,no_subtree_check,no_root_squash)
/home/pvdata/nfs04 *(rw,sync,insecure,no_subtree_check,no_root_squash)
[root@k8s-node01 nginx]#exportfs -r
[root@k8s-node01 nginx]#exportfs
2、创建PV卷
[root@k8s-node01 nginx]# cat nfspv.yaml
apiVersion: v1
kind: PersistentVolume
metadata:
name: nfspv01 #pv名称
spec:
capacity:
storage: 7Gi
accessModes:
- ReadWriteOnce #该卷能够以读写模式被加载到一个节点上
persistentVolumeReclaimPolicy: Retain #删除pod后,文件保留,需手动回收
storageClassName: nfs
nfs:
path: /home/pvdata/nfs01 #对应nfs共享目录
server: 10.0.0.1
---
apiVersion: v1
kind: PersistentVolume
metadata:
name: nfspv02 #pv名称
spec:
capacity:
storage: 10Gi
accessModes:
- ReadWriteOnce #该卷能够以读写模式被加载到一个节点上
persistentVolumeReclaimPolicy: Retain #删除pod后,文件保留,需手动回收
storageClassName: nfs
nfs:
path: /home/pvdata/nfs02 #对应nfs共享目录
server: 10.0.0.1
---
apiVersion: v1
kind: PersistentVolume
metadata:
name: nfspv03 #pv名称
spec:
capacity:
storage: 15Gi
accessModes:
- ReadWriteOnce #该卷能够以读写模式被加载到一个节点上
persistentVolumeReclaimPolicy: Retain #删除pod后,文件保留,需手动回收
storageClassName: nfs
nfs:
path: /home/pvdata/nfs03 #对应nfs共享目录
server: 10.0.0.1
---
apiVersion: v1
kind: PersistentVolume
metadata:
name: nfspv04 #pv名称
spec:
capacity:
storage: 20Gi
accessModes:
- ReadWriteOnce #该卷能够以读写模式被加载到一个节点上
persistentVolumeReclaimPolicy: Retain #删除pod后,文件保留,需手动回收
storageClassName: nfs
nfs:
path: /home/pvdata/nfs04 #对应nfs共享目录
server: 10.0.0.1
3、部署有状态的nginx web应用
[root@k8s-node01 nginx]# cat nginx-deployment.yaml
apiVersion: v1
kind: Service
metadata:
name: my-nginx-service #服务名
labels:
app: my-nginx #标签名
spec:
ports:
- port: 80
name: web
clusterIP: None #Headless 无头服务配置
selector:
app: my-nginx
---
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: my-web
spec:
selector:
matchLabels:
app: my-nginx
serviceName: "my-nginx-service"
replicas: 4 #部署4个副本
template:
metadata:
labels:
app: my-nginx
spec:
containers:
- name: nginx
image: registry.aliyuncs.com/google_containers/nginx-slim:0.8 #无法直接在国内网络环境下从k8s.gcr.io下载镜像,可以通过阿里云代理仓库下载。
ports:
- containerPort: 80
name: my-web
volumeMounts:
- name: www
mountPath: /usr/share/nginx/html #Nginx web服务器默认目录,挂载到PV持久化卷
volumeClaimTemplates: #pvc模板
- metadata:
name: www
spec:
accessModes: [ "ReadWriteOnce" ]
storageClassName: "nfs"
resources:
requests:
storage: 7Gi
4、查验服务状态
[root@k8s-node01 nginx]# kubectl get pv #查看部署的pv状态
NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE
nfspv01 7Gi RWO Retain Bound default/www-my-web-0 nfs 37m
nfspv02 10Gi RWO Retain Bound default/www-my-web-1 nfs 37m
nfspv03 15Gi RWO Retain Bound default/www-my-web-2 nfs 37m
nfspv04 20Gi RWO Retain Bound default/www-my-web-3 nfs 37m
[root@k8s-node01 nginx]# kubectl get pvc -l app=my-nginx #查看部署的pvc状态
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE
www-my-web-0 Bound nfspv01 7Gi RWO nfs 36m
www-my-web-1 Bound nfspv02 10Gi RWO nfs 36m
www-my-web-2 Bound nfspv03 15Gi RWO nfs 36m
www-my-web-3 Bound nfspv04 20Gi RWO nfs 33m
[root@k8s-node01 nginx]# kubectl get statefulsets.apps #查看部署的statefulsets状态
NAME READY AGE
my-web 4/4 34m
[root@k8s-node01 nginx]# kubectl get service -l app=my-nginx #查看部署的服务状态
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
my-nginx-service ClusterIP None <none> 80/TCP 35m
[root@k8s-node01 nginx]# kubectl get pod -l app=my-nginx #查看部署的pod状态
NAME READY STATUS RESTARTS AGE
my-web-0 1/1 Running 0 12m
my-web-1 1/1 Running 0 12m
my-web-2 1/1 Running 0 12m
my-web-3 1/1 Running 0 12m
5、编辑index.html文件,查看节点返回信息
[root@k8s-node01 nginx]# for i in 0 1 2 3; do kubectl exec my-web-$i -- sh -c 'echo Welcome to your visit,this is $(hostname). $(date) > /usr/share/nginx/html/index.html'; done #为Index.html文件输入信息
[root@k8s-node01 nginx]# kubectl get pod -l app=my-nginx -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
my-web-0 1/1 Running 0 21m 10.122.135.187 k8s-node03 <none> <none>
my-web-1 1/1 Running 0 21m 10.122.58.207 k8s-node02 <none> <none>
my-web-2 1/1 Running 0 21m 10.122.135.188 k8s-node03 <none> <none>
my-web-3 1/1 Running 0 21m 10.122.58.215 k8s-node02 <none> <none>
[root@k8s-node01 nginx]# curl 10.122.135.187
Welcome to your visit,this is my-web-0. Tue Aug 18 23:50:41 UTC 2020
[root@k8s-node01 nginx]# curl 10.122.135.188
Welcome to your visit,this is my-web-2. Tue Aug 18 23:50:41 UTC 2020
[root@k8s-node01 nginx]# curl 10.122.58.207
Welcome to your visit,this is my-web-1. Tue Aug 18 23:50:38 UTC 2020
[root@k8s-node01 nginx]# curl 10.122.58.215
Welcome to your visit,this is my-web-3. Tue Aug 18 23:50:39 UTC 2020
6、删除pod节点,验证数据持久化存储
[root@k8s-node01 nginx]# kubectl delete pod -l app=my-nginx #删除标签为my-nginx的所有pod;
pod "my-web-0" deleted
pod "my-web-1" deleted
pod "my-web-2" deleted
pod "my-web-3" deleted
[root@k8s-node01 nginx]#
通过另一终端实时观察pod的状态
显示删除成功,且又创建了4个新pod;
对比删除pod前后的数据变化
部署验证成功。