kubernetes - kubectl port-forward 是否忽略 loadBalance 服务?

标签 kubernetes minikube

我的环境:带有最新 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它正确地生成东西。 - 一次部署 - 一项服务 - 三个 pod

部署:

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

pod :

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 之间轮换。我可以在返回的结果中看到,我已确保包含 pod 的主机名。

但是,当我尝试从我的托管 Mac 访问该服务时——使用 kubectl port-forward service/myproj-app-service 8000:8000 -- 每次我到达终点时,我都会得到相同的 pod 响应。它没有负载平衡。当我 kubectl logs -f <pod> 时,我可以清楚地看到这一点所有三个 pod,只有其中一个正在处理命中,因为其他两个处于空闲状态...

这是kubectl port-forward吗?限制或问题?还是我在这里遗漏了更重要的东西?

最佳答案

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

kubernetes API 只提供Pod port forward operations (创建GET)。服务端点不存在类似的 API 操作。

kubectl代码

这里有一些来自 kubectl 代码的流程似乎支持了这一点(我只是补充说 Go 不是我的主要语言)

portforward.go Complete functionkubectl portforward 首先通过 AttachablePodForObjectFn 从选项中查找 pod 的地方:

AttachablePodForObjectFnthis interface 中定义为 attachablePodForObject , 然后这里是 attachablePodForObject function .

在我(没有经验的)Go 眼中,它出现了 attachablePodForObjectkubectl 用来从命令行上定义的服务查找 Pod 的东西。

然后从那里开始,所有事情都涉及填充特定的 Pod PortForwardOptions (不包含服务)并传递给 kubernetes API。

关于kubernetes - kubectl port-forward 是否忽略 loadBalance 服务?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62776119/

相关文章:

kubernetes - 在Kubernetes中使用Heapster的Web API

docker - 来自服务器的错误(未找到):找不到deployments.extensions “keras-app”

docker - 来自守护进程的错误响应 : Get https://registry-1. docker.io/v2/: dial tcp: lookup registry-1. docker.io...i/o timeout

kubernetes - 为什么我无法使用 minikube IP 访问我的 Kubernetes 集群?

kubernetes - Minikube 在创建容器时卡住了

windows - 无法在 Windows 10 上使用 Hyper-V 启动 minikube

kubernetes - 使用 fabric8io 时如何指定 kubeconfig 文件位置?

Kubernetes nginx ingress 0.22 不尊重 cookie 亲和性注释?

kubernetes - 在裸机上使用 Kubernetes 1.6 安装插件的说明?

zsh - 当 Mac 上的 minikube 被要求提供 URL 时,为什么它会在隧道中启动服务?