【发布时间】:2019-08-01 22:00:36
【问题描述】:
我在一个由 Postgres 数据库和 tomcat 服务器组成的开源系统上工作。我有每个组件的 docker 图像。我们目前使用 docker-compose 来测试应用程序。
我正在尝试使用 kubernetes 对该应用程序进行建模。
这是我的第一次尝试。
apiVersion: v1
kind: Pod
metadata:
name: dspace-pod
spec:
volumes:
- name: "pgdata-vol"
emptyDir: {}
- name: "assetstore"
emptyDir: {}
- name: my-local-config-map
configMap:
name: local-config-map
containers:
- image: dspace/dspace:dspace-6_x
name: dspace
ports:
- containerPort: 8080
name: http
protocol: TCP
volumeMounts:
- mountPath: "/dspace/assetstore"
name: "assetstore"
- mountPath: "/dspace/config/local.cfg"
name: "my-local-config-map"
subPath: local.cfg
#
- image: dspace/dspace-postgres-pgcrypto
name: dspacedb
ports:
- containerPort: 5432
name: http
protocol: TCP
volumeMounts:
- mountPath: "/pgdata"
name: "pgdata-vol"
env:
- name: PGDATA
value: /pgdata
我有一个 configMap 将主机名设置为 pod 的名称。
apiVersion: v1
kind: ConfigMap
metadata:
creationTimestamp: 2016-02-18T19:14:38Z
name: local-config-map
namespace: default
data:
local.cfg: |-
dspace.dir = /dspace
db.url = jdbc:postgresql://dspace-pod:5432/dspace
dspace.hostname = dspace-pod
dspace.baseUrl = http://dspace-pod:8080
solr.server=http://dspace-pod:8080/solr
此应用程序有许多从命令行运行的任务。
我创建了第三个 Docker 映像,其中包含命令行所需的 jar。
我有兴趣在 Kubernetes 中将这些命令行任务建模为 Jobs。假设这是处理这些任务的适当方式,我如何指定作业应该在已经运行的 Pod 中运行?
这是我第一次尝试定义工作。
apiVersion: batch/v1
kind: Job
#https://kubernetes.io/docs/concepts/workloads/controllers/jobs-run-to-completion/
metadata:
name: dspace-create-admin
spec:
template:
spec:
volumes:
- name: "assetstore"
emptyDir: {}
- name: my-local-config-map
configMap:
name: local-config-map
containers:
- name: dspace-cli
image: dspace/dspace-cli:dspace-6_x
command: [
"/dspace/bin/dspace",
"create-administrator",
"-e", "test@test.edu",
"-f", "test",
"-l", "admin",
"-p", "admin",
"-c", "en"
]
volumeMounts:
- mountPath: "/dspace/assetstore"
name: "assetstore"
- mountPath: "/dspace/config/local.cfg"
name: "my-local-config-map"
subPath: local.cfg
restartPolicy: Never
【问题讨论】:
-
你不会:一个 Job 总是会启动一个新的 Pod。
-
(正如您所展示的,您确实应该将服务本身和数据库分开。
emptyDir卷的持续时间与 pod 一样长,并且需要对底层映像进行任何更新删除并重新创建 pod,这意味着此配置将丢失数据。您还需要在应用程序前面有一个 Service 才能从外部访问它,并在数据库前面有一个 Service 才能到达它来自应用程序。) -
@DavidMaze,感谢您的建议。根据这些建议,我取得了一些不错的进展。
标签: docker kubernetes kubernetes-pod