我的环境:带有最新 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
function是 kubectl portforward
首先通过 AttachablePodForObjectFn
从选项中查找 pod 的地方:
AttachablePodForObjectFn
在 this interface 中定义为 attachablePodForObject
, 然后这里是 attachablePodForObject
function .
在我(没有经验的)Go 眼中,它出现了 attachablePodForObject
是 kubectl
用来从命令行上定义的服务查找 Pod 的东西。
然后从那里开始,所有事情都涉及填充特定的 Pod PortForwardOptions
(不包含服务)并传递给 kubernetes API。
关于kubernetes - kubectl port-forward 是否忽略 loadBalance 服务?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62776119/