Kubernetes LoadBalancer 服务不负载平衡请求

Kubernetes LoadBalancer Service not loadbalancing requests

我在 minikube 集群中有一个简单的微服务设置 运行。它的灵感来自 this example. 我的设置包括一个简单的 router 微服务,其中包含一个 golang 网络服务器。我现在要测试的是多于一个 pod 时的负载均衡。但是似乎没有任何负载平衡。

微服务的 kubernetes 文件如下所示:

apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: router
  labels:
    app: router
    tier: router
spec:
  replicas: 2
  strategy: {}
  template:
    metadata:
      labels:
        app: router
        tier: router
    spec:
      containers:
      - image: {myregistry}/router
        name: router
        resources: {}
        ports:
          - name: target-port
            containerPort: 8082
        env:
          - name: PORT
            value: "8082"
status: {}
---
apiVersion: v1
kind: Service
metadata:
  name: router
  labels:
    app: router
    tier: router
spec:
  type: LoadBalancer
  selector:
    app: router
    tier: router
  ports:
  - port: 8082
    name: http
    targetPort: target-port

skaffold 配置如下所示:

apiVersion: skaffold/v1beta2
kind: Config
build:
  artifacts:
  - image: {myregistry}/router
    context: src/router/bin
  tagPolicy:
    gitCommit: {}
  local:
    push: false
deploy:
  kubectl:
    manifests:
    - ./kubernetes/**.yaml

Kubernetes 正确部署了两个 pods。 kubectl get pods 的输出如下所示:

NAME                           READY   STATUS    RESTARTS   AGE
router-7f75f6f9df-c8mgp        1/1     Running   0          14m
router-7f75f6f9df-k248m        1/1     Running   0          14m

skaffold dev 日志输出我可以看到每个请求都被路由到 router-7f75f6f9df-c8mgp pod。即使使用不同的浏览器,所有请求最终都会出现在完全相同的 pod 中。

当我删除这个 pod 时,即使有另一个 pod 运行。

路由器微服务甚至会出现轻微的停机时间

这种行为可能有什么问题?

minikube 'properly' 不支持 LoadBalancer 服务类型。过去通常只使用 NodePort 或 externalIP 服务类型,但是官方 hello-minikube 示例现在指出:

On cloud providers that support load balancers, an external IP address would be provisioned to access the Service. On Minikube, the LoadBalancer type makes the Service accessible through the minikube service command

如此有效,您应该能够使用您的 minikube LoadBalancer 服务:minikube service router

然而,有一个名为 metallb 的裸机 kubernetes 集群开发的巧妙解决方案,可以帮助您在 minikube 上以更好的方式进行测试。

您可以在minikube上安装和配置它。例如

kubectl apply -f https://raw.githubusercontent.com/google/metallb/v0.8.1/manifests/metallb.yaml

以下是一些博客文章,其中其他人解释了 metallb 与 minikube 的设置和使用以支持 LoadBalancer:

Blog Post 1 Blog Post 2

这是official docs.

希望对您有所帮助!