kubernetes - 我自己的 kubernetes 运行不会从官方文档中产生相同的结果
问题描述
我最近一直在使用 Kubernetes,遇到了负载均衡器这个话题。我一直在关注这个文档:https ://kubernetes.io/docs/tasks/access-application-cluster/create-external-load-balancer/
我的问题是:
我从 yaml 文件开始遵循完全相同的步骤:
apiVersion: v1
kind: Service
metadata:
name: example-service
spec:
selector:
app: example
ports:
- port: 8765
targetPort: 9376
type: LoadBalancer
官方文档说结果是如果我做kubectl describe services example-service:
Name: example-service
Namespace: default
Labels: <none>
Annotations: <none>
Selector: app=example
Type: LoadBalancer
IP: 10.67.252.103
LoadBalancer Ingress: 192.0.2.89
Port: <unnamed> 80/TCP
NodePort: <unnamed> 32445/TCP
Endpoints: 10.64.0.4:80,10.64.1.5:80,10.64.2.4:80
Session Affinity: None
Events: <none>
但是,我的没有“LoadBalancer Ingress”:
Name: example-service
Namespace: default
Labels: <none>
Annotations: <none>
Selector: app=example
Type: LoadBalancer
IP Families: <none>
IP: 10.1xx.1xx.1x
IPs: 10.1xx.1xx.1x
Port: <unset> 8765/TCP
TargetPort: 9376/TCP
NodePort: <unset> 30956/TCP
Endpoints: <none>
Session Affinity: None
External Traffic Policy: Cluster
Events: <none>
我想知道这是为什么?IP 是否与 LoadBalancer Ingress 相同?非常感谢
解决方案
云中 LoadBalancer 类型的 Kubernetes 服务
你想创建一个Kubernetes 服务类型LoadBalancer
。
正如我们在Kubernetes LoadBalancer 文档中看到的:
在支持外部负载均衡器的云提供商上,将 type 字段设置为 LoadBalancer 会为您的服务提供负载均衡器。
例如,当我们使用Google Kubernetes Engine (GKE) 时:
当您创建 LoadBalancer 类型的服务时,Google Cloud 控制器会唤醒并配置网络负载平衡器。
这是我的 GKE 集群中的一个示例:
注意:正如您在本Events
节中看到的,LoadBalancer
它是由 Google Cloud 自动提供的。
$ kubectl describe services example-service
Name: example-service
Namespace: default
Labels: <none>
Selector: app=example
Type: LoadBalancer
IP Families: <none>
IP: 10.0.1.66
IPs: <none>
LoadBalancer Ingress: <MY_PUBLIC_IP>
Port: <unset> 8765/TCP
TargetPort: 9376/TCP
NodePort: <unset> 31158/TCP
Endpoints: <none>
Session Affinity: None
External Traffic Policy: Cluster
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal EnsuringLoadBalancer 30m service-controller Ensuring load balancer
Normal EnsuredLoadBalancer 29m service-controller Ensured load balancer
裸机上 LoadBalancer 类型的 Kubernetes 服务
我从您的评论中得出结论,您没有使用任何托管 Kubernetes 服务(EKS、GKE、AKS等),但您在裸机上使用 Kubernetes。
通常,如果您尝试在不在云提供商上运行的集群中创建类型为“LoadBalancer”的 Kubernetes 服务,LoadBalancers
将无限期地保持在“待处理”状态。
这是我的裸机集群中的一个示例(example-service
Service
处于“待处理”状态 23 分钟):
$ kubectl get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
example-service LoadBalancer 10.106.205.85 <pending> 8765:31091/TCP 23m
注意:与您的示例一样,我也没有LoadBalancer Ingress
条目:
$ kubectl describe svc example-service
Name: example-service
Namespace: default
Labels: <none>
Selector: app=example
Type: LoadBalancer
IP: 10.106.205.85
Port: <unset> 8765/TCP
TargetPort: 9376/TCP
NodePort: <unset> 31091/TCP
Endpoints: <none>
Session Affinity: None
External Traffic Policy: Cluster
Events: <none>
裸机上的 Kubernetes 需要一个负载均衡器实现,例如MetalLB来提供此功能。
注意:通常,MetalLB
与云提供商不兼容:
MetalLB 用于裸机集群,即使是提供“专用服务器”的云提供商通常也不支持 MetalLB 所需的网络协议。
我创建了一个示例来说明如何LoadBalancer
使用MetalLB
.
首先,我按照MetalLB 安装文档MetalLB
中的描述应用清单进行安装。
然后,我创建了config
ConfigMap
它可以MetalLB
控制特定的 IP 范围(请参阅第 2 层配置 MetalLB 文档):
$ cat config-cm.yml
apiVersion: v1
kind: ConfigMap
metadata:
namespace: metallb-system
name: config
data:
config: |
address-pools:
- name: default
protocol: layer2
addresses:
- 192.168.11.200-192.168.11.210
$ kubectl apply -f config-cm.yml
configmap/config created
最后,我创建了example-service
LoadBalancer
服务并检查了它是否按预期工作:
$ kubectl apply -f example-service.yml
service/example-service created
$ kubectl get svc example-service
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
example-service LoadBalancer 10.103.71.220 192.168.11.200 8765:32001/TCP 8s
$ kubectl describe svc example-service
Name: example-service
Namespace: default
Labels: <none>
Annotations: <none>
Selector: app=example
Type: LoadBalancer
IP: 10.103.71.220
LoadBalancer Ingress: 192.168.11.200
Port: <unset> 8765/TCP
TargetPort: 9376/TCP
NodePort: <unset> 32001/TCP
Endpoints: <none>
Session Affinity: None
External Traffic Policy: Cluster
Events: <none>
如您所见,example-service
服务具有LoadBalancer Ingress
带有地址的条目192.168.11.200
。
推荐阅读
- node.js - 逐行从aws s3读取一组lage txt文件
- cucumber - 我们可以使用正则表达式来提及黄瓜选项功能文件吗?
- ruby-on-rails - rails 测试不允许断言处理 before_action
- reactjs - 我不想在选择标签中设置第一个选项的状态如何做到这一点任何人都可以帮助我
- eclipse - Eclipse 控制台错误(中文输出)如何修复?
- babeljs - 如何在生产构建中使用 Babel 删除 Web API 性能时间线调用
- ghost-blog - 运行“幽灵启动”时出错
- html - XSLT 通用解决方案,用于从 XML 中获取分层 html 表
- scala - scala中的理解半并行调用
- javascript - 使用 puppeteer 打印 PDF 时,如何获取打印元素的页面?