我想利用Charts Hooks的post-install
对部署容器进行一些操作。
例如,我有一个由php-fpm
应用程序组成的Laravel
容器,并且我想在安装时运行php artisan key:gen
。由于它是一次性命令,因此我无法将其置于postStart
生命周期中,否则它将继续覆盖APP_KEY
。
如何使用 图表挂钩 来实现?还是有更好的方法?
答案 0 :(得分:1)
如果考虑此密钥的生命周期:如果有多个Pod副本,则他们需要就密钥是什么达成共识;并且如果您删除并重新创建了广告连播,则其使用的键必须与之前使用的相同。 (快速的Google搜索提供了what this key is actually used for的一些很好的描述;例如,如果要加密会话cookie,则确实需要同意Pod的每个副本。)
这建议一种设置,在该设置中,您只需生成一次密钥,然后将其存储在Kubernetes Secret中,然后将其提供给Pod。方便地,"any variable in your .env
file can be overridden by external environment variables"和you can set an environment variable from a secret value。没有什么好办法可以使Helm以一种可以保存的方式生成秘密本身。
因此,将这些部分放在一起:在pod规范中(在部署规范中),您需要从秘密中获取环境变量。
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或Secret注入,或扩展Docker映像以根据传递给它的值自行生成此文件,或使用一个初始化容器,用于在主容器启动之前生成文件。关键是豆荚来来去去,需要在启动时进行自我配置。按照您的建议使用kubectl exec
并不是很好的做法。
答案 1 :(得分:0)
您的工作需要运行一个包含kubectl
的容器,您将执行此脚本以执行到另一个容器中。由于kubectl exec
doesn't support selection by labels以来,您需要事先获取吊舱名称:
$pod=$(kubectl get pods --no-headers -o custom-columns=":metadata.name" -l YOUR-LABELS=YOUR-VALUES)
kubectl exec $pod php artisan key:gen
答案 2 :(得分:-1)
您可以定义一个作业,该作业将在安装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}}"]
如果要在每次升级图表时运行作业-可以指定“升级后”挂钩。 在此处阅读更多信息:https://github.com/helm/helm/blob/master/docs/charts_hooks.md