【问题标题】:How to make multiple pods communicate with each other on kubernetes如何让多个 pod 在 kubernetes 上相互通信
【发布时间】:2019-11-11 08:56:26
【问题描述】:

我是 Kubernetes 新手,我正在尝试通过 microk8s 将应用程序部署到 Kubernetes。该应用程序包含 python flask 后端、angular 前端、redis 和 mysql 数据库。我将图像部署在多个 pod 中,状态显示“正在运行”,但 pod 没有相互通信。

然后应用程序完全 dockerized 并且它在 docker 级别运行。 在部署到 kubernetes 之前,我的烧瓶主机是 0.0.0.0,mysql 主机是 docker-compose.yaml 中的“服务名称”,但目前我将其替换为 kubernetes yml 文件的服务名称。

另外,在 Angular 前端中,我将连接到支持的 url 更改为 http://localhost:5000http://backend-service,其中 backend-service 是 backend-service.yml 文件中给出的名称(dns)。但这也没有任何改变。谁能告诉我如何让这些 pod 进行通信?

部署rest未连接后我只能访问前端。

列出angular、后端的服务和部署文件。

 apiVersion: v1
 kind: Service
 metadata:
   name: angular-service
 spec:
   type: NodePort
   selector:
     name: angular
   ports:
     - protocol: TCP
       nodePort: 30042
       targetPort: 4200
       port: 4200

 apiVersion: v1
 kind: Service
 metadata:
   name: backend-service
 spec:
   type: ClusterIP
   selector:
     name: backend
   ports:
     - protocol: TCP
       targetPort: 5000
       port: 5000

提前致谢!

修改后的服务文件

【问题讨论】:

    标签: python mysql angular kubernetes deployment


    【解决方案1】:

    对于 Kubernetes 中不同微服务之间的内部通信,您应该使用 Service 类型的 ClusterIP。它实际上是默认类型,因此即使您没有在Service yaml 定义文件中指定它,Kubernetes 也会假定您要创建ClusterIP。 它创建虚拟内部 IP(可在您的 Kubernetes 集群中访问)并将您的集群组件(微服务)公开为 单个入口点,即使它由许多 pod 备份。

    假设您的前端应用需要与运行在 3 个不同 pod 中的后端组件进行通信。 ClusterIP 服务提供单一入口点并处理不同 pod 之间的负载平衡,在它们之间平均分配请求。

    您可以通过提供您的应用程序组件所在的 IP 地址和端口来访问您的 ClusterIP 服务。请注意,您可以为Service 定义一个不同的端口(在Service 定义中称为port),而不是您的应用程序使用的实际端口(在您的Service 定义中称为targetPort) )。虽然可以使用Service 地址访问Service,但与它内部暴露的pod 通信的所有组件都应该使用它的DNS 名称。如果所有应用程序组件都放在同一个命名空间中,那么它只是您创建的 Service 名称。如果某些组件位于不同的命名空间中,则需要使用完全限定的域名,以便它们可以跨命名空间进行通信。

    您的Service 定义文件可能如下所示:

    apiVersion: v1
    kind: Service
    metadata:
      name: angular-service
    spec:
      type: ClusterIP ### may be ommited as it is a default type
      selector:
        name: angular ### should match your labels defined for your angular pods
      ports:
      - protocol: TCP
        targetPort: 4200 ### port your angular app listens on
        port: 4200 ### port on which you want to expose it within your cluster
    
    apiVersion: v1
    kind: Service
    metadata:
      name: backend-service
    spec:
      type: ClusterIP ### may be ommited as it is a default type
      selector:
        name: backend ### should match your labels defined for your backend pods
      ports:
      - protocol: TCP
        targetPort: 5000 ### port your backend app listens on
        port: 5000 ### port on which you want to expose it within your cluster
    

    你可以在官方Kubernetesdocumentation987654322@找到这个话题的详细描述。


    NodePort 具有完全不同的功能。它可以用于例如在节点 IP 的特定端口上公开您的前端应用程序。请注意,如果您的 Kubernetes 集群由许多节点组成,并且您的前端 pod 放置在不同的节点上,那么为了访问您的应用程序,您需要使用 3 个不同的 IP 地址。在这种情况下,您需要一个额外的负载均衡器。如果您使用某些云平台解决方案,并且希望将应用程序的前端部分暴露给外部世界,那么服务类型LoadBalancer 是可行的方法(而不是使用NodePort)。

    【讨论】:

    • 感谢马里奥的详细解释!我稍微修改了我的服务文件,对于前端,我将节点类型更改为 NodePort,其余为默认 clusterIP。 pods 现在正在与 clusterIP 通信并且它工作了!
    • 很高兴能帮上忙。如果答案对您的问题有帮助和/或提供了解决方案,您可以考虑接受它和/或对其进行投票。作为社区的新成员,您可以熟悉这篇短文:stackoverflow.com/help/someone-answers
    • 我赞成您的解决方案!因为我是名声较低的新成员,所以投票被计算在内但不显示在这里!
    • 是的,你需要至少 15 点声望才能投票stackoverflow.com/help/privileges
    【解决方案2】:

    您可以为此实施入口规则,如下所示 -

    apiVersion: extensions/v1beta1
    kind: Ingress
    metadata:
      annotations:
        nginx.ingress.kubernetes.io/rewrite-target: /$1
        kubernetes.io/ingress.class: nginx
      name: ingress-rule
    spec:
      rules:
      - host: test.example.io
        http:
          paths:
          - path: /(.*)
            backend:
              serviceName: angular-service
              servicePort: port-number
          - path: /api/(.*)
            backend: 
              serviceName: backend-service
              servicePort: port-number
    

    在您的前端应用中,您可以将后端服务的 URL 添加为

    host/api/{your_uri}
    

    这将帮助你。 host代表入口规则文件中提到的DNS

    【讨论】:

    • 感谢图沙尔!让我试试。
    • 我假设你的 kubernetes 集群中安装了 nginx
    • 除了 ingress 还有什么办法吗?
    猜你喜欢
    • 1970-01-01
    • 2015-11-17
    • 2019-04-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多