k8s诊断之ingress 异常状态码及证书问题排查思路

本文涉及的产品
日志服务 SLS,月写入数据量 50GB 1个月
简介: ingress的状态码以及证书问题的分析

我们能从这张图里看到什么有用的信息?

  • 整体开销时间?
  • 请求状态码?
  • 请求结束的时间(结束请求记录日志)
  • 尝试过的后端地址和端口?
  • 后端返回的数据包长度?
  • 后端返回的时间?
  • 后端的状态码?

这种问题应该怎么分析呢?

1,抓取pod以及svc的ep更新记录,注意替换kubeconfig,以及label等

for i in {1..3000};do echo`date` >> p.log;kubectl --kubeconfig=/root/kehuconfig/fconfig  -n admin-testing get pods  -o wide -l app.kubernetes.io/name=ops-go-api >> p.log ;kubectl --kubeconfig=/root/kehuconfig/fconfig  -n admin-testing describe ep ops-go-api >> p.log;sleep 1;done

2,需要登录到ingress-controller的pod里面抓backends

foriin{1..3000};doecho`date`>>ng.log;/dbgbackendsgetadmin-testing-ops-go-api-http|grep-A20"endpoint">>ng.log;sleep1;done/dbgbackendsgetsvc+svcname+:ingresscontrollerbackends<0.22nginx.conf>=0.22kubectl-nkube-systemexec-it<NGINX-INGRESS-CONOTROLLER-POD-NAME>--curlhttp://127.0.0.1:18080/configuration/backendsdemo/dbg-hdbgisatoolforquicklyinspectingthestateofthenginxinstanceUsage:dbg[command]AvailableCommands:backendsInspectthedynamically-loadedbackendsinformationcertsInspectdynamicSSLcertificatesconfDumpthecontentsof/etc/nginx/nginx.confgeneralOutputthegeneraldynamicluastatehelpHelpaboutanycommandFlags:-h, --helphelpfordbg--status-portintPorttousefortheluaHTTPendpointconfiguration. (default10246)Use"dbg [command] --help"formoreinformationaboutacommand./dbgbackendslistdefault-canary-ua-80default-cms-webhook-8080default-cors-5000default-cors-canary-5000default-grafana-3000default-helloworld-80default-my-multicluster-svc-80default-mysvc-80default-mywp-svc-80default-myyuan-https-34567upstream-default-backend$/dbgbackendsgetdefault-my-multicluster-svc-80{"endpoints":[{"address":"192.168.40.221",
"port":"80"}],
"name":"default-my-multicluster-svc-80",
"noServer":false,
"port":80,
"service":{"metadata":{"creationTimestamp":null},
"spec":{"clusterIP":"172.16.167.67",
"ports":[{"port":80,
"protocol":"TCP",
"targetPort":80}],
"selector":{"app":"my-nettools-multicluster-test"},
"sessionAffinity":"None",
"type":"ClusterIP"},
"status":{"loadBalancer":{}}},
"sessionAffinityConfig":{"cookieSessionAffinity":{"name":""},
"mode":"",
"name":""},
"sslPassthrough":false,
"trafficShapingPolicy":{"cookie":"",
"header":"",
"headerPattern":"",
"headerValue":"",
"weight":0},
"upstreamHashByConfig":{"upstream-hash-by-subset-size":3}}

分别采集用户的pod更新时间,endpoint更新时间,以及ingress的更新时间,看看异常的499 502等日志在哪

日志图如下:

502日志,注意一个点,time是访问结束的时间,因此是46秒-2s左右

pod的变化以及ep的变化,可以看到 46秒 44秒ep都是正常的 更新后的pod


再看下ingress的backends的endpoint,44秒的时候。T状态的pod 10.0.32.45还在endpoint中


以这个异常pod摘除的时间分析。04:36的时候 是T状态了

而ingress的时间却是 05:12的时候 才没有这个32.45的ip,中间延迟了36秒左右

这个时候我们还能查查什么?

  1. apiserver是否存在限流?查看kubelet日志以及apiserver的监控大盘
  2. 对比多个controller,看看是否都存在该问题?如果都存在的话说明是某个共同因素影响导致,参考1
  3. 如果单个controller有延迟的问题,检查controller日志看看有没有报错信息或者所在节点的负载
  4. controller版本是否滞后比较久?可考虑升级版本



ingress 配置验证

  • 客户ingress中更换对应的secret
  • ingress中对应的secret crt信息验证
  • 证书加载验证 kt exec -it -n kube-system nginx-ingress-controller-5c654cddcc-bgfkj -- /bin/sh

/dbg certs get xxx

  • 解开cert看信息: openssl x509 -in d.cert -noout -text


服务当前使用证书确认

4) curl -voa https://svc.com --resolve svc.com:443:47.243.241.18x -k
5) curl -voa https://47.243.241.18x -k

参考下面tips


测试

  • https双向认证
    1) curl --cacert ./ca.crt  https://foo.bar.com --resolve foo.bar.com:443:47.243.241.18x --cert ./client.crt --key ./client.key -voa # foo.bar.com 这个域名的
  • 证书信息查看
    2) openssl s_client -connect 47.243.241.18x:443
    4) curl -voa https://svc.com --resolve svc.com:443:47.243.241.18x -k
    5) curl -voa https://47.243.241.18x -k
  • tips
    1) 访问链路上需要确认有没有WAF,有没有透明WAF,有没有443端口上的七层slb,如果这些都没有,证书才会落到集群ingress里

2) 当证书落在集群的Ingress上,不带server name (ip替代域名的方式查看证书),返回的为默认证书,域名方式查看,返回的为对应的ingress上配置的证书。

3)透明WAF针对四层SLB需要配置证书 - https://help.aliyun.com/document_detail/171453.html


4) WAF double confirm -  https://yundunnext-console.aliyun-inc.com/?error=3#/ddosbasic/cn-beijing



openssl使用


相关实践学习
通过Ingress进行灰度发布
本场景您将运行一个简单的应用,部署一个新的应用用于新的发布,并通过Ingress能力实现灰度发布。
容器应用与集群管理
欢迎来到《容器应用与集群管理》课程,本课程是“云原生容器Clouder认证“系列中的第二阶段。课程将向您介绍与容器集群相关的概念和技术,这些概念和技术可以帮助您了解阿里云容器服务ACK/ACK Serverless的使用。同时,本课程也会向您介绍可以采取的工具、方法和可操作步骤,以帮助您了解如何基于容器服务ACK Serverless构建和管理企业级应用。 学习完本课程后,您将能够: 掌握容器集群、容器编排的基本概念 掌握Kubernetes的基础概念及核心思想 掌握阿里云容器服务ACK/ACK Serverless概念及使用方法 基于容器服务ACK Serverless搭建和管理企业级网站应用
目录
相关文章
|
2月前
|
存储 Kubernetes Perl
K8S中Pod启动异常
【10月更文挑战第3天】
86 2
|
2月前
|
负载均衡 Kubernetes 区块链
随机密码生成器+阿里k8s负载均衡型服务加证书方法+移动终端设计+ico生成器等
随机密码生成器+阿里k8s负载均衡型服务加证书方法+移动终端设计+ico生成器等
61 1
|
2月前
|
Kubernetes 负载均衡 应用服务中间件
k8s学习--ingress详细解释与应用(nginx ingress controller))
k8s学习--ingress详细解释与应用(nginx ingress controller))
368 0
|
3月前
|
Kubernetes 应用服务中间件 nginx
Kubernetes上安装Metallb和Ingress并部署应用程序
Kubernetes上安装Metallb和Ingress并部署nginx应用程序,使用LoadBalancer类型的KubernetesService
210 9
|
2月前
|
缓存 Kubernetes 负载均衡
在K8S中,ingress 有何作用?
在K8S中,ingress 有何作用?
|
4月前
|
API UED 开发者
超实用技巧大放送:彻底革新你的WinForms应用,从流畅动画到丝滑交互设计,全面解析如何在保证性能的同时大幅提升用户体验,让软件操作变得赏心悦目不再是梦!
【8月更文挑战第31天】在Windows平台上,使用WinForms框架开发应用程序时,如何在保持性能的同时提升用户界面的吸引力和响应性是一个常见挑战。本文探讨了在不牺牲性能的前提下实现流畅动画与交互设计的最佳实践,包括使用BackgroundWorker处理耗时任务、利用Timer控件创建简单动画,以及使用Graphics类绘制自定义图形。通过具体示例代码展示了这些技术的应用,帮助开发者显著改善用户体验,使应用程序更加吸引人和易于使用。
84 0
|
12天前
|
存储 Kubernetes 关系型数据库
阿里云ACK备份中心,K8s集群业务应用数据的一站式灾备方案
本文源自2024云栖大会苏雅诗的演讲,探讨了K8s集群业务为何需要灾备及其重要性。文中强调了集群与业务高可用配置对稳定性的重要性,并指出人为误操作等风险,建议实施周期性和特定情况下的灾备措施。针对容器化业务,提出了灾备的新特性与需求,包括工作负载为核心、云资源信息的备份,以及有状态应用的数据保护。介绍了ACK推出的备份中心解决方案,支持命名空间、标签、资源类型等维度的备份,并具备存储卷数据保护功能,能够满足GitOps流程企业的特定需求。此外,还详细描述了备份中心的使用流程、控制台展示、灾备难点及解决方案等内容,展示了备份中心如何有效应对K8s集群资源和存储卷数据的灾备挑战。
|
1月前
|
Kubernetes 监控 Cloud Native
Kubernetes集群的高可用性与伸缩性实践
Kubernetes集群的高可用性与伸缩性实践
72 1
|
2月前
|
JSON Kubernetes 容灾
ACK One应用分发上线:高效管理多集群应用
ACK One应用分发上线,主要介绍了新能力的使用场景
|
2月前
|
Kubernetes 持续交付 开发工具
ACK One GitOps:ApplicationSet UI简化多集群GitOps应用管理
ACK One GitOps新发布了多集群应用控制台,支持管理Argo CD ApplicationSet,提升大规模应用和集群的多集群GitOps应用分发管理体验。