Kubernetes initContainers 复制文件并作为 Lifecycle Hook PostStart 的一部分执行

Kubernetes initContainers to copy file and execute as part of Lifecycle Hook PostStart

我正在尝试执行一些脚本作为有状态集部署类型的一部分。我已将此脚本添加为 configmap,并将其用作 pod 定义中的 volumeMount。我使用 lifecycle poststart exec 命令来执行这个脚本。它因权限问题而失败。

根据某些文章,我发现我们应该将此文件复制为 InitContainer 的一部分,然后使用它(我不确定我们为什么要这样做以及会有什么不同) 不过,我试过了,还是报了同样的错误。

这是我的 ConfigMap:

apiVersion: v1
kind: ConfigMap
metadata:
  name: postgres-configmap-initscripts
data:
  poststart.sh: |
     #!/bin/bash
     echo "It`s done"

这是我的 StatefulSet:

apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: postgres-statefulset
spec:
  ....
  serviceName: postgres-service
  replicas: 1
  template:
    ...
    spec:
      initContainers:
      - name: "postgres-ghost"
        image: alpine
        volumeMounts:
        - mountPath: /scripts
          name: postgres-scripts
      containers:
      - name: postgres
        image: postgres
        lifecycle:
            postStart:
              exec:
                command: ["/bin/sh", "-c", "/scripts/poststart.sh" ]
        ports:
        - containerPort: 5432
          name: dbport
        ....
        volumeMounts:
        - mountPath: /scripts
          name: postgres-scripts
volumes:
  - name: postgres-scripts
    configMap:
      name: postgres-configmap-initscripts
      items:
      - key: poststart.sh
        path: poststart.sh

我得到的错误:

postStart 挂钩将至少被调用一次,但可能会被调用 多次 ,这不是 运行 脚本的好地方。

作为 ConfigMap 安装的 poststart.sh 文件将没有执行模式,因此权限错误。

最好在 initContainers 中使用 运行 脚本,这里有一个简单的示例 chmod;而在您的情况下,您可以改为执行脚本:

cat << EOF | kubectl apply -f -
apiVersion: v1
kind: ConfigMap
metadata:
  name: busybox
data:
  test.sh: |
    #!/bin/bash
    echo "It's done"
---
apiVersion: v1
kind: Pod
metadata:
  name: busybox
  labels:
    run: busybox
spec:
  volumes:
  - name: scripts
    configMap:
      name: busybox
      items:
      - key: test.sh
        path: test.sh
  - name: runnable
    emptyDir: {}
  initContainers:
  - name: prepare
    image: busybox
    imagePullPolicy: IfNotPresent
    command: ["ash","-c"]
    args: ["cp /scripts/test.sh /runnable/test.sh && chmod +x /runnable/test.sh"]
    volumeMounts:
    - name: scripts
      mountPath: /scripts
    - name: runnable
      mountPath: /runnable
  containers:
  - name: busybox
    image: busybox
    imagePullPolicy: IfNotPresent
    command: ["ash","-c"]
    args: ["while :; do . /runnable/test.sh; sleep 1; done"]
    volumeMounts:
    - name: scripts
      mountPath: /scripts
    - name: runnable
      mountPath: /runnable
EOF