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

然后应用程序完全 dockerized 并在 docker 级别运行。
在部署到 kubernetes 之前,我的 flask 主机是 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

提前致谢!

( 修改的服务文件 )

最佳答案

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

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

您可以通过提供应用程序组件公开的 IP 地址和端口来访问您的 ClusterIP 服务。请注意,您可以为 port 定义一个不同的端口(在 Service 定义中称为 Service),而不是应用程序使用的实际端口(在 targetPort 定义中称为 Service)。尽管可以使用 Service 地址访问 ClusterIP,但与 内部公开的 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

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

关于python - 如何让多个 Pod 在 Kubernetes 上相互通信,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/58798201/

10-15 21:56