У меня есть модуль с двумя контейнерами: веб-сервер django и облачный прокси-сервер sql.
Я хочу запускать cronjob каждый день (некоторая команда django manage.py). В идеале я хотел бы, чтобы новый контейнер был создан в одном из моих работающих модулей путем копирования уже работающего там веб-сервера.
- Найдите капсулу А
- Скопируйте контейнер django из модуля A
- Запустите новый контейнер django в pod A
- выполнить команду в новом контейнере модуля A
- закрыть новый контейнер модуля A
Насколько я понимаю, выполнение kubernetes CronJob создаст новый собственный модуль. Это означает, что мне нужно скопировать все, включая тома и прокси-контейнер. Я попытался сделать это вручную (скопировав всю конфигурацию pod из развертывания в конфигурацию CronJob)
---
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:
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 с использованием существующего контейнера?
volumeMounts:name
(это 'cloudsql-instance-credentials') иvolumes:name
(это 'SomeName-secrets') должны быть одинаковыми, иначе они не будут смонтированы должным образом (см.: stackoverflow.com/questions/46578331/) Вы также можете подумать об использовании-token
варианта подключения manpages.ubuntu.com/manpages/disco/man1/cloud_sql_proxy.1.html Обновите его и дайте мне знать, работает ли он у вас. - person Ines   schedule 09.10.2019