Kubernetes v1.18.6部署StatefulSet有状态的应用(PV数据持久化存储)

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前后的数据变化
在这里插入图片描述
部署验证成功。

END.

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值