Kubernetes安装数据库
在Kubernetes中安装数据库,主要的问题在于如何处理数据存储方式,通常,当我们部署Pod时,它们具有自己的存储空间,但是该存储空间是短暂的-如果容器被杀死了,则其存储空间将随之消失。
StatefulSet
StatefulSet是用于管理有状态应用程序的工作负载。它管理一组Pod的实现和扩展,并保证这些Pod的顺序和唯一性。
像Deployment一样,StatefulSet也管理具有相同容器规范的一组Pod。由StatefulSets维护的Pod具有唯一的,持久的身份和稳定的主机名,而不用管它们位于哪个节点上。如果我们想要一个跨存储的持久性,我们可以创建一个持久性卷并将StatefulSet用作解决方案的一部分。即使StatefulSet中的Pod容易发生故障,存储卷与新Pod进行匹配也很容易。
StatefulSet对于需要以下一项或多项功能的应用程序很有价值:
- 稳定的唯一网络标识符。
- 稳定,持久的存储。
- 有序,顺畅的部署和扩展。
- 有序的自动滚动更新。
在Kubernetes上部署数据库时,我们需要使用StatefulSet,但是使用StatefulSet有一些局限性:
- 需要使用持久性存储卷为Pod提供存储。
- 删除副本或按比例缩小副本将不会删除附加到StatefulSet的存储卷。存储卷确保数据的安全性。
- StatefulSet当前需要Headless Service 来负责Pod的网络标识。
- 与Deployment不同,StatefulSet不保证删除StatefulSet资源时删除所有Pod,而Deployment在被删除时会删除与Deployment关联的所有Pod。在删除StatefulSet之前,你必须将pod副本数量缩小到0。
如果需要解决存储的问题,那么我们就必须要将数据持久化,将持久化的数据存储卷和数据库Pod进行关联,即便容器被杀死,那么数据仍然存储在集群中,并且新建的Pod也可以进行相应的数据访问,Kubernetes提供了吃计划存储的资源
- PV
- PVC
举个例子创建一个postgres的数据库的Pod
postgres-config.yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: postgres-config
namespace: postgres
labels:
app: postgres
data:
POSTGRES_DB: master # 关系到用户密码建议使用secret
POSTGRES_USER: dba
POSTGRES_PASSWORD: pg_pass
postgres-statefulset.yaml
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: postgres
namespace: postgres
spec:
serviceName: "postgres"
replicas: 1
selector:
matchLabels:
app: postgres
template:
metadata:
labels:
app: postgres
spec:
containers:
- name: postgres
image: postgres:9.5
envFrom:
- configMapRef:
name: postgres-config
ports:
- containerPort: 5432
name: postgredb
volumeMounts: # 将持久化的存储卷挂载到pod中
- name: postgres-data
mountPath: /var/lib/postgresql/data
subPath: postgres
volumeClaimTemplates:
- metadata:
name: postgres-data
spec:
accessModes: ["ReadWriteOnce"]
storageClassName: nfs-client # 在storageClass中申请50M的空间做成一块独立的持久化存储卷
resources:
requests:
storage: 50M
nfs-client是一个storageClass,代替了常用的PV和PVC,这里就不做解释了,详细的可以查看storageClass和PV的关系,同样是一个持久化存储的方式。
这样Postgres存储的数据本来默认存储在/var/lib/postgresql/data上,但是我们将其外挂在持久化存储中,那么当这个pod出现故障或者被销毁的时候,创建一个相同的Pod并且将其同样外挂这个持久化存储卷,那么数据便能够展现。