首页 > 解决方案 > 我自己的 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 相同?非常感谢

标签: kubernetes

解决方案


云中 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 服务(EKSGKEAKS等),但您在裸机上使用 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


推荐阅读