【问题标题】:Does kubectl port-forward ignore loadBalance services?kubectl port-forward 会忽略 loadBalance 服务吗?
【发布时间】:2020-05-13 09:37:36
【问题描述】:

我的环境:带有最新 Minikube/Docker 的 Mac 开发机器

我用一个简单的 Django REST API“hello world”(在本地)构建了一个简单的 docker 映像。我正在运行一个包含 3 个副本的部署。这是我用于定义它的yaml 文件:

apiVersion: v1
kind: Service
metadata:
  name: myproj-app-service
  labels:
    app: myproj-be
spec:
  type: LoadBalancer
  ports:
    - port: 8000
  selector:
    app: myproj-be
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: myproj-app-deployment
  labels:
    app: myproj-be
spec:
  replicas: 3
  selector:
    matchLabels:
      app: myproj-be
  template:
    metadata:
      labels:
        app: myproj-be
    spec:
      containers:
        - name: myproj-app-server
          image: myproj-app-server:4
          ports:
            - containerPort: 8000
          env:
            - name: DATABASE_URL
              value: postgres://myname:@10.0.2.2:5432/myproj2
            - name: REDIS_URL
              value: redis://10.0.2.2:6379/1

当我应用这个yaml 时,它会正确生成东西。 - 一次部署 - 一项服务 - 三个豆荚

部署:

NAME                  READY   UP-TO-DATE   AVAILABLE   AGE
myproj-app-deployment   3/3     3            3           79m

服务:

NAME               TYPE           CLUSTER-IP    EXTERNAL-IP   PORT(S)          AGE
kubernetes         ClusterIP      10.96.0.1     <none>        443/TCP          83m
myproj-app-service   LoadBalancer   10.96.91.44   <pending>     8000:31559/TCP   79m

豆荚:

NAME                                   READY   STATUS    RESTARTS   AGE
myproj-app-deployment-77664b5557-97wkx   1/1     Running   0          48m
myproj-app-deployment-77664b5557-ks7kf   1/1     Running   0          49m
myproj-app-deployment-77664b5557-v9889   1/1     Running   0          49m

有趣的是,当我 SSH 进入 Minikube 并使用 curl 10.96.91.44:8000 访问服务时,它尊重服务的 LoadBalancer 类型,并在我访问端点时间和再次。我可以在返回的结果中看到,我确保包含 pod 的 HOSTNAME。

但是,当我尝试从我的 Hosting Mac 访问服务时——使用kubectl port-forward service/myproj-app-service 8000:8000——每次我点击端点时,我都会得到相同的 pod 来响应。它没有负载平衡。我可以清楚地看到,当我 kubectl logs -f &lt;pod&gt; 到所有三个 pod 时,只有一个在处理命中,因为另外两个处于空闲状态......

这是kubectl port-forward 限制还是问题?还是我在这里错过了更大的东西?

【问题讨论】:

  • 请注意,当您 curl 使用 ClusterIP 时,LoadBalancer 在这里没有做任何事情。 Service 本身会做 TCP 级别的,Pod 之间的新连接共享。这是在集群中的每个节点上单独管理的。

标签: kubernetes minikube


【解决方案1】:

kubectl从命令行提供的Service信息中查找第一个Pod,直接转发到某个Pod,而不是转发到ClusterIP/Service端口。集群没有机会像常规服务流量那样对服务进行负载平衡。

kubernetes API 只提供Pod port forward operationsCREATEGET)。服务端点不存在类似的 API 操作。

kubectl代码

下面是来自kubectl 代码的一些流程,似乎可以支持这一点(我只是补充一点,Go 不是我的主要语言)

portforward.go Complete functionkubectl portforward 第一次通过 AttachablePodForObjectFn 从选项中查找 pod:

AttachablePodForObjectFnthis interface中定义为attachablePodForObject,那么这里是attachablePodForObject function

在我(没有经验的)Go 眼中,attachablePodForObject 似乎是 kubectl 用来从命令行上定义的服务中查找 Pod 的东西。

然后从那里开始处理填写 Pod 特定的 PortForwardOptions(不包括服务)并传递给 kubernetes API。

【讨论】:

  • 看起来你也可能总是转发到first active pod,即使你再次尝试附加。
【解决方案2】:

原因是我的 pod 由于 Python *.pyc 文件留在容器中而随机处于崩溃状态。当 Django 在多 pod Kubernetes 部署中运行时,这会导致问题。一旦我删除了这个问题并且所有 pod 都成功运行,循环开始工作。

【讨论】:

  • 我现在也有同样的问题。但是我使用了 springboot 并且没有 pod 崩溃?
  • 与@huy 相同的问题
猜你喜欢
  • 1970-01-01
  • 2021-11-21
  • 2023-03-12
  • 1970-01-01
  • 2021-06-02
  • 2019-07-22
  • 2022-06-11
  • 2019-01-06
相关资源
最近更新 更多