我正试图找出实现以下目标的方法。
Frontend 1 -> Backend 1 -> Database 1Frontend 2 -> Backend 2 -> Database 2。用例支持对数据库中不同数据的多个并行测试。例如,如果Test A正在进行,并且需要Test B,那么我们将对应用程序进行拆分,并开始对其进行独立的测试。我怎样才能做到这一点?
使用我到目前为止尝试过的内容,将前端暴露给外部IP的负载平衡器服务将平衡到Frontend 1或Frontend 2的流量,以及它们连接到的后端和数据库的相同方式。我也可以将所有容器作为单个部署添加到单个容器中,这样后端和数据库就可以通过本地主机连接与其他部署分离,但我连接到的前端仍然不能满足需要。
我可以在负载均衡器服务中设置一个1-1映射吗?我是不是漏掉了什么关键的东西?
发布于 2020-06-05 16:55:54
负载均衡器不是为了平衡不同Deployments之间的流量,而是在一个Deployment中的一组Pods之间平衡通信量。如果每个Pod中只有一个,那么实际上没有什么需要平衡的。如果您的Frontend1 Deployment包括3 Pods,那么Loadbalancer要注意在这3 Pods中平均分配您的流量。据我所知,您的Frontend1和Frontend2是两个独立的部署,您希望能够灵活地切换您的流量,而不仅仅是其中的一部分,而是Frontend1和Frontend2之间的整个流量,对吗?
可以很容易地做到这一点,但是更好的方法是为Frontend1和Frontend2 Deployments使用两个单独的D15D16。假设您在LoadBalancer文件中定义了一个外部lb.yaml:
apiVersion: v1
kind: Service
metadata:
name: example-loadbalancer-service
spec:
selector:
app: nginx-prod
ports:
- port: 80
targetPort: 80
type: LoadBalancer如您所见,它使用app: nginx-prod选择器,这意味着它只选择具有定义了nginx-prod值的app标签的Pods。要将流量切换到作为nginx-dev Deployment一部分的nginx-prod Pods,只需通过将D27更改为nginx-dev并使用以下命令应用新配置来更新该文件:
kubectl apply -f lb.yaml您的外部流量将立即被定向到由您的Pods Deployment管理的Frontend2。您可以使用以下两个yaml清单轻松地测试它:
Deployment 1 (可以是您的Frontend1):
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment-prod
labels:
app: nginx
spec:
replicas: 3
selector:
matchLabels:
app: nginx-prod
template:
metadata:
labels:
app: nginx-prod
spec:
containers:
- name: nginx
image: nginx:1.14.2
ports:
- containerPort: 80
volumeMounts:
- name: workdir
mountPath: /usr/share/nginx/html
initContainers:
- name: install
image: busybox
command: ["/bin/sh","-c"]
args: ["echo Welcome on Prod! > /work-dir/index.html"]
volumeMounts:
- name: workdir
mountPath: "/work-dir"
volumes:
- name: workdir
emptyDir: {}Deployment 2 (可以是您的Frontend2):
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment-dev
labels:
app: nginx
spec:
replicas: 3
selector:
matchLabels:
app: nginx-dev
template:
metadata:
labels:
app: nginx-dev
spec:
containers:
- name: nginx
image: nginx:1.14.2
ports:
- containerPort: 80
volumeMounts:
- name: workdir
mountPath: /usr/share/nginx/html
initContainers:
- name: install
image: busybox
command: ["/bin/sh","-c"]
args: ["echo Welcome on Dev! > /work-dir/index.html"]
volumeMounts:
- name: workdir
mountPath: "/work-dir"
volumes:
- name: workdir
emptyDir: {}在平衡来自前端Pods到后端Pods的请求时,可以采用非常类似的方式,但您不需要使用该LoadBalancer,但需要简单的ClusterIP服务(在Service定义中可以省略ClusterIP,因为它是默认类型),如下所示:
apiVersion: v1
kind: Service
metadata:
name: my-service
spec:
selector:
app: prod-backend
ports:
- protocol: TCP
port: 80
targetPort: 80注意,它有app: prod-backend选择器。假设您的dev Backend2 Deployment管理的Pods集具有此标签的不同价值。它可以是例如dev-backend。一旦您将Service中的选择器从app: prod-backend更改为app: dev-backend,您从前端Pods到Backend1的所有流量都将被重定向到Backend2 Pods (标记为dev-backend)。我分享它只是为了告诉你,这也是可能的,但这种方法没有任何意义。至于LoadBalancer,我同意创建额外的LoadBalancer需要额外的成本,但是简单的ClusterIP Services并不是这样。因此,在这种情况下,您应该定义两个不同的Services,每个都使用不同的选择器。然后,使用服务的FQDN,这将与Backend1和Backend2 Service不同,您可以相应地从Frontend1和Frontend2指导您的流量。
我希望这能进一步澄清LoadBalancer和ClusterIP Service的使用。如果有些事情不完全清楚,可以毫不犹豫地伸出援手,提出更多的问题。
https://serverfault.com/questions/1020146
复制相似问题