我是Kubernetes的超级初学者,我试图想象如何在不同的微服务中分割我的单片应用程序。 假设我在Flask中编写我的微服务应用程序,并且每个应用程序都暴露了一些端点,如:
微服务1:
微服务2:
微服务3:
如果所有这些都在单片应用程序中作为蓝图运行,则所有这些都将使用相同的IP作为前缀,即运行我的应用程序的主机服务器的IP,例如10.12.234.69。
现在,在Kubernetes的3个不同POD /节点上部署这3个“蓝图”将改变每个端点的IP地址,可能是10.12.234.69,而不是10.12.234.70或10.12.234.75
即使IP地址发生变化,我如何编写一个使URL引用保持不变的应用程序?
我知道这听起来非常明显,但我仍然无法找到这个简单问题的参考/例子。
提前致谢!
编辑:(作为simon回答的后续行动)
问题:
鉴于Ingress服务产生负载均衡器,并且可以从负载均衡器的IP(http://<ADDRESS>/v1/savings
)前缀的http /路径到达所有路由,我该怎么办?将IP关联到负载均衡器以匹配运行烧瓶Web服务器的pod的ip?
如果我将其他子路由添加到相同的路径,例如/v1/savings/get
和/v1/savings/get/id/<var_id>
,我应该更新入口http路径中的所有子路由,以便它们可以通过负载均衡器?
答案 0 :(得分:3)
如果要在单个IP和不同路径下从群集外部访问服务,可以使用负载均衡器和Kubernetes HTTP Ingresses。它们定义了应在哪个域和路径上映射服务,并且可以由负载均衡器获取以构建其配置。
基于您的微服务架构的示例:
---
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: user-accounts
spec:
template:
metadata:
labels:
app: user-accounts
spec:
containers:
- name: server
image: nginx
ports:
- containerPort: 80
args:
- /bin/bash
- "-c"
- echo 'server { location /v1/user-accounts { return 200 "user-accounts"; }}' > /etc/nginx/conf.d/default.conf && nginx -g 'daemon off;'
---
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: savings
spec:
template:
metadata:
labels:
app: savings
spec:
containers:
- name: server
image: nginx
ports:
- containerPort: 80
command:
- /bin/bash
- "-c"
- echo 'server { location /v1/savings { return 200 "savings"; }}' > /etc/nginx/conf.d/default.conf && nginx -g 'daemon off;'
---
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: auth
spec:
template:
metadata:
labels:
app: auth
spec:
containers:
- name: server
image: nginx
ports:
- containerPort: 80
command:
- /bin/bash
- "-c"
- echo 'server { location /v1/auth { return 200 "auth"; }}' > /etc/nginx/conf.d/default.conf && nginx -g 'daemon off;'
这些部署代表您的服务,只需通过/v1/name
下的HTTP返回其名称。
---
kind: Service
apiVersion: v1
metadata:
name: user-accounts
spec:
type: NodePort
selector:
app: user-accounts
ports:
- protocol: TCP
port: 80
---
kind: Service
apiVersion: v1
metadata:
name: savings
spec:
type: NodePort
selector:
app: savings
ports:
- protocol: TCP
port: 80
---
kind: Service
apiVersion: v1
metadata:
name: auth
spec:
type: NodePort
selector:
app: auth
ports:
- protocol: TCP
port: 80
这些服务创建一个内部IP和一个根据其名称解析它的域,将它们映射到给定选择器找到的pod。在同一群集命名空间中运行的应用程序将能够在user-accounts
,savings
和auth
下访问它们。
---
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: example
spec:
rules:
- http:
paths:
- path: /v1/user-accounts
backend:
serviceName: user-accounts
servicePort: 80
- path: /v1/savings
backend:
serviceName: savings
servicePort: 80
- path: /v1/auth
backend:
serviceName: auth
servicePort: 80
此Ingress定义了应在哪些路径上访问不同的服务。通过kubectl get ingress
验证您的Ingress:
# kubectl get ingress
NAME HOSTS ADDRESS PORTS AGE
example * 80 1m
如果您在Google容器引擎上运行,则有一个Ingress controller running in your cluster会在您创建新的Ingress对象时生成Google Cloud Load Balancer。在上面输出的ADDRESS
列下,会显示一个IP,您可以在其下访问您的应用程序:
# curl http://<ADDRESS>/v1/user-accounts
user-accounts⏎
# curl http://<ADDRESS>/v1/savings
savings⏎
# curl http://<ADDRESS>/v1/auth
auth⏎