繁体   English   中英

想通过dep.yaml文件转储data.sql文件,不想通过bin/bash手动

[英]Want to dump data.sql file through dep.yaml file, don't want to go manual through bin/bash

1. 我想使用 YAML 文件转储数据文件

卷中的 data.sql 文件

YAML 文件是

apiVersion: v1
kind: Service
metadata:
  name: mysql
spec:
  ports:
  - port: 3306
  selector:
    app: mysql
  clusterIP: None
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: mysql
  labels:
    app: mysql
spec:
  replicas: 1
  selector:
    matchLabels:
      app: mysql
  strategy:
    type: Recreate
  template:
    metadata:
      labels:
        app: mysql
    spec:
        volumes:
        - name: mydir
          hostPath: 
            path: /var/local/test
            type: DirectoryOrCreate
        - name: myfile
          hostPath:
            path: /var/local/test/data.sql
            type: FileOrCreate 

        containers:
        - image: mysql:5.6
          name: mysql
          env:
            # Use secret in real usage
        
          - name: MYSQL_ROOT_PASSWORD
            value: root
          - name: MYSQL_USERNAME
            value: root
          - name: MYSQL_PASSWORD
            value: root
          - name: MYSQL_DATABASE
            value: sample  
          ports:
          - containerPort: 3306
            name: mysql
          volumeMounts:
          - name: mydir
            mountPath: /var/local/test/data.sql
          command: ["/bin/sh","-c"]
          args: ["mysql -u root -proot sample < data.sql"] 

使用命令,参数概念但不可能

如果我访问 pod,它可以轻松转储,但我希望通过 YAML 进行转储操作

**2. 恢复本地系统中的数据库文件**

还想在我的系统或任何其他位置恢复转储的 aur 新数据,但它可以访问

不要共享 bash 选项 kubectl exec -it mysql-598cbfc789-2jlt7 -- mysql -u root -proot sample < data.sql

大多数情况下,您无法按照您描述的方式执行此操作。 Kubernetes YAML 不太适合描述诸如“恢复数据库转储”之类的命令式操作。 如果您需要在那里执行此操作,则需要在与数据库本身分开的作业中执行此操作。

最便携的方法是根本不要在 Kubernetes YAML 中尝试它(例如,删除您部署中的 override command:args: )。 像往常一样运行kubectl apply -f ... ,一旦数据库出现,在两个单独的终端窗口中运行

kubectl port-forward service/mysql 12345:3306
mysql -u root -proot -H127.0.0.1 -P12345 sample < data.sql

首先建立到正在运行的数据库的连接; 第二个使用本地mysql工具和本地文件系统,连接到转发端口。 12345 可以是任何端口号,但在两个命令中必须相同。

其他一些替代品(重点kubectl exec )中描述了如何恢复从mysqldump的使用kubernetes转储文件? .

您展示的布局存在一些概念性问题。 第一个是容器只运行一个命令,并且你的sh -c 'mysql ...'运行而不是MySQL 守护进程。 Kubernetes Pod 也无法访问您的本地文件系统,如果您使用如您所示的hostPath卷,您需要正确猜测 Pod 将在哪个节点上运行并将数据复制到那里; 这是不可靠的,如果您从不同的地方运行它,可能会导致不一致的结果。


如果您可以以某种方式将转储数据放入 Kubernetes,您可以运行一个单独的 作业来进行恢复:

apiVersion: batch/v1
kind: Job
metadata:
  name: mysql-restore
spec:
  template:
    spec:
      containers:
        - name: mysql-restore
          env: { same as in: the question }
          image: mysql:5.6
          volumeMounts: { ... }
          command: [sh, -c]
          args:
            - >-
                mysql sample < /var/local/test/data.sql

问题是在volumeMounts:放什么。 如果数据库转储相当小,您或许可以将其放入ConfigMap 中,然后将 ConfigMap 挂载到 Pod 中,但创建 ConfigMap 可能会很尴尬,并且大小限制为 1 MB。 如果您有办法直接访问卷内容(也许您正在挂载 NFS 挂载,您也可以访问集群外),那么您可以将转储复制到那里。 您还可以使用网络可访问的云存储,例如 Amazon S3 或其他基于 HTTP 的服务,您可以在其中在启动时curl转储。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM