首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Helm:对作业中的其他容器执行命令

Helm:对作业中的其他容器执行命令
EN

Stack Overflow用户
提问于 2019-05-09 02:23:16
回答 3查看 3.5K关注 0票数 1

我想利用海图钩post-install对部署的容器执行一些操作。

例如,我有一个php-fpm容器,它由一个Laravel应用程序组成,我希望在安装时运行php artisan key:gen。因为它是一个一次性命令,所以我不能将它放在postStart生命周期中,否则它将继续覆盖APP_KEY

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

EN

回答 3

Stack Overflow用户

发布于 2019-05-09 07:58:06

您的作业需要运行一个包含kubectl的容器,并执行此脚本以执行到另一个容器中。由于kubectl exec 不支持标签选择,您需要事先检索荚名:

代码语言:javascript
复制
$pod=$(kubectl get pods --no-headers -o custom-columns=":metadata.name" -l YOUR-LABELS=YOUR-VALUES)
kubectl exec $pod php artisan key:gen
票数 2
EN

Stack Overflow用户

发布于 2019-05-09 10:45:07

如果您考虑到这个键的生命周期:如果有多个pod副本,它们需要就密钥的内容达成一致;如果您删除并重新创建了该键,那么它需要使用的密钥与之前使用的密钥相同。(谷歌快速搜索出了一些关于这个钥匙实际上是用来做什么的?的很好的描述;例如,如果它在加密会话cookie,那么每一份豆荚都需要同意。)

这意味着一次生成密钥的设置,将其存储在一个Kubernetes秘密中,并将其提供给豆荚。很方便,文件可以被外部环境变量重写“可以根据秘密值设置环境变量。。没有一种很好的方法可以使Helm以一种将被保存的方式生成秘密本身。

因此,将这些部分放在一起:在您的荚规范(在您的部署规范中)中,您需要从秘密中获取环境变量。

代码语言:javascript
复制
env:
  - name: APP_KEY
    valueFrom:
      secretKeyRef:
        name: "{{ .Release.Name }}-{{ .Chart.Name }}"
        key: app-key

然后你需要创造一个秘密来掌握钥匙。

代码语言:javascript
复制
apiVersion: v1
kind: Secret
metadata:
  name: "{{ .Release.Name }}-{{ .Chart.Name }}"
data:
  app-key: {{ printf "base64:%s" .Values.appKey | b64enc }}

最后创建保存密钥的文件。这不应作为您的图表的一部分签入。

代码语言:javascript
复制
echo "appKey: $(dd if=/dev/urandom bs=32 count=1 | base64)" > values-local.yaml

安装图表时,请使用以下值文件

代码语言:javascript
复制
helm install ./charts/myapp -f values-local.yaml

还有几种其他合理的方法,包括将整个.env文件注入ConfigMap或ConfigMap,或者扩展您的Docker映像,以便从传递给它的值中自动生成该文件,或者在主容器启动之前使用init容器生成文件。关键是豆荚的来来去去,需要能够在启动时配置自己;以您建议的方式使用kubectl exec并不是很好的实践。

票数 1
EN

Stack Overflow用户

发布于 2019-05-09 02:39:30

您可以定义在安装Helm图表时只运行一次的作业:

代码语言:javascript
复制
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

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56051348

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档