【问题标题】:How to execute a sql script file in a Kubernetes Pod?如何在 Kubernetes Pod 中执行 sql 脚本文件?
【发布时间】:2020-04-18 15:49:56
【问题描述】:

我想使用 SQL 脚本文件在 Kubernetes pod 中创建一个 SQL Server 数据库。我有创建数据库并插入主数据的 SQL 脚本。由于我是 Kubernetes 新手,所以我很难在 pod 中运行 SQL 脚本。我知道 SQL 脚本可以在单独的 kubectl exec 命令中手动执行,但我希望它在 pod deploy yml 文件本身中自动执行。

有没有办法将脚本文件挂载到 pod 的卷中并在启动容器后运行它?

【问题讨论】:

  • 您可以将脚本挂载为配置映射。您还应该将其作为一个 init 容器运行,以便它仅在主 pod 运行之前运行。
  • 您还必须提供更多信息,例如您正在使用哪个映像以及如何创建 SQL 数据库容器。部署/状态集描述会很有用
  • @PatrickW 关于如何使用 initcontainers/configmap 在 pod 中运行 sql 脚本文件的任何参考,因为我没有找到任何好的参考来实现这一点。
  • 初始化容器将在主 pod 之前执行,但我希望在创建主 pod 之后执行脚本。顺便说一句,我使用的是标准的 mssql 映像(mcr.microsoft.com/mssql/server:2017-latest)

标签: sql-server kubernetes


【解决方案1】:

对于这种情况,您可以使用 kubernetes hooks。其中有两个:PostStartPreStop

PostStart 在容器创建后立即执行。 另一方面,PreStop 在容器终止之前立即调用。

您有两种可以实现的钩子处理程序:ExecHTTP

Exec - 在容器的 cgroup 和命名空间内执行特定命令,例如 pre-stop.sh。命令消耗的资源计入容器。 HTTP - 针对容器上的特定端点执行 HTTP 请求。

PostStart 是这里要使用的,但是请注意钩子与主进程并行运行。 它不会等待主进程完全启动。直到钩子完成,容器将保持等待状态。

您可以为此使用一些解决方法,并将sleep 命令添加到您的脚本中,以便让它等待您的主容器创建。 您的脚本文件可以存储在容器镜像中,也可以使用ConfigMap 挂载到与 pod 共享的卷上。以下是一些如何做到这一点的示例:

kind: ConfigMap
apiVersion: v1
metadata:
  namespace: <your-namespace> 
  name: poststarthook
data:
  poststart.sh: |
     #!/bin/bash
     echo "It`s done"

确保您的脚本不超过1mbConfigMap 的限制

定义configMap 后,您将使用volumes 挂载它:

spec:
      containers:
      - image: <your-image>
        name: example-container
        volumeMounts:
          - mountPath: /opt/poststart.sh
            subPath: poststart.sh
            name: hookvolume
      volumes:
      - name: hookvolume
        configMap:
          name: poststarthook
          defaultMode: 0755 #please remember to add proper (executable) permissions

然后你可以在你的规范中定义postStart

spec:
  containers:
  - name: example-container
    image: <your-image> 
    lifecycle:
      postStart:
        exec:
          command: ["/bin/sh", "-c", /opt/poststart.sh ]

您可以在 kubernetes documentationarticle 中阅读更多关于钩子的信息。让我知道这是否有帮助。

【讨论】:

  • 感谢@acid_fuji,这个答案帮助我理解了kube hooks和volumes。
  • @Dhaya,如果我的回答有帮助,您会考虑接受和upvoting it吗?
  • @thomas 你的意思是把SQL脚本的内容放到configMap里面吗?
猜你喜欢
  • 2021-06-29
  • 2022-12-17
  • 2021-02-19
  • 2021-05-07
  • 2011-01-05
  • 2017-09-15
  • 1970-01-01
  • 2021-02-02
  • 1970-01-01
相关资源
最近更新 更多