当前位置: 首页 > 知识库问答 >
问题:

为什么Kubernetes尝试为服务类型ClusterIP创建负载平衡器?

钦海荣
2023-03-14

我正在使用入口从库伯内特斯集群外部公开我的服务,因此我不需要库伯内特斯来配置负载均衡器。因此,我创建了一个ClusterIP服务:

apiVersion: v1
kind: Service
metadata:
  name: myapp
  namespace: default
spec:
  ports:
  - port: 80
    targetPort: 8080
  selector:
    app: myapp
  type: ClusterIP

这很有效-我有一个单独的入口和部署设置,我可以很好地访问该应用程序

然而,Kubernetes坚持无论如何都要尝试创建负载平衡器。因为它在我的AWS帐户中没有这样做的权限,所以我创建的每个服务都会记录如下错误:

FirstSeen   LastSeen    Count   From            SubObjectPath   Type        Reason              Message
  --------- --------    -----   ----            -------------   --------    ------              -------
  22s       22s     1   service-controller          Warning     CreatingLoadBalancerFailed  Error creating load balancer (will retry): Error getting LB for service default/myapp: AccessDenied: User: -redacted- is not authorized to perform: elasticloadbalancing:DescribeLoadBalancers with an explicit deny
        status code: 403, request id: -redacted-

我假设它试图描述BeloadBalancers,因为它打算创建一个。这些文档声称,仅当您指定服务类型“LoadBalancer”时,才应创建LoadBalancer。我怎样才能阻止库伯内特斯去尝试呢?

共有1个答案

柴亦
2023-03-14

它没有尝试创建一个。您正在接收来自service_controller.go:287的错误消息:

func (s *ServiceController) createLoadBalancerIfNeeded(key string, service *v1.Service) (error, bool) {
    [...]
    if !wantsLoadBalancer(service) {
        _, exists, err := s.balancer.GetLoadBalancer(s.clusterName, service)
        if err != nil {
            return fmt.Errorf("Error getting LB for service %s: %v", key, err), retryable
        }
        [...]

反过来,GetLoadBalancer正在调用云提供程序进行描述(检查是否存在)。我建议您为这个特定操作授权aws服务号。

 类似资料:
  • 当我将服务与ClusterIP类型和2个POD一起使用时,流量分布在2个POD上。 我找到了另一种服务类型LoadBalancer。这两种服务的区别是什么?LoadBalancer与ClusterIP有何不同? 谢谢

  • 试图自学如何使用库伯内特斯,但有一些问题。 我的下一步是尝试使用LoadBalancer类型的服务来访问nginx。 我建立了一个新的集群并部署了nginx映像。 然后,我为LoadBalancer设置服务 设置完成后,我尝试使用LoadBalancer入口(我在描述LoadBalancer服务时发现)访问nginx。我收到一个此页面无法工作的错误。 不太确定我哪里出错了。 kubectl获得sv

  • 在Kubernetes中创建负载平衡器类型的服务时,它是创建一个全新的外部负载平衡器,还是只为负载平衡器类型的第一个服务创建一个负载平衡器,并将该负载平衡器重新用于负载平衡器类型的所有后续服务? 这个问题特别重要,因为为每个服务构建一个单独的负载平衡器对我来说成本太高。 如果它特定于云提供商,我使用Azure,但我很想知道其他云提供商是否不同。

  • Kubernetes如何知道其上运行的外部云提供商? 是否有任何特定的服务在Master中运行,以确定Kubernetes集群是否在AWS或Google云中运行? 即使它能够找出它是AWS或Google,它从哪里获取凭据来创建外部AWS/Google负载均衡器?我们是否必须在某个地方配置凭据,以便它从那里选择它并创建外部负载均衡器?

  • 我使用的是Kubernetes服务,但我对服务中的外部IP的参数有点困惑: 如果有路由到一个或多个群集节点的外部IP,则可以在这些外部IP上公开Kubernetes服务。通过服务端口上的外部IP(作为目标IP)进入集群的流量将路由到其中一个服务endpoint。外部IP不由Kubernetes管理,由集群管理员负责。 我不确定负载均衡器类型服务和使用外部IP的服务之间的区别。 我可以使用负载平衡器

  • 我发现k8s在生产中的一些用法,这些用法与公共云一起使用,将负载均衡器类型的服务放在Nginx入口之前。(您可以从下面的yaml中找到一个示例。) 如我所知,入口可用于向公众公开内部服务,那么在入口前面放置负载均衡器有什么意义呢?我可以删除该服务吗?