Kubernetes Ingress and Services 故障排查

简介: Kubernetes Ingress and Services 故障排查

流量:Internet → Ingress 控制器规则(根据你的 Ingress YAML)→ Service → Pods


调试流程:Pods → Service → Ingress → Ingress controller → Internet


检查 Deployment & Pods

  1. 确保 Pod 已启动并运行(Pod 的“Status”为“Running”)。 如果没有,请检查Deployment/Pod 资源事件和log日志以解决问题。
  2. 如果您使用的是 HTTP GET livenessProbe,请确保您的 Service 和 Ingress 已预先部署。
$ kubectl get deployment -n # logs of deployment
$ kubectl logs deployment/ -n # follow logs of deployment, ctrl+c to quit
$ kubectl logs -f deployment/ -n # check "Events" at bottom of the output
$ kubectl describe deployment  -n 
$ kubectl get pods -n $ kubectl logs pod/ -n $ kubectl describe pod  -o wide -n

检查端口映射

59.png


Ingress

Ingress 可以配置为提供服务外部可访问的 URL、负载平衡流量、终止 SSL / TLS 并提供基于名称的虚拟主机。 Ingress 控制器负责实现 Ingress,通常使用负载均衡器,但它也可以配置边缘路由器或其他前端来帮助处理流量。

Ingress 不会暴露任意端口或协议。 向 Internet 公开 HTTP 和 HTTPS 以外的服务通常使用 Service.Type=NodePort 或 Service.Type=LoadBalancer 类型的服务。


检查 Service

  1. 检查 Service 中的“Endpoints”字段,该字段应与 Pod 的“IP”匹配。
  2. 如果您使用 GKE、AKS…等公共云,您可以将 Service Types 修改为 LoadBalancer 从而不经过ingress对外暴漏Service 。 如果能公网成功访问,这意味着您的 Pod 和服务正常工作,那么问题是由其他人造成的。
$ kubectl get service -n $ kubectl describe service  -n

检查 the Ingress & Ingress Controller 日志和资源时间

Ingress Controllers

为了使 Ingress 资源正常工作,集群必须运行一个入口控制器。

与作为 kube-controller-manager 二进制文件的一部分运行的其他类型的控制器不同,Ingress 控制器不会通过 GKE、AKS 等公共云中的集群自动启动。您需要选择最适合您的集群的入口控制器。

AKS 中的 Ingress Controller 是 AKS Application Gateway Ingress Controller,下面是 ingress-appgw-deployment。 入口控制器作为 AKS 群集中的 pod 运行。 它使用 Kubernetes Ingress 资源并将它们转换为 Azure 应用程序网关配置,该配置允许网关对 Kubernetes pod 的流量进行负载平衡。


1.检查您的 Ingress 是否有任何事件或错误日志

$ kubectl get ingress -n <namespace>
$ kubectl describe ingress <name-of-ingress> -n <namespace>

2.检查您的Ingress Controller 配置,看看它的规则是否与您刚刚应用的入口匹配。

λ kubectl get deployment  -n kube-system
NAME                       READY   UP-TO-DATE   AVAILABLE   AGE
ingress-appgw-deployment   1/1     1            1           48d
...
$ kubectl get pods -n kube-system
NAME                                        READY   STATUS    RESTARTS   AGE
azure-cni-networkmonitor-2fmfk              1/1     Running   0          7d5h
...
azure-ip-masq-agent-6k4rm                   1/1     Running   0          3d5h
...
coredns-84d976c568-pjt8q                    1/1     Running   1          86d
...
ingress-appgw-deployment-7b8b687b46-scvs7   1/1     Running   315        3d5h
kube-proxy-4c6qw                            1/1     Running   0          7d5h
...
metrics-server-569f6547dd-j2wjz             1/1     Running   5          86d
...
$ kubectl describe pod ingress-appgw-deployment-7b8b687b46-scvs7 -n kube-system

最后找出问题是由 Ingress 控制器在更新 Ingress YAML 或 Pod 服务端点(包括 livenessProbe)时无法将 Ingress YAML 转换为 Azure 应用程序网关配置引起的。

$ kubectl logs -n kube-system ingress-appgw-deployment-7b8b687b46-scvs7 | grep --color=always -i error
E0110 03:19:02.123462       1 requestroutingrules.go:386] A path-rule with path '/merchant/*' already exists in config for BackendPool '/subscriptions/49fc9d19-f517-4ca5-a93e-76ed0fbd0ab1/resourceGroups/xxx/providers/Microsoft.Network/applicationGateways/aks-gw/backendAddressPools/defaultaddresspool'. Duplicate path-rule with BackendPool '/subscriptions/49fc9d19-f517-4ca5-a93e-76ed0fbd0ab1/resourceGroups/xxx/providers/Microsoft.Network/applicationGateways/aks-gw/backendAddressPools/pool-payment-payment-svc-80-bp-80' will not be applied

重启 Ingress Controller

$ kubectl rollout restart deployment <your-ingress-controller-deployment>

Application Gateway 失败原因

可能导致 Application Gateway 无法监控和应用 Ingress 配置的原因。


1.使用没有包含 TLS 私钥和证书的 Secret 的 HTTPS。 如果您使用 let’s encrypt 自动生成 tls.crt 和 tls.key 类型为 kubernates.io/tls 的机密文件,请确保它没有被您的 AKS 防火墙阻止,这将导致错误类型的 Secret(Opaque )。

apiVersion: v1
kind: Secret
metadata:
  name: testsecret-tls
  namespace: default
data:
  tls.crt: base64 encoded cert
  tls.key: base64 encoded key
type: kubernetes.io/tls

2.重定向问题

Ingress gives 502 error

注意到应用程序必须在“/”处返回 200 状态码。 如果您的应用程序返回 302(重定向到登录),这将导致运行状况失败。 当健康检查失败时,入口资源返回502。

3.后端路径规则冲突。

如果您在 Ingress 中指定 backend-path-prefix,请确保它不会与您的后端资源 Deployment livenessProbe 路径前缀冲突。


Deployment

...       
        livenessProbe:
          httpGet:
            path: /payment_resource/healthcheck.jsp
            port: 8080
          initialDelaySeconds: 180
          periodSeconds: 10
          timeoutSeconds: 3
          failureThreshold: 3
          successThreshold: 1

Ingress

kind: Ingress
apiVersion: networking.k8s.io/v1
metadata:
  name: ingress-payment
  namespace: payment
  annotations:
    appgw.ingress.kubernetes.io/backend-path-prefix: /payment_resource/
    appgw.ingress.kubernetes.io/connection-draining: 'true'
    appgw.ingress.kubernetes.io/connection-draining-timeout: '30'
    appgw.ingress.kubernetes.io/cookie-based-affinity: 'true'
    appgw.ingress.kubernetes.io/ssl-redirect: 'true'
    cert-manager.io/cluster-issuer: letsencrypt-production
    kubernetes.io/ingress.allow-http: 'false'
    kubernetes.io/ingress.class: azure/application-gateway
spec:
  tls:
    - hosts:
        - xxx.xxx.xxx.azure.com
      secretName: aks-ingress-cert
  rules:
    - host: xxx.xxx.xxx.azure.com
      http:
        paths:
          - path: /payment/*
            pathType: ImplementationSpecific
            backend:
              service:
                name: payment-svc
                port:
                  number: 80

访问 https://xxx.xxx.xxx.azure.com/payment/healthcheck.jsp ,它将重定向到后端资源端点https://xxx.xxx.xxx.azure.com/payment_resource/healthcheck.jsp


相关实践学习
通过Ingress进行灰度发布
本场景您将运行一个简单的应用,部署一个新的应用用于新的发布,并通过Ingress能力实现灰度发布。
容器应用与集群管理
欢迎来到《容器应用与集群管理》课程,本课程是“云原生容器Clouder认证“系列中的第二阶段。课程将向您介绍与容器集群相关的概念和技术,这些概念和技术可以帮助您了解阿里云容器服务ACK/ACK Serverless的使用。同时,本课程也会向您介绍可以采取的工具、方法和可操作步骤,以帮助您了解如何基于容器服务ACK Serverless构建和管理企业级应用。 学习完本课程后,您将能够: 掌握容器集群、容器编排的基本概念 掌握Kubernetes的基础概念及核心思想 掌握阿里云容器服务ACK/ACK Serverless概念及使用方法 基于容器服务ACK Serverless搭建和管理企业级网站应用
相关文章
|
7月前
|
Kubernetes 负载均衡 应用服务中间件
深入理解 Kubernetes Ingress:路由流量、负载均衡和安全性配置
深入理解 Kubernetes Ingress:路由流量、负载均衡和安全性配置
1222 1
|
2月前
|
Kubernetes 负载均衡 应用服务中间件
k8s学习--ingress详细解释与应用(nginx ingress controller))
k8s学习--ingress详细解释与应用(nginx ingress controller))
295 0
|
3月前
|
Kubernetes 应用服务中间件 nginx
Kubernetes上安装Metallb和Ingress并部署应用程序
Kubernetes上安装Metallb和Ingress并部署nginx应用程序,使用LoadBalancer类型的KubernetesService
190 7
|
2月前
|
缓存 Kubernetes 负载均衡
在K8S中,ingress 有何作用?
在K8S中,ingress 有何作用?
|
4月前
|
Kubernetes 应用服务中间件 API
【Ingress 秘籍】集群进出流量的总管:揭秘 Kubernetes 中 Ingress 的终极奥秘!
【8月更文挑战第25天】Ingress是Kubernetes中用于管理HTTP与HTTPS流量进入集群的核心功能。作为集群内外通信的桥梁,Ingress通过定义规则将外部请求导向内部服务。本文详细介绍了Ingress的基本概念、配置方法及其实现方式。通过使用不同的Ingress控制器(如Nginx、Traefik等),用户可以根据需要选择最适合的方案。文中还提供了示例代码展示如何创建服务、部署应用及配置Ingress规则。
174 6
|
4月前
|
Kubernetes 负载均衡 应用服务中间件
在k8S中,ingress是什么?
在k8S中,ingress是什么?
|
4月前
|
API UED 开发者
超实用技巧大放送:彻底革新你的WinForms应用,从流畅动画到丝滑交互设计,全面解析如何在保证性能的同时大幅提升用户体验,让软件操作变得赏心悦目不再是梦!
【8月更文挑战第31天】在Windows平台上,使用WinForms框架开发应用程序时,如何在保持性能的同时提升用户界面的吸引力和响应性是一个常见挑战。本文探讨了在不牺牲性能的前提下实现流畅动画与交互设计的最佳实践,包括使用BackgroundWorker处理耗时任务、利用Timer控件创建简单动画,以及使用Graphics类绘制自定义图形。通过具体示例代码展示了这些技术的应用,帮助开发者显著改善用户体验,使应用程序更加吸引人和易于使用。
81 0
|
5月前
|
Kubernetes 负载均衡 安全
如何为Azure Kubernetes Services启用Internal Loadbalancer
执行上述步骤,您就可以搭建一个仅在Azure虚拟网络内部可用的内部负载均衡器了。这为内部服务通信提供了安全性,避免了外部世界的直接接入。与外部负载均衡器相比,内部负载均衡器通常用于企业内部或多层应用架构中的后端服务。通过仔细配置和管理AKS中的Service对象,您可以确保应用架构符合网络和安全性要求。
53 2
|
4月前
|
Kubernetes API 网络安全
在K8S中,ingress该如何使用?
在K8S中,ingress该如何使用?
|
6月前
|
容器 Perl Kubernetes
深入 Kubernetes 网络:实战K8s网络故障排查与诊断策略
本文介绍了Kubernetes网络的基础知识和故障排查经验,重点讨论了私有化环境中Kubernetes网络的挑战。首先,文章阐述了Kubernetes网络模型的三大核心要素:Pod网络、Service网络和CNI,并强调了其在容器通信和服务发现中的作用。接着,通过三个具体的故障案例,展示了网络冲突、主节点DNS配置更改导致的服务中断以及容器网络抖动问题的解决过程,强调了网络规划、配置管理和人员培训的重要性。最后,提到了KubeSkoop exporter工具在监控和定位网络抖动问题中的应用。通过这些案例,读者可以深入了解Kubernetes网络的复杂性,并学习到实用的故障排查方法。
147515 19