Title

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的文件存在,有的话这初始化成功
posted @ 2025-10-16 12:17  xwk123  阅读(5)  评论(0)    收藏  举报