gpt4 book ai didi

kubernetes - kubectl port-forward 会忽略 loadBalance 服务吗?

转载 作者:行者123 更新时间:2023-12-02 11:36:46 24 4
gpt4 key购买 nike

我的环境:带有最新 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

有趣的是,当我 SSHMinikube ,然后使用 curl 10.96.91.44:8000 访问服务它尊重 LoadBalancer服务类型并在我一次又一次地访问端点时在所有三个 pod 之间轮换。我可以在返回的结果中看到,我已确保包含 pod 的 HOSTNAME。

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

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

最佳答案

kubernetes API 仅提供 Pod port forward operations ( CREATEGET )。服务端点不存在类似的 API 操作。

所以我会说 kubectl从命令行提供的服务信息中查找 Pod 并直接转发到 Pod,而不是转发到 ClusterIP/Service 端口,并允许集群像常规服务流量一样对服务进行负载均衡。
kubectl代码

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

portforward.go Complete function在哪里kubectl portforward首先通过 AttachablePodForObjectFn 从选项中查找 pod :
AttachablePodForObjectFn定义为 attachablePodForObjectthis interface ,那么这里是 attachablePodForObject function .

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

然后从那里开始,一切都涉及填充特定于 Pod 的 PortForwardOptions (不包括服务)并传递给 kubernetes API。

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

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com