如何使多个Pod在kubernetes上相互通信

时间:2019-11-11 08:56:26

标签: python mysql angular kubernetes deployment

我是Kubernetes的新手,我正尝试通过microk8s将应用程序部署到kubernetes。该应用程序包含python flask后端,Angular前端,redis和mysql数据库。我将映像部署在多个吊舱中,状态显示为“正在运行”,但吊舱彼此之间未通信。

然后将应用程序完全泊坞化,并在docker级别运行。 在部署到kubernetes之前,我的flask主机是docker-compose.yaml中的0.0.0.0,而mysql主机是“服务名”,但是目前我用kubernetes yml文件的服务名替换了它。

此外,在有角度的前端中,我已将要连接的URL从http://localhost:5000更改为http://backend-service,其中backend-service是backend-service.yml文件中给出的名称(dns)。但这也没有任何改变。有人可以告诉我如何使这些吊舱进行交流吗?

未连接其余的部署程序后,我只能访问前端。

列出角度的后端服务和部署文件。

 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

谢谢!

修改后的服务文件

2 个答案:

答案 0 :(得分:1)

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

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

您可以通过提供您的ClusterIP服务的IP地址和应用程序组件所在的端口来访问。请注意,您可以为ClusterIP侦听的端口(在port定义中称为Service)与应用程序使用的实际端口(称为{{1 }}中的Service定义)。尽管可以使用其targetPort地址访问Service,但是与在其内部公开的Pod通信的所有组件应使用其DNS名称。如果所有应用程序组件都放在同一个命名空间中,则只是您创建的Service名称。如果某些组件位于不同的命名空间中,则需要使用完全限定的域名,以便它们可以在命名空间之间进行通信。

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

Service

您可以在官方 Kubernetes documentation中找到有关此主题的详细说明。


Service具有完全不同的功能。例如可以使用将您的前端应用程序暴露在节点IP的特定端口上。请注意,如果您有由许多节点组成的Kubernetes集群,并且您的前端Pod放置在不同的节点上,则要访问您的应用程序,您需要使用3个不同的IP地址。在这种情况下,您需要一个额外的负载平衡器。如果您使用某种云平台解决方案,并且希望将应用程序的前端部分暴露给外部世界,则可以使用服务类型LoadBalancer(而不是使用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 )。

答案 1 :(得分:0)

您可以如下实现入口规则-

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}

这将帮助您。主机代表入口规则文件中提到的DNS