如何使用kubernetes secret设置的环境变量运行cron命令

时间:2016-12-20 14:50:39

标签: ruby-on-rails bash cron debian kubernetes

我正在使用kubernetes secret作为我的环境变量 (http://kubernetes.io/docs/user-guide/secrets/#using-secrets-as-environment-variables)。

我已经检查了

是否正确设置了env vars
kubectl exec -it my_pod bash

1

echo $RAILS_ENV #=> staging

2

bin/rails c;
puts ENV['RAILS_ENV'] #=> staging

它适用于我的rails应用程序和bash命令,但在执行cron进程时不起作用。

我已经阅读了一些帖子来理解cron进程(例如https://unix.stackexchange.com/questions/27289/how-can-i-run-a-cron-command-with-existing-environmental-variables)并知道我应该在执行cron命令之前使用.profile或.bashrc。

$ crontab -l

* * * * * . $HOME/.profile; /bin/bash -l -c 'echo rails_env=$RAILS_ENV >> /tmp/cron_test.log'

* * * * * . $HOME/.bashrc; /bin/bash -l -c 'echo rails_env=$RAILS_ENV >> /tmp/cron_test.log'

但两者都不适合我''

结果

rails_env=

任何帮助将不胜感激!

===

[更新:添加kubernetes yaml config]

由kubernetes config和kubernetes secret分配的两个环境变量都可以在bash和rails应用程序中读取,但在cron进程中不起作用。

deployment.yaml

spec:
  containers:
  - name: my_rails
  ...
    command:
    - bash
    args:
    - /tmp/run_cron.sh
  ...
    env:
      - name: RAILS_ENV
        value: staging
      - name: MYSQL_PASSWORD
        valueFrom:
          secretKeyRef:
            name: rails-secret
            key: MYSQL_PASSWORD

secret.yaml

apiVersion: v1
kind: Secret
metadata:
  name: rails-secret
type: Opaque
data:
  MYSQL_PASSWORD: ENCODED_PASSWORD

2 个答案:

答案 0 :(得分:2)

我和一些人讨论后找到了解决方案。

问题应该是docker级别而不是kubernetes级别。 https://ypereirareis.github.io/blog/2016/02/29/docker-crontab-environment-variables/

Cron进程并不像普通的login-shell那样运行,因此它不能满足我们对docker / k8s设置的读取环境变量的期望。

要解决这个问题,我们必须首先让cron进程读取环境变量。

STEP1。

在run_cron.sh

中添加一行来转储环境变量
#!/bin/bash

# dump environment variables
printenv | sed 's/^\(.*\)$/export \1/g' >> /etc/profile.d/rails_env.sh

cron -f

STEP2。

在执行命令之前让cron读取环境变量。

* * * * * . /etc/profile.d/rails_env.sh; ruby my_job.rb >> /tmp/cron.log 2>&1

或使用bash - login 选项,这将是/etc/profile.d

下的每个文件
* * * * * /bin/bash -l -c 'ruby my_job.rb >> /tmp/cron.log 2>&1'

然后cron按预期工作!

答案 1 :(得分:1)

您可能应该使用CronJobs,而不是在容器内运行cron脚本,您可以使用与部署相同的方式设置env变量。