在我以前的一篇文章中,我展示了如何在K8s集群上运行Oracle XE数据库。 当我们不在乎数据时,这种方法在用例中很好用;在重新部署容器并重新启动Pod时,我们可以松散它。 但是,如果我们要保留数据,如果我们希望它在所有重新调度后仍然存在,我们将要重新考虑用于在集群上运行DB容器的K8s资源。 也就是说,定义资源的yaml文件如下所示:
apiVersion: apps/v1beta2
kind: StatefulSet
metadata:
name: oraclexe
labels:
run: oraclexe
spec:
selector:
matchLabels:
run: oraclexe
serviceName: "oraclexe-svc"
replicas: 1
template:
metadata:
labels:
run: oraclexe
spec:
volumes:
- name: dshm
emptyDir:
medium: Memory
containers:
- image: eugeneflexagon/database:11.2.0.2-xe
volumeMounts:
- mountPath: /dev/shm
name: dshm
- mountPath: /u01/app/oracle/oradata
name: db
imagePullPolicy: Always
name: oraclexe
ports:
- containerPort: 1521
protocol: TCP
volumeClaimTemplates:
- metadata:
name: db
spec:
accessModes: [ "ReadWriteOnce" ]
resources:
requests:
storage: 100M
---
apiVersion: v1
kind: Service
metadata:
name: oraclexe-svc
labels:
run: oraclexe
spec:
selector:
run: oraclexe
ports:
- port: 1521
targetPort: 1521
type: LoadBalancer
这里有一些有趣的事情。 首先,这不是部署。 我们在这里定义另一个K8s资源,称为有状态集 。 与部署不同,有状态集会为其每个Pod保持粘性标识。 这些Pod是根据相同的规范创建的,但它们不可互换:每个Pod都有一个永久性标识符,在所有重新计划中都将维护该标识符。
这个人是专门为有状态的应用程序(例如数据库)设计的,这些应用程序将其数据保存到持久性存储中。 为了为我们的数据库定义持久存储,我们使用特殊的
K8的资源永久卷 ,在yaml文件中,我们定义了一个声明,以创建一个名称为db的100mb 永久卷 。 该卷为一个分配的Pod提供读/写访问模式。 该卷之所以称为持久卷,是因为其寿命不是由容器维护的,甚至不是由吊舱维护的,而是由K8s集群维护的。 因此,它可以超过任何容器和Pod并保存数据。 我们在容器定义中指的是该持久性卷,它在路径/ u01 / app / oracle / oradata上安装了一个卷。 这是Oracle DB XE容器存储其数据的地方。
而已!
翻译自: https://www.javacodegeeks.com/2018/11/volumes-database-containers-running-k8s.html