gpt4 book ai didi

kubernetes - 有没有办法为 helm post-install hook 启用 shareProcessNamespace?

转载 作者:行者123 更新时间:2023-12-04 13:50:36 26 4
gpt4 key购买 nike

我正在运行一个带有 3 个容器(telegraf、fluentd 和一个内部代理)的 pod,它使用了 shareProcessNamespace: true .
我编写了一个 python 脚本来从中央 Controller API 端点获取 Telegraf 和 fluentd 的初始配置。由于这是一次性操作,我计划使用 helm post-install hook。

apiVersion: batch/v1
kind: Job
metadata:
name: agent-postinstall
annotations:
"helm.sh/hook-weight": "3"
"helm.sh/hook": "post-install"
spec:
template:
spec:
containers:
- name: agent-postinstall
image: "{{ .Values.image.agent.repository }}:{{ .Values.image.agent.tag | default .Chart.AppVersion }}"
imagePullPolicy: IfNotPresent
command: ['python3', 'getBaseCfg.py']
volumeMounts:
- name: config-agent-volume
mountPath: /etc/config
volumes:
- name: config-agent-volume
configMap:
name: agent-cm
restartPolicy: Never
backoffLimit: 1
在获取配置之前,python 脚本需要检查 telegraf/fluentd/agent 进程是否已启动。我打算等待(超时)直到 pgrep <telegraf/fluentd/agent>返回 true 然后触发 API。有没有办法启用 shareProcessNamespace也用于安装后 Hook ?谢谢。
PS:目前代理调用python脚本和自己的启动脚本。它有效,但很笨拙。我想把它移出代理容器。

最佳答案

共享进程命名空间
这个标志最重要的部分是它只在一个 pod 内工作,一个 pod 内的所有容器将在彼此之间共享进程。
在描述的方法中 job应该可以使用。作业创建一个单独的 pod所以它不会以这种方式工作。容器应该是“主”pod 的一部分,所有其他容器都可以访问该 pod 的运行进程。
More details about process sharing .
解决它的可能方法
可以使用 kubectl 直接从容器中获取进程命令。
以下是如何使用 pgrep 检查进程状态的示例命令。 pgrepContainer容器需要有 pgrep命令已经安装。job.yaml:

apiVersion: batch/v1
kind: Job
metadata:
name: "{{ .Release.Name }}-postinstall-hook"
annotations: "helm.sh/hook": post-install
spec:
template:
spec:
serviceAccountName: config-user # service account with appropriate permissions is required using this approach
volumes:
- name: check-script
configMap:
name: check-script
restartPolicy: Never
containers:
- name: post-install-job
image: "bitnami/kubectl" # using this image with kubectl so we can connect to the cluster
command: ["bash", "/mnt/script/checkScript.sh"]
volumeMounts:
- name: check-script
mountPath: /mnt/script
configmap.yaml其中包含脚本和逻辑,用于检查循环中的三个进程,每个进程每 10 秒执行 60 次迭代:
apiVersion: v1
kind: ConfigMap
metadata:
name: check-script
data:
checkScript.sh: |
#!/bin/bash
podName=test
pgrepContainer=app-1
process1=sleep
process2=pause
process3=postgres
attempts=0

until [ $attempts -eq 60 ]; do
kubectl exec ${podName} -c ${pgrepContainer} -- pgrep ${process1} 1>/dev/null 2>&1 \
&& kubectl exec ${podName} -c ${pgrepContainer} -- pgrep ${process2} 1>/dev/null 2>&1 \
&& kubectl exec ${podName} -c ${pgrepContainer} -- pgrep ${process3} 1>/dev/null 2>&1

if [ $? -eq 0 ]; then
break
fi

attempts=$((attempts + 1))
sleep 10
echo "Waiting for all containers to be ready...$[ ${attempts}*10 ] s"
done

if [ $attempts -eq 60 ]; then
echo "ERROR: Timeout"
exit 1
fi

echo "All containers are ready !"
echo "Configuring telegraf and fluentd services"
最终结果将如下所示:
$ kubectl get pods
NAME READY STATUS RESTARTS AGE
test 2/2 Running 0 20m
test-postinstall-hook-dgrc9 0/1 Completed 0 20m

$ kubectl logs test-postinstall-hook-dgrc9
Waiting for all containers to be ready...10 s
All containers are ready !
Configuring telegraf and fluentd services
以上是另一种方法,您可以使用其逻辑作为实现最终目标的基础。
开始后
还有 postStart hook可以考虑在某些逻辑所在的地方使用。它将在容器创建后运行。由于主应用程序需要时间来启动并且已经有逻辑在等待它,所以这不是问题:

there is no guarantee that the hook will execute before the container ENTRYPOINT

关于kubernetes - 有没有办法为 helm post-install hook 启用 shareProcessNamespace?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69857633/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com