docker - Kubernetes:为 Postgres + Tomcat 应用程序建模作业/Cron 任务

标签 docker kubernetes kubernetes-pod

我在一个开源系统上工作,该系统由 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 中的作业。假设这是处理这些任务的适当方法,我如何指定作业应在已运行的 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", "<a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="4d39283e390d39283e3963282938" rel="noreferrer noopener nofollow">[email protected]</a>",
          "-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

最佳答案

以下配置使我能够如我所愿地启动我的服务(tomcat 和 postgres)。

apiVersion: v1
kind: ConfigMap
metadata:
  creationTimestamp: 2016-02-18T19:14:38Z
  name: local-config-map
  namespace: default
data:
  # example of a simple property defined using --from-literal
  #example.property.1: hello
  #example.property.2: world
  # example of a complex property defined using --from-file
  local.cfg: |-
    dspace.dir = /dspace
    db.url = jdbc:postgresql://dspacedb-service:5432/dspace
    dspace.hostname = dspace-service
    dspace.baseUrl = http://dspace-service:8080
    solr.server=http://dspace-service:8080/solr
---
apiVersion: v1
kind: Service
metadata:
  name: dspacedb-service
  labels:
    app: dspacedb-app
spec:
  type: NodePort
  selector:
    app: dspacedb-app
  ports:
  - protocol: TCP
    port: 5432
  #  targetPort: 5432
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: dspacedb-deploy
  labels:
    app: dspacedb-app
spec:
  selector:
    matchLabels:
      app: dspacedb-app
  template:
    metadata:
      labels:
        app: dspacedb-app
    spec:
      volumes:
      - name: "pgdata-vol"
        emptyDir: {}
      containers:
      - 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
---
apiVersion: v1
kind: Service
metadata:
  name: dspace-service
  labels:
    app: dspace-app
spec:
  type: NodePort
  selector:
    app: dspace-app
  ports:
  - protocol: TCP
    port: 8080
    targetPort: 8080
    name: http
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: dspace-deploy
  labels:
    app: dspace-app
spec:
  selector:
    matchLabels:
      app: dspace-app
  template:
    metadata:
      labels:
        app: dspace-app
    spec:
      volumes:
      - name: "assetstore"
        emptyDir: {}
      - name: my-local-config-map
        configMap:
          name: local-config-map
      containers:
      - image: dspace/dspace:dspace-6_x-jdk8-test
        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

应用上述配置后,我得到以下结果。

$ kubectl get services -o wide
NAME               TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)          AGE       SELECTOR
dspace-service     NodePort    10.104.224.245   <none>        8080:32459/TCP   3s        app=dspace-app
dspacedb-service   NodePort    10.96.212.9      <none>        5432:30947/TCP   3s        app=dspacedb-app
kubernetes         ClusterIP   10.96.0.1        <none>        443/TCP          22h       <none>

$ kubectl get pods
NAME                               READY     STATUS      RESTARTS   AGE
dspace-deploy-c59b77bb8-mr47k      1/1       Running     0          10m
dspacedb-deploy-58dd85f5b9-6v2lf   1/1       Running     0          10

我很高兴看到服务名称可以用于端口转发。

$ kubectl port-forward service/dspace-service 8080:8080
Forwarding from 127.0.0.1:8080 -> 8080
Forwarding from [::1]:8080 -> 8080

我还可以使用 configMap 中定义的服务名称运行以下作业。

apiVersion: batch/v1
kind: Job
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", "<a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="4b3f2e383f0b3f2e383f652e2f3e" rel="noreferrer noopener nofollow">[email protected]</a>",
          "-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

结果

$ kubectl get pods
NAME                               READY     STATUS      RESTARTS   AGE
dspace-create-admin-kl6wd          0/1       Completed   0          5m
dspace-deploy-c59b77bb8-mr47k      1/1       Running     0          10m
dspacedb-deploy-58dd85f5b9-6v2lf   1/1       Running     0          10m

我还有一些工作要做来保存卷。

关于docker - Kubernetes:为 Postgres + Tomcat 应用程序建模作业/Cron 任务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57317501/

相关文章:

linux - sles 12 可以安装 docker-compose 吗?

mongodb - 将 MongoDB 部署到 Google Cloud Platform 的最佳方式?

nginx - 在没有 GCP 负载均衡器的情况下创建 kubernetes nginx ingress

dockerhub 自动构建 - 需要广泛的 github 权限?

jenkins - 从另一个容器控制一个容器

kubernetes - 无法使用 Hyper-V 在 Windows 10 上启动 minikube

Azure Kubernetes - 每个节点仅执行一次部署?

docker - 在运行时在Pod中创建其他容器的正确方法是什么?

docker - 如何触发容器启动另一个容器并在将 REST 查询传递给它时终止它?

Linux 网络 - Docker 容器通过网关到远程主机而不使用路由添加?