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
我正在尝试执行一些脚本作为有状态集部署类型的一部分。我已将此脚本添加为 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