我正在尝试找出实现以下目标的方法。
- 我有几个组件进行了多次部署,它们共同构成了我的应用程序。为简单起见,我们假设有一个前端、一个后端和一个数据库。
- 当我部署所有组件(每个组件 1 个 pod)并将前端发布到外部 IP 后面时,我可以访问该应用程序。内部网络连接如下。
Frontend 1 -> Backend 1 -> Database 1
- 我对扩展的要求是,当我创建部署的第二个副本时,我希望访问完全独立的(与第一个部署)场景,例如
Frontend 2 -> Backend 2 -> Database 2
。用例是支持对数据库中的不同数据进行多个并行测试。例如,如果Test A
正在进行并且Test B
是必需的,我们会启动应用程序并开始对其进行独立测试。
我怎样才能做到这一点?
根据我到目前为止的尝试,将前端暴露给外部 IP 的负载平衡器服务将以相同的方式平衡它们所连接的后端和数据库的流量Frontend 1
。Frontend 2
我也可以将所有容器作为单个部署添加到单个 pod 中,这样后端和数据库就通过本地主机连接与其他部署分离,但我所连接的前端仍然不符合预期。
我可以在负载均衡器服务中设置 1-1 映射吗?我是否遗漏了某些关键信息?
答案1
负载均衡器并非旨在平衡不同 之间的流量,而是平衡一个 内的Deployments
集合之间的流量。如果每个 中只有一个,则实际上没有什么可平衡的。如果您的包含 3 个,则请注意将您的流量均匀地分配给这 3 个。据我了解,您的和是两个独立的部署,并且您希望能够灵活地切换流量,不仅是部分流量,而是和之间的全部流量,对吗?Pods
Deployment
Pod
Frontend1
Deployment
Pods
Loadbalancer
Pods
Frontend1
Frontend2
Frontend1
Frontend2
它可以很容易地完成,但是更好的方法是使用两个单独的LoadBalancers
forFrontend1
和Frontend2
Deployments
。假设您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
选择器,这意味着它仅选择Pods
具有已定义值的app
标签nginx-prod
。要将您的流量切换到nginx-dev
属于您的 Pod,Frontend2
Deployment
您只需通过更改nginx-prod
为nginx-dev
并使用以下命令应用新配置来更新此文件:
kubectl apply -f lb.yaml
您的外部流量将立即定向到Pods
由您管理的Frontend2
Deployment
。您可以使用以下两个 yaml 清单轻松测试它:
部署 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: {}
部署 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
服务(ClusterIP
可以在Service
定义中省略,因为它是默认类型)如下所示:
apiVersion: v1
kind: Service
metadata:
name: my-service
spec:
selector:
app: prod-backend
ports:
- protocol: TCP
port: 80
targetPort: 80
请注意,它具有app: prod-backend
选择器。想象一下,dev
由 管理的一组 PodBackend2
Deployment
具有不同的此标签值。例如,它可以是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
。如果有什么不完全清楚的地方,请随时联系我们并询问其他问题。