【发布时间】: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 <pod> 到所有三个 pod 时,只有一个在处理命中,因为另外两个处于空闲状态......
这是kubectl port-forward 限制还是问题?还是我在这里错过了更大的东西?
【问题讨论】:
-
请注意,当您
curl使用 ClusterIP 时,LoadBalancer在这里没有做任何事情。 Service 本身会做 TCP 级别的,Pod 之间的新连接共享。这是在集群中的每个节点上单独管理的。
标签: kubernetes minikube