2016-12-20 4 views
1

Я использую секрет кубернетов как переменную окружения (http://kubernetes.io/docs/user-guide/secrets/#using-secrets-as-environment-variables).Как я могу запустить команду cron с переменными окружения, заданными с помощью kubernetes secret

Я проверить VARS ли окр правильно установлен

kubectl exec -it my_pod bash 

1.

echo $RAILS_ENV #=> staging 

2.

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

Он отлично работает для моего приложения рельсы и команды Баш, но не работает при выполнении процесса 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 конфигурации]

Обе переменные окружения присваивать kubernetes конфигурации и kubernetes секрет можно прочитать в Баш и рельсы приложения, но не работает в хрон обработать.

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 
+0

В каком файле вы устанавливаете 'RAILS_ENV' в 'staging'? – Brian

+0

@Brian Я использую kubernetes секрет как переменную среды, но я не понимаю деталей о том, как кубернеты реализуют. – gaga5lala

+0

Что означает «RAILS_ENV» в отношении «секретности кубернетов»? – Brian

ответ

1

Вместо запуска хрон сценариев внутри контейнера, вы, вероятно, следует использовать CronJobs, где вы можете установить окр вары из секретов в том же как вы это делаете для развертывания.

+0

Я видел документ 'CronJob', но больше не делал опроса. У меня есть два вопроса: 1. Можно ли считать env vars, установленным k8s секретом системой cron внутри контейнера? 2. Есть ли преимущества использования CronJob вместо системного cron? и CronJob в настоящее время находится в альфе, означает ли это, что он еще не стабилен? Спасибо – gaga5lala

+0

Вы можете пойти и использовать CronJob, не беспокоясь слишком много. Amanpreet прав, вы должны обязательно использовать CronJob или ScheduledJob или по крайней мере Job. Вы используете развертывание прямо сейчас? – iamnat

+0

@iamnat Хм ... Я должен убедить нашего лидера devops обновить кластер k8s и сначала использовать альфа-функцию. Да, сейчас я использую развертывание. – gaga5lala

1

Я нашел решение после обсуждения с некоторыми парнями.

Проблема должна быть уровня докера, а не уровня кубернетов. https://ypereirareis.github.io/blog/2016/02/29/docker-crontab-environment-variables/

Процесс Cron не работает как обычная оболочка для входа, поэтому он не стал нашим ожиданием переменных среды чтения, установленных 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' 

Тогда хрон работы в ожидании!

 Смежные вопросы

  • Нет связанных вопросов^_^