我是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
谢谢!
(修改后的服务文件)
答案 0 :(得分:1)
对于 Kubernetes 中不同微服务之间的内部通信,应使用类型为ClusterIP的Service
。实际上,它是默认类型,因此即使您未在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