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:
希望对您有所帮助!
我在 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:
希望对您有所帮助!