头盔:对作业中的其他容器执行命令

时间:2019-05-09 02:23:16

标签: laravel kubernetes kubernetes-helm

我想利用Charts Hookspost-install对部署容器进行一些操作。

例如,我有一个由php-fpm应用程序组成的Laravel容器,并且我想在安装时运行php artisan key:gen。由于它是一次性命令,因此我无法将其置于postStart生命周期中,否则它将继续覆盖APP_KEY

如何使用 图表挂钩 来实现?还是有更好的方法?

3 个答案:

答案 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