【问题标题】:Can't connect database container with server container using a single pod无法使用单个 pod 将数据库容器与服务器容器连接
【发布时间】:2022-01-05 22:15:52
【问题描述】:

我正在创建一个包含多个容器的 POD 文件。一个是网络服务器容器,另一个是我的 PostgreSQL 容器。这是我的 pod 文件,名为 simple.yaml

apiVersion: v1
kind: Pod
metadata:
  creationTimestamp: "2022-01-01T16:28:15Z"
  labels:
    app: eltask
  name: eltask
spec:
  containers:
  - name: el_web
    command:
      - ./entrypoints/entrypoint.sh
    env:
    - name: PATH
      value: /usr/local/bundle/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
    - name: TERM
      value: xterm
    - name: container
      value: podman
    - name: RUBY_MAJOR
      value: "2.7"
    - name: BUNDLE_SILENCE_ROOT_WARNING
      value: "1"
    - name: BUNDLE_APP_CONFIG
      value: /usr/local/bundle
    - name: LANG
      value: C.UTF-8
    - name: RUBY_VERSION
      value: 2.7.2
    - name: RUBY_DOWNLOAD_SHA256
      value: 1b95ab193cc8f5b5e59d2686cb3d5dcf1ddf2a86cb6950e0b4bdaae5040ec0d6
    - name: GEM_HOME
      value: /usr/local/bundle
    image: docker.io/hmtanbir/elearniotask
    ports:
    - containerPort: 3000
      hostPort: 3000
      protocol: TCP
    resources: {}
    securityContext:
      allowPrivilegeEscalation: true
      capabilities:
        drop:
        - CAP_MKNOD
        - CAP_NET_RAW
        - CAP_AUDIT_WRITE
      privileged: false
      readOnlyRootFilesystem: false
      seLinuxOptions: {}
    tty: true
    workingDir: /app
  - name: el_db
    image: docker.io/library/postgres:10-alpine3.13
    env:
      - name: PATH
        value: /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
      - name: TERM
        value: xterm
      - name: container
        value: podman
      - name: PG_MAJOR
        value: "10"
      - name: PG_VERSION
        value: "10.17"
      - name: PGDATA
        value: /var/lib/postgresql/data
      - name: LANG
        value: en_US.utf8
      - name: PG_SHA256
        value: 5af28071606c9cd82212c19ba584657a9d240e1c4c2da28fc1f3998a2754b26c
      - name: POSTGRES_PASSWORD
        value: password
    args:
      - postgres
    command:
      - docker-entrypoint.sh
    ports:
      - containerPort: 5432
        hostPort: 9876
        protocol: TCP
    resources: {}
    securityContext:
      allowPrivilegeEscalation: true
      capabilities:
        drop:
          - CAP_MKNOD
          - CAP_NET_RAW
          - CAP_AUDIT_WRITE
        privileged: false
        readOnlyRootFilesystem: false
        seLinuxOptions: {}
    tty: true
    workingDir: /
  dnsConfig: {}
  restartPolicy: Never
status: {}

我在3000:3000 端口运行一个网络服务器容器,数据库容器端口是9876:5432。 但是当我使用 PODMAN podman play kube simple.yaml 运行 cmd 时,DB 容器正在运行 127.0.0.0:9876 但 webserver 无法连接到 DB 服务器。

我的网络服务器数据库配置:

ELTASK_DATABASE_HOST=localhost
ELTASK_DATABASE_PORT=9876
ELTASK_DATABASE_USERNAME=postgres
ELTASK_DATABASE_PASSWORD=password

如果我在没有 Podman 的情况下运行网络服务器,服务器可以使用9876 端口连接到数据库。

那么,为什么网络服务器在通过 Podman 运行时无法连接到数据库容器?

【问题讨论】:

  • 如果postgres只需要从el_web容器访问,我觉得可以去掉- containerPort: 5432 hostPort: 9876 protocol: TCP。例如,请参阅 example 中的 The Pod Spec 部分
  • 创建裸 Pod 或在 Pod 中放置多个容器通常都不是最佳实践。您可以为您的应用程序运行一个部署,为数据库运行一个单独的 StatefulSet,并为每个服务运行一个匹配的服务吗?
  • @ErikSjölund 谢谢,现在我的 pod 正在工作。

标签: kubernetes podman


【解决方案1】:

要让您的 Web 容器连接到 pod 中的 postgresql 容器,请使用 ELTASK_DATABASE_PORT=5432 而不是 ELTASK_DATABASE_PORT=9876。

【讨论】:

    【解决方案2】:

    将此作为社区 wiki 发布,随时编辑和扩展。


    答案分为两部分:

    1. 使用哪个端口以及为什么

    对于作为后端服务的postgresql,您可以省略hostPort,因为podman 作为前端服务将使用Cluster-IP 访问postresql,因此它将在端口5432 上可用。不推荐完全删除这部分的方法,当你有很多带有容器的pod时,最好能够快速看到哪个容器暴露在哪个端口上。

    一般来说hostPort不应该被使用,除非它是唯一的方法,考虑使用NodePort

    除非绝对必要,否则不要为 Pod 指定 hostPort。 当您将 Pod 绑定到 hostPort 时,它会限制 Pod 可以调度,因为每个 组合必须是唯一的。

    best practices

    1. 前端和后端部署

    将后端和前端分离到不同的deployments 始终是可取的最佳实践,因此它们可以像升级、副本等一样完全分开管理。以及services - 您不需要公开后端集群外的服务。

    an frontend and backend example

    @David Maze 也正确地表示数据库应该使用statefulSet - 请参阅more details about Statefulset

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-04-17
      • 1970-01-01
      • 2022-12-09
      • 2020-08-02
      • 2021-05-17
      • 2017-10-17
      • 2018-08-09
      • 1970-01-01
      相关资源
      最近更新 更多