我想利用海图钩的post-install对部署的容器执行一些操作。
例如,我有一个php-fpm容器,它由一个Laravel应用程序组成,我希望在安装时运行php artisan key:gen。因为它是一个一次性命令,所以我不能将它放在postStart生命周期中,否则它将继续覆盖APP_KEY。
如何使用图表钩子来实现它?还是有更好的方法?
发布于 2019-05-09 07:58:06
您的作业需要运行一个包含kubectl的容器,并执行此脚本以执行到另一个容器中。由于kubectl exec 不支持标签选择,您需要事先检索荚名:
$pod=$(kubectl get pods --no-headers -o custom-columns=":metadata.name" -l YOUR-LABELS=YOUR-VALUES)
kubectl exec $pod php artisan key:gen发布于 2019-05-09 10:45:07
如果您考虑到这个键的生命周期:如果有多个pod副本,它们需要就密钥的内容达成一致;如果您删除并重新创建了该键,那么它需要使用的密钥与之前使用的密钥相同。(谷歌快速搜索出了一些关于这个钥匙实际上是用来做什么的?的很好的描述;例如,如果它在加密会话cookie,那么每一份豆荚都需要同意。)
这意味着一次生成密钥的设置,将其存储在一个Kubernetes秘密中,并将其提供给豆荚。很方便,文件可以被外部环境变量重写“和可以根据秘密值设置环境变量。。没有一种很好的方法可以使Helm以一种将被保存的方式生成秘密本身。
因此,将这些部分放在一起:在您的荚规范(在您的部署规范中)中,您需要从秘密中获取环境变量。
env:
- name: APP_KEY
valueFrom:
secretKeyRef:
name: "{{ .Release.Name }}-{{ .Chart.Name }}"
key: app-key然后你需要创造一个秘密来掌握钥匙。
apiVersion: v1
kind: Secret
metadata:
name: "{{ .Release.Name }}-{{ .Chart.Name }}"
data:
app-key: {{ printf "base64:%s" .Values.appKey | b64enc }}最后创建保存密钥的文件。这不应作为您的图表的一部分签入。
echo "appKey: $(dd if=/dev/urandom bs=32 count=1 | base64)" > values-local.yaml安装图表时,请使用以下值文件
helm install ./charts/myapp -f values-local.yaml还有几种其他合理的方法,包括将整个.env文件注入ConfigMap或ConfigMap,或者扩展您的Docker映像,以便从传递给它的值中自动生成该文件,或者在主容器启动之前使用init容器生成文件。关键是豆荚的来来去去,需要能够在启动时配置自己;以您建议的方式使用kubectl exec并不是很好的实践。
发布于 2019-05-09 02:39:30
您可以定义在安装Helm图表时只运行一次的作业:
apiVersion: batch/v1
kind: Job
metadata:
name: "{{.Release.Name}}"
labels:
app.kubernetes.io/managed-by: {{.Release.Service | quote }}
app.kubernetes.io/instance: {{.Release.Name | quote }}
app.kubernetes.io/version: {{ .Chart.AppVersion }}
helm.sh/chart: "{{.Chart.Name}}-{{.Chart.Version}}"
annotations:
# This is what defines this resource as a hook. Without this line, the
# job is considered part of the release.
"helm.sh/hook": post-install
"helm.sh/hook-weight": "-5"
"helm.sh/hook-delete-policy": hook-succeeded
spec:
template:
metadata:
name: "{{.Release.Name}}"
labels:
app.kubernetes.io/managed-by: {{.Release.Service | quote }}
app.kubernetes.io/instance: {{.Release.Name | quote }}
helm.sh/chart: "{{.Chart.Name}}-{{.Chart.Version}}"
spec:
restartPolicy: Never
containers:
- name: post-install-job
image: "alpine:3.3"
command: ["/bin/sleep","{{default "10" .Values.sleepyTime}}"]如果您想在每次升级图表时运行作业,您可以指定“升级后”挂钩。在这里阅读更多信息:hooks.md
https://stackoverflow.com/questions/56051348
复制相似问题