【Kubernetes 014】持久存储PersistentVolume原理以及配合StatefulSet实现有状态服务实际操作详解

上一节中我们学习了volume,但是volume还是不能解决pod被删除后内部数据的持久化问题。而这一节要学习的PerisstentVolume就是专门来解决这个问题的。

我是T型人小付,一位坚持终身学习的互联网从业者。喜欢我的博客欢迎在csdn上关注我,如果有问题欢迎在底下的评论区交流,谢谢。

Persistent Volume

上一节的volume是pod内部声明的一种数据共享手段,pod删除volume内的数据也永久删除。但是往往有一种需求,就是针对一些有状态的服务(例如statefulset),希望其内部的数据会永久保存,便于下次新的服务起来的时候能读回上次的状态。这时候就需要存储的生命周期不随pod的生命周期结束,于是k8s引入了一个新的组件:Persistent Volume,简称PV,下同。

PV和volume一样,也是一个抽象的接口,后面可以有几十种媒介。官方文档列出了完整清单,例如各种云存储。这一节我们以NFS为例从集群外部引入额外存储来作为实际操作的例子。

Persistent Volume Claim

一个集群中往往声明和创建了很多PV对象,这些对象存储效率各异,存储媒介和大小也不同。而不同的pod所需要的PV类型也不一样,于是产生了一个多对多的匹配关系。为了将这种多对多匹配自动化,k8s引入了叫Persistent Volume Claim的新组件,简称PVC,下同。

PV和PVC的关系如下图所示
1-pv.png

负责存储设备的Admin会在集群内布创建很多PV以供使用,开发人员Dev根据业务需求创建出一个需要某种PV的PVC,并且在pod的生成yaml中引用这个PVC。PVC会自动去寻找符合要求的并且占用资源最小的PV以供该pod使用。同时PVC的声明中还是指明PV的使用方式,后面实际操作的时候会看到。

需要注意

  • PV和PVC的绑定关系是一一对应的
  • pod如果被删除,其PVC做为单独组件并不会消失

StatefulSet

下面开始补一下前面讲控制器时候挖的一个坑,就是提供有状态服务的控制器:StatefulSet。

所谓有状态服务,指的是当pod挂了再创建一个新pod时(注意并不是容器崩溃导致的pod重启),pod还能拥有以下特点

  • 固定的持久存储,即pod被重新调度后还能访问到跟之前完全相同的持久化数据,基于PVC来实现
  • 固定的网络标识,即pod被重新调度后其在集群内部拥有跟之前一样的DNS标识(注意,并不是相同IP),基于Headless Service来实现
  • 有序部署,扩展和删除,控制器下的pod都有自己的编号(0到n-1),前一个pod必须是Running或者Ready状态才会创建下一个pod,删除时反向进行,基于前面讲过的Init C实现

Headless Service

所谓的Headless Service就是在前面学习的ClusterIP的基础上,多加一行clusterIP: None不指定Service的IP,效果就是对Service域名的DNS解析直接到后端的pod的IP。

用如下的yaml文件test-headless-service.yaml创建一个Deployment和对应的Headless Service

apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: mynginx-deployment
spec:
  replicas: 3
  template:
    metadata:
      labels:
        app: mynginx
        version: v2
    spec:
      containers:
        - name: mynginx
          image: mynginx:v2
          ports:
            - containerPort: 80
---
apiVersion: v1
kind: Service
metadata:
  name: mynginx-service
  namespace: default
spec:
  type: ClusterIP
  clusterIP: None  #<-- Careful
  selector:
    app: mynginx
    version: v2
  ports:
    - name: http
      port: 8080
      targetPort: 80

pod起来以后对Service进行DNS解析

[root@k8s-master pv]# kubectl get svc
NAME              TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)    AGE
kubernetes        ClusterIP   10.96.0.1    <none>        443/TCP    14d
mynginx-service   ClusterIP   None         <none>        8080/TCP   5s
[root@k8s-master pv]# kubectl get pod -o wide
NAME                                    READY   STATUS    RESTARTS   AGE     IP             NODE         NOMINATED NODE   READINESS GATES
mynginx-deployment-b66f59f66-rj7xr      1/1     Running   0          4m27s   10.244.0.16    k8s-master   <none>           <none>
mynginx-deployment-b66f59f66-x4487      1/1     Running   0          4m27s   10.244.1.122   k8s-node1    <none>           <none>
mynginx-deployment-b66f59f66-xswls      1/1     Running   0          4m27s   10.244.1.119   k8s-node1    <none>           <none>
[root@k8s-master pv]# nslookup mynginx-service.default.svc.c
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值