对 Kubernetes 中的扩展部署进行独立测试

对 Kubernetes 中的扩展部署进行独立测试

我正在尝试找出实现以下目标的方法。

  1. 我有几个组件进行了多次部署,它们共同构成了我的应用程序。为简单起见,我们假设有一个前端、一个后端和一个数据库。
  2. 当我部署所有组件(每个组件 1 个 pod)并将前端发布到外部 IP 后面时,我可以访问该应用程序。内部网络连接如下。Frontend 1 -> Backend 1 -> Database 1
  3. 我对扩展的要求是,当我创建部署的第二个副本时,我希望访问完全独立的(与第一个部署)场景,例如Frontend 2 -> Backend 2 -> Database 2。用例是支持对数据库中的不同数据进行多个并行测试。例如,如果Test A正在进行并且Test B是必需的,我们会启动应用程序并开始对其进行独立测试。

我怎样才能做到这一点?

根据我到目前为止的尝试,将前端暴露给外部 IP 的负载平衡器服务将以相同的方式平衡它们所连接的后端和数据库的流量Frontend 1Frontend 2我也可以将所有容器作为单个部署添加到单个 pod 中,这样后端和数据库就通过本地主机连接与其他部署分离,但我所连接的前端仍然不符合预期。

我可以在负载均衡器服务中设置 1-1 映射吗?我是否遗漏了某些关键信息?

答案1

负载均衡器并非旨在平衡不同 之间的流量,而是平衡一个 内的Deployments集合之间的流量。如果每个 中只有一个,则实际上没有什么可平衡的。如果您的包含 3 个,则请注意将您的流量均匀地分配给这 3 个。据我了解,您的和是两个独立的部署,并且您希望能够灵活地切换流量,不仅是部分流量,而是和之间的全部流量,对吗?PodsDeploymentPodFrontend1 DeploymentPodsLoadbalancerPodsFrontend1Frontend2Frontend1Frontend2

它可以很容易地完成,但是更好的方法是使用两个单独的LoadBalancersforFrontend1Frontend2 Deployments。假设您LoadBalancerlb.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-prodnginx-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。一旦您将从 中的选择器更改Serviceapp: prod-backendapp: dev-backend从您的前端到 的所有流量都PodsBackend1被重定向到您的Backend2 Pods(标记为dev-backend)。我分享它只是为了向您展示这也是可能的,但这种方法没有任何意义。至于LoadBalancer,我同意创建额外的LoadBalancer涉及额外的成本,但简单的 并非如此ClusterIP Services。所以在这种情况下你应该定义两个不同的Services,每个 都使用不同的选择器。然后使用服务的 FQDN,它将不同于Backend1Backend2 Service您可以相应地从Frontend1和引导您的流量Frontend2

LoadBalancer我希望这能更清楚地说明和的用法ClusterIP Service。如果有什么不完全清楚的地方,请随时联系我们并询问其他问题。

相关内容