排查 AKS 群集中 Pod 或服务的连接问题(内部流量)

本文讨论如何将 Pod 或服务的连接问题作为来自同一Microsoft Azure Kubernetes 服务 (AKS) 群集的内部流量进行故障排除。

先决条件

故障排除清单

步骤 1:设置测试 Pod 和远程服务器端口

设置测试 Pod,并确保在远程服务器上打开所需的端口。 在源 Pod(或与源 Pod 位于同一命名空间的测试 Pod)中,执行以下步骤:

  1. 通过运行 kubectl run 命令在群集中启动测试 Pod:

    kubectl run -it --rm aks-ssh --namespace <namespace> --image=debian:stable
    
  2. 访问 Pod 后,运行以下命令 apt-get 以安装 DNS Utils、cURL 和 Netcat 包:

    apt-get update -y
    apt-get install dnsutils -y
    apt-get install curl -y
    apt-get install netcat-openbsd -y
    
  3. 安装包后,运行以下 cURL 命令以测试与 Pod IP 地址的连接:

    curl -Iv http://<pod-ip-address>:<port>
    
  4. 运行 Netcat 命令,检查远程服务器是否打开了所需的端口:

    nc -z -v <endpoint> <port>
    

步骤 2:查看有关 Pod、容器、Kubernetes 服务和终结点的操作信息

在命令行中使用 kubectl 和 cURL,按照以下步骤检查一切是否按预期工作:

  1. 验证目标 Pod 是否已启动并运行:

    kubectl get pods -n <namespace-name>
    

    如果目标 Pod 正常工作,则 Pod 状态显示为 Running,Pod 显示为 READYPod。

    NAME           READY   STATUS    RESTARTS   AGE
    my-other-pod   1/1     Running   0          44m
    my-pod         1/1     Running   0          44m
    
  2. 在 Pod 日志中搜索访问错误:

    kubectl logs <pod-name> -n <namespace-name>
    
  3. 在多容器 Pod 中搜索 Pod 中单个容器的 Pod 日志:

    kubectl logs <pod-name> -n <namespace-name> -c <container-name>
    
  4. 如果 Pod 内部的应用程序重复重启,请查看上一个容器实例的 Pod 日志以获取退出消息:

    kubectl logs <pod-name> --previous                      
    

    对于多容器情况,请使用以下命令:

    kubectl logs <pod-name> -c <container-name> --previous  
    
  5. 检查是否有任何网络策略可能会阻止流量:

    kubectl get networkpolicies -A
    

    你应会看到类似于下表的输出。

    NAMESPACE     NAME                 POD-SELECTOR             AGE
    kube-system   konnectivity-agent   app=konnectivity-agent   4d1h
    

    如果看到任何其他自定义创建的网络策略,请检查该策略是阻止了对 Pod 的访问或者从 Pod 进行的访问。

  6. 检查是否可以从服务 IP 地址访问应用程序。 首先,通过运行以下命令 kubectl get services 显示有关服务资源的详细信息,例如外部 IP 地址和端口:

    kubectl get services -n <namespace-name>
    
    NAME         TYPE           CLUSTER-IP   EXTERNAL-IP      PORT(S)        AGE
    my-service   LoadBalancer   10.0.21.43   20.119.121.232   80:31773/TCP   28s
    

    然后,使用服务 IP 地址和端口运行 cURL,检查是否可以访问应用程序:

    curl -Iv http://20.119.121.232:80
    .
    .
    .
    < HTTP/1.1 200 OK
    HTTP/1.1 200 OK
    
  7. 获取有关服务的详细信息:

    kubectl describe services <service-name> -n <namespace-name>
    
  8. 检查 Pod 的 IP 地址:

    kubectl get pods -o wide  
    
    NAME            READY   STATUS        RESTARTS   AGE   IP            NODE                                
    my-pod          1/1     Running       0          12m   10.244.0.15   aks-agentpool-000000-vmss000000  
    
  9. 验证 Pod 的 IP 地址是否作为服务中的终结点存在:

    kubectl describe services my-cluster-ip-service
    
    Name:              my-cluster-ip-service
    Namespace:         default
    Selector:          app=my-pod
    Type:              ClusterIP
    IP Family Policy:  SingleStack
    IP Families:       IPv4
    IP:                10.0.174.133
    IPs:               10.0.174.133
    Port:              <unset>  80/TCP
    TargetPort:        80/TCP
    Endpoints:         10.244.0.15:80     # <--- Here
    
  10. 直接验证终结点:

    kubectl get endpoints
    
    NAME                      ENDPOINTS           AGE
    my-cluster-ip-service     10.244.0.15:80      14m
    
  11. 如果与服务的连接不起作用,请重启 kube-proxy 和 CoreDNS Pod:

    kubectl delete pods -n kube-system -l component=kube-proxy
    kubectl delete pods -n kube-system -l k8s-app=kube-dns
    
  12. 验证节点是否未过度使用:

    kubectl top nodes
    

    注意

    还可以使用 Azure Monitor 获取群集的使用情况数据。

联系我们寻求帮助

如果你有任何疑问或需要帮助,请创建支持请求联系 Azure 社区支持。 你还可以将产品反馈提交到 Azure 反馈社区