initContainers实现整个数据目录的挂载
在部署mysql、oracle、tomcat测试时,面对配置文件非常多的情况下一个个挂载配置文件会显得非常麻烦,这时就可以通过将服务的整个数据目录给挂载下来,以方便修改配置和数据,但是因为服务需要初始化,直接挂载目录会将原本的数据给
覆盖掉导致容器报错,这时就可以采用initContainers将初始化后的文件拷贝到初始化容器内,以确保数据文件不会被覆盖掉,接下来使用tomcat与oracle进行测试
1、创建tomcat部署文件,添加initContainers进行文件拷贝
[root@master-11 tomcat]# cat tomcat.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: tomcat-deployment
labels:
app: tomcat
spec:
replicas: 1
selector:
matchLabels:
app: tomcat
template:
metadata:
labels:
app: tomcat
spec:
initContainers: # 在此创建一个initContainers,用来拷贝数据文件
- name: init-tomcat
image: swr.cn-north-4.myhuaweicloud.com/ddn-k8s/docker.io/tomcat:8.0
command:
- /bin/sh
- -c
- |
if [ -d /data ] && [ "$(ls -A /data 2>/dev/null)" ]; then # 添加一个条件判断,因为data与tomcat目录的数据一致,所以判断data目录下有没有数据,没有就拷贝一份过来
echo "无需拷贝"
else
cp -r /usr/local/tomcat/* /data/
fi
volumeMounts: # 挂载tomcat目录
- name: tomcat-data
mountPath: /data
securityContext:
runAsUser: 0
runAsGroup: 0
containers:
- name: tomcat
image: swr.cn-north-4.myhuaweicloud.com/ddn-k8s/docker.io/tomcat:8.0
imagePullPolicy: IfNotPresent
ports:
- containerPort: 8080
env:
- name: CATALINA_OPTS
value: "-Xms512m -Xmx1024m -XX:PermSize=128m -XX:MaxPermSize=256m -Dfile.encoding=UTF-8"
resources:
requests:
memory: "512Mi"
limits:
memory: "1024Mi"
volumeMounts: # 因为initContainers与containers使用的是同一个pvc,所以挂载后数据不会消失,而是使用了data目录下的数据
- name: tomcat-data
mountPath: /usr/local/tomcat
volumes:
- name: tomcat-data
persistentVolumeClaim:
claimName: tomcat-data
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: tomcat-data
labels:
app: tomcat
spec:
accessModes:
- ReadWriteMany
storageClassName: nfs-data
resources:
requests:
storage: 5Gi
---
apiVersion: v1
kind: Service
metadata:
name: tomcat-service
labels:
app: tomcat
spec:
selector:
app: tomcat
type: NodePort
ports:
- name: http
port: 8080
targetPort: 8080
nodePort: 30000
2、测试
[root@master-11 tomcat]# kubectl get pods -owide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
tomcat-deployment-65c55cd476-zzbjh 1/1 Running 0 16m 10.100.1.25 node-12 <none> <none>
[root@master-11 tomcat]# kubectl exec -it tomcat-deployment-65c55cd476-zzbjh bash # 进入容器检查数据是否正常拷入
kubectl exec [POD] [COMMAND] is DEPRECATED and will be removed in a future version. Use kubectl exec [POD] -- [COMMAND] instead.
Defaulted container "tomcat" out of: tomcat, init-tomcat (init)
root@tomcat-deployment-65c55cd476-zzbjh:/usr/local/tomcat# ls
LICENSE NOTICE RELEASE-NOTES RUNNING.txt bin conf include lib logs native-jni-lib temp webapps work
root@tomcat-deployment-65c55cd476-zzbjh:/usr/local/tomcat#
访问“IP:端口”查看服务是否能够正常访问,正常访问后在容器中创建一个文件后将容器删除,等待容器创建后检查服务与所创建的文件是否都是正常的
3、使用同样的方式来对oracle进行数据目录的挂载
[root@master-11 ~]# cat oracle.yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: oracle-data
namespace: oracle
spec:
accessModes: [ "ReadWriteOnce" ]
storageClassName: nfs-data
resources:
requests:
storage: 20Gi
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: oracle-db
namespace: oracle
spec:
replicas: 1
selector:
matchLabels:
app: oracle-db
template:
metadata:
labels:
app: oracle-db
spec:
initContainers: # 创建initContainers
- name: init-oracle-data
image: swr.cn-north-4.myhuaweicloud.com/ddn-k8s/docker.io/oracleinanutshell/oracle-xe-11g:latest
command:
- /bin/sh
- -c
- |
set -e
echo "初始化 Oracle XE 数据目录..."
if [ ! -d /mnt-oracle/oradata ] || [ -z "$(ls -A /mnt-oracle/oradata 2>/dev/null)" ]; then # 判断oracle数据目录是否存在,不存在则拷贝一份
mkdir -p /mnt-oracle
cp -a /u01/app/oracle/. /mnt-oracle/
echo "拷贝完成。"
else
echo "检测到已有数据,跳过拷贝。"
fi
volumeMounts: # 挂载数据目录
- name: oracle-data
mountPath: /mnt-oracle
containers:
- name: oracle
image: swr.cn-north-4.myhuaweicloud.com/ddn-k8s/docker.io/oracleinanutshell/oracle-xe-11g:latest
ports:
- containerPort: 1521
- containerPort: 8080
env:
- name: ORACLE_SID
value: XE
command:
- /bin/bash
- -c
- |
chown -R oracle:dba /u01/app/oracle
chmod -R 755 /u01/app/oracle
/etc/init.d/oracle-xe start
tail -f /dev/null
volumeMounts: # 与initContainers挂载同一个pvc来实现数据共享
- name: oracle-data
mountPath: /u01/app/oracle
volumes:
- name: oracle-data
persistentVolumeClaim:
claimName: oracle-data
---
apiVersion: v1
kind: Service
metadata:
name: oracle-db
namespace: oracle
spec:
selector:
app: oracle-db
ports:
- name: sqlnet
port: 1521
targetPort: 1521
nodePort: 31521
- name: apex
port: 8080
targetPort: 8080
nodePort: 32425
type: NodePort
4、测试
使用navicat进行连接,初始用户密码为 sys/oracle
执行
CREATE TABLESPACE ceshi_data
DATAFILE '/opt/oracle/oradata/ceshi_data01.dbf'
SIZE 20G
AUTOEXTEND OFF;
随后将容器删除,等待重新创建,进入容器查看/u01/app/oracle/oradata/XE目录下是否有ceshi_data01.dbf的文件存在,有的话这初始化成功