У меня есть модуль с двумя контейнерами: веб-сервер django и облачный прокси-сервер sql.
Я хочу запускать cronjob каждый день (какая-то команда django manage.py). В идеале я хотел бы, чтобы в одном из моих запущенных модулей был создан новый контейнер, скопировав уже запущенный там веб-сервер.
- Найти модуль A
- Скопировать контейнер Django из модуляA
- Запустить новый контейнер django в модуле A
- выполнить команду в новом контейнере модуля A
- закрыть новый контейнер модуля A
Насколько я понимаю, выполнение CronJob из kubernetes создаст новый собственный модуль. Это означает, что мне нужно скопировать все, включая тома и прокси-контейнер. Я попытался сделать это вручную (скопировав весь pod conf из развертывания в CronJob conf)
---
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: SomeName
labels:
environment: SomeEnv
spec:
replicas: 1
template:
metadata:
labels:
app: SomeApp
name: SomeName2
environment: SomeEnv
spec:
containers:
- image: gcr.io/org/someimage:tag
name: ContainerName
imagePullPolicy: IfNotPresent
volumeMounts:
- name: app-secrets
mountPath: /var/run/secrets/app
readOnly: true
env:
- name: SECRET_KEY
valueFrom:
secretKeyRef:
name: app-secrets
key: django
- image: gcr.io/cloudsql-docker/gce-proxy:1.11
name: cloudsql-proxy
command: ["/cloud_sql_proxy", "--dir=/cloudsql",
"-instances=org:zone:db=tcp:5432",
"-credential_file=/secrets/cloudsql/credentials.json"]
volumeMounts:
- name: cloudsql-instance-credentials
mountPath: /secrets/cloudsql
readOnly: true
- name: ssl-certs
mountPath: /etc/ssl/certs
- name: cloudsql
mountPath: /cloudsql
volumes:
- name: SomeName-secrets
secret:
secretName: app-secrets
---
apiVersion: batch/v1beta1
kind: CronJob
metadata:
name: SomeName-Cron
labels:
environment: SomeEnv
spec:
schedule: "0 1 * * *" # Daily at 1am
jobTemplate:
spec:
template:
spec:
containers:
- image: gcr.io/org/someimage:tag
name: ContainerName
imagePullPolicy: IfNotPresent
volumeMounts:
- name: app-secrets
mountPath: /var/run/secrets/app
readOnly: true
env:
- name: SECRET_KEY
valueFrom:
secretKeyRef:
name: app-secrets
key: django
- image: gcr.io/cloudsql-docker/gce-proxy:1.11
name: cloudsql-proxy
command: ["/cloud_sql_proxy", "--dir=/cloudsql",
"-instances=org:zone:db=tcp:5432",
"-credential_file=/secrets/cloudsql/credentials.json"]
volumeMounts:
- name: cloudsql-instance-credentials
mountPath: /secrets/cloudsql
readOnly: true
- name: ssl-certs
mountPath: /etc/ssl/certs
- name: cloudsql
mountPath: /cloudsql
volumes:
- name: SomeName-secrets
secret:
secretName: app-secrets
Но прокси cloud_sql почему-то не удается подключиться в Cronjob conf:
2019/10/04 08:14:44 New connection for "org:zone:db"
2019/10/04 08:14:44 Throttling refreshCfg(org:zone:db): it was only called 44
5.482222ms ago
2019/10/04 08:14:44 couldn't connect to "org:zone:db": Post https://www.googl
eapis.com/sql/v1beta4/projects/org/instances/block-report/createEphemeral?alt=json: oauth2: c
annot fetch token: Post https://accounts.google.com/o/oauth2/token: dial tcp: i/o timeout
^C
Эти ошибки действительно сбивают с толку, поэтому я застрял в этом тесте.
Может кто-нибудь знает чистый способ запуска cronjob с повторным использованием существующего контейнера?