gpt4 book ai didi

Kubernetes:必须通信的多个容器+暴露的nodePort

转载 作者:行者123 更新时间:2023-12-02 11:58:25 25 4
gpt4 key购买 nike

在我的设置中,有一组最初构建为使用 docker-compose 运行的容器。 .迁移到 Kubernetes 后,我面临以下挑战:

  • docker-compose设法提供某种类型的内部 DNS,允许容器通过其名称来寻址。如何在 Kubernetes 中创建这样的网络?到目前为止我发现了什么:
  • 它们都可以是一个 pod 的一部分,因此通过 localhost
  • 进行通信
  • 它们都可以有一个带有匹配键:值对和服务的通用标签,但是如何处理端口?
  • 我需要将内部端口公开给某个 NodePort,因为它必须公开可用。这样的服务配置如何?到目前为止我发现了什么:
  • 像这样的东西:
    apiVersion: v1
    kind: Service
    metadata:
    labels:
    app: frontend
    name: frontend-nodeport
    spec:
    type: NodePort
    ports:
    - name: "3000-30001"
    port: 3000
    nodePort: 30001
    selector:
    app: frontend
    status:
    loadBalancer: {}`
  • 最佳答案

    Docker-compose managed to provide some type of internal DNS that allowed a container to be addressed by its name. How do I create such a network in Kubernetes?



    正如您所研究的那样,您确实可以有两种方法:
  • 中频你的容器是一起缩放然后将它们放在同一个 pod 中,并通过 localhost 通过不同的端口进行通信。这不太可能是您的情况,因为当容器化应用程序更类似于一个物理盒子上的进程而不是单独的服务/服务器时,这种方法更合适。
  • 中频你的容器是缩放分离 ,这更可能是您的情况,然后使用服务。使用服务,代替 localhost(在前一点),如果跨命名空间访问服务,您将只使用服务名称(如果 pod 位于同一命名空间中)或 FQDN (servicename.namespace.svc.cluster.local)。与之前您必须为容器使用不同端口(因为您使用本地主机地址)相反,在这种情况下,您可以在多个服务中使用相同的端口,因为 service:port 必须是唯一的。如果您也愿意,也可以通过服务重新映射容器中的端口。

  • 既然您将此作为介绍性问题提出,请注意两点:
  • 服务解析从 pod/container 的角度工作。要对其进行测试,您实际上需要执行到实际容器(或来自主机的代理)中,这是常见的混淆点。只是为了安全测试服务:实际容器内的端口可访问性,而不是来自主容器。
  • 最后,只是为了模仿容器间网络的 docker-compose 设置,您不需要公开 NodePort 或其他任何东西。 Kubernetes 中的服务层将负责 DNS 处理。 NodePort 有不同的意图。

  • I need to expose an internal Port to a certain NodePort. How does such a service config look like?



    你走的很好,这里是 nice overview为了帮助您入门,与您的问题相关的引用如下:
    apiVersion: v1
    kind: Service
    metadata:
    name: my-nodeport-service
    selector:
    app: my-app
    spec:
    type: NodePort
    ports:
    - name: http
    port: 80
    targetPort: 80
    nodePort: 30036
    protocol: TCP

    Edit: Could you please provide an example of how a service.yaml would look like if the containers are scaled seperately ?


  • 第一个是,比如说,api server,我们称之为 svc-my-api ,它将使用标记为 app: my-api 的 pod(s)并与 pod 的 80 端口通信,并且可以被其他 pod(在同一命名空间中)作为主机访问:svc-my-api和端口:8080
    apiVersion: v1
    kind: Service
    metadata:
    name: svc-my-api
    labels:
    app: my-api
    spec:
    selector:
    app: my-api
    ports:
    - protocol: TCP
    port: 8080
    targetPort: 80
  • 第二个是,比如说,mysql服务器,我们称之为svc-my-database .假设来自 api pod 的容器(被之前的服务覆盖)想要访问数据库,它们将使用主机:svc-my-database和端口:3306 .
    apiVersion: v1
    kind: Service
    metadata:
    name: svc-my-database
    labels:
    app: my-database
    spec:
    selector:
    app: my-database
    ports:
    - name: http
    protocol: TCP
    port: 3306
    targetPort: 3306
  • 关于Kubernetes:必须通信的多个容器+暴露的nodePort,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50872689/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com