上一节中我们学习了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的关系如下图所示
负责存储设备的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