【问题标题】:azure AKS internal load balancer not responding requests天蓝色 AKS 内部负载均衡器未响应请求
【发布时间】:2022-11-01 11:24:02
【问题描述】:

我有一个 AKS 群集,以及一个单独的 VM。 AKS 群集和 VM 位于同一 VNET(以及子网)中。

我使用以下 yaml 部署了一个回显服务器,我可以使用来自 VM 的 vnet ip 直接卷曲 pod。但是当尝试使用负载均衡器时,没有任何回报。真的不确定我错过了什么。任何帮助表示赞赏。

apiVersion: v1
kind: Service
metadata:
  name: echo-server
  annotations:
    service.beta.kubernetes.io/azure-load-balancer-internal: "true"
spec:
  type: LoadBalancer
  ports:
  - port: 80
    protocol: TCP
    targetPort: 8080
  selector:
    app: echo-server

---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: echo-deployment
spec:
  replicas: 1
  selector:
    matchLabels:
      app: echo-server
  template:
    metadata:
      labels:
        app: echo-server
    spec:
      containers:
        - name: echo-server
          image: ealen/echo-server
          ports:
            - name: http
              containerPort: 8080

以下图片展示了情况

我期望当从负载均衡器卷曲 vnet ip 时,会收到与我直接卷曲 pod ip 相同的响应

【问题讨论】:

    标签: kubernetes load-balancing azure-aks


    【解决方案1】:

    您是否检查过 pod 的 IP 是否正确映射为服务的端点?你可以检查它使用,

    k describe svc echo-server -n test | grep Endpoints

    如果不是,请使用您的实际部署检查标签和选择器(而不是描述中的资源)。

    如果它被正确映射,你确定你正在使用的虚拟机(_@tester) 是否在正确的子网下,该子网也应包括 iLB IP;10.240.0.226?

    【讨论】:

    • 嗨,萨汉,谢谢你的回答。 1. 我可以确认服务正确映射到 pod 的 IP。 2. VM 和 AKS 在同一个子网中,因为此 vnet (10.240.0.0/16) 下只有一个子网。
    【解决方案2】:

    找到解决方案,我唯一需要做的就是在服务声明中添加以下内容:

    externalTrafficPolicy: 'Local'
    

    完整的yaml如下

    apiVersion: v1
    kind: Service
    metadata:
      name: echo-server
      annotations:
        service.beta.kubernetes.io/azure-load-balancer-internal: "true"
    spec:
      type: LoadBalancer
      externalTrafficPolicy: 'Local'
      ports:
      - port: 80
        protocol: TCP
        targetPort: 80
      selector:
        app: echo-server
    

    以前它被设置为“集群”。


    刚刚获得 azure 支持,这似乎是一个特定的错误(它发生在较新版本的 AKS 中),在此处发布相关链接:https://github.com/kubernetes/ingress-nginx/issues/8501

    【讨论】:

      【解决方案3】:

      你能检查你的内部负载均衡器健康探测吗?

      “对于 Kubernetes 1.24+,带有 appProtocol HTTP/HTTPS 的 LoadBalancer 类型的服务将切换为使用 HTTP/HTTPS 作为健康探测协议(而在 v1.24.0 之前它使用 TCP)。并且 / 将用作默认的健康探测请求路径。如果您的服务对 / 没有响应 200,请确保您正在设置服务注释 service.beta.kubernetes.io/port_{port}_health-probe_request-path 或 service.beta.kubernetes.io/azure-load-具有正确请求路径的 balancer-health-probe-request-path(适用于所有端口)以避免服务中断。” (参考:https://github.com/Azure/AKS/releases/tag/2022-09-11

      如果您使用的是 nginx-ingress 控制器,请尝试添加与文档中提到的相同的内容: (https://learn.microsoft.com/en-us/azure/aks/ingress-basic?tabs=azure-cli#basic-configuration)

      helm upgrade ingress-nginx ingress-nginx/ingress-nginx 
        --reuse-values 
        --namespace <NAMESPACE> 
        --set controller.service.annotations."service.beta.kubernetes.io/azure-load-balancer-health-probe-request-path"=/healthz
      

      【讨论】:

        猜你喜欢
        • 2020-05-18
        • 2020-05-08
        • 2022-06-23
        • 2019-11-25
        • 1970-01-01
        • 2019-07-13
        • 2019-11-16
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多