来历:如此众生s
调试 Kubernetes 运用程序就像在迷宫中导航。因为其分布式特性和很多组件,在 Kubernetes 中辨认和处理问题需求一套强壮的东西和技能。
译自The Kubernetes Troubleshooting Handbook,作者 Piotr。
在本博文中,咱们将讨论各种技能和东西,以协助您进行 Kubernetes 毛病扫除和调试。不管您是阅历丰厚的 Kubernetes 用户仍是刚入门,本攻略都将为您供给有关高效调试实践的名贵见地。
虽然在本博文中,我极力依据我的阅历汇编有用的主张,但威望的本相来历始终是官方 Kubernetes 文档。
了解 Pod 的生命周期关于调试和保护在 Kubernetes 中运转的运用程序至关重要。每个 Pod 都要阅历从创立到停止的几个阶段,剖析这些作业能够协助您辨认和处理问题。
Pod 生命周期阶段
Kubernetes 中的 Pod 会阅历以下阶段:
运用kubectl get和kubectl describe
要剖析 Pod 的生命周期作业,您能够运用kubectl get和kubectl describe指令。
kubectl get指令供给 Pod 状况的高档概述:
kubectl get pods
输出:
NAME READY STATUS RESTARTS AGEweb-server-pod 1/1 Running 0 5mdb-server-pod 1/1 Pending 0 2mcache-server-pod 1/1 Completed 1 10m
此输出显现每个 Pod 的当时状况,这能够协助您辨认需求进一步查询的 Pod。
kubectl describe指令供给有关 Pod 的具体信息,包含其生命周期作业:
kubectl describe pod
输出片段:
Name: web-server-podNamespace: defaultNode: node-1/192.168.1.1Start Time: Mon, 01 Jan 2024 10:00:00 GMTLabels: app=web-serverStatus: RunningIP: 10.244.0.2Containers: web-container: Container ID: docker://abcdef123456 Image: nginx:latest State: Running Started: Mon, 01 Jan 2024 10:01:00 GMT Ready: True Restart Count: 0Events: Type Reason Age From Message ---- ------ ---- ---- ------- Normal Scheduled 10m default-scheduler Successfully assigned default/web-server-pod to node-1 Normal Pulled 9m kubelet, node-1 Container image "nginx:latest" already present on machine Normal Created 9m kubelet, node-1 Created container web-container Normal Started 9m kubelet, node-1 Started container web-container
剖析 Pod 作业
kubectl describe输出中的Events部分供给了 Pod 产生的重大作业的按时刻顺序排列的日志。这些作业能够协助您了解生命周期转化并辨认比如以下问题:
Kubernetes 生成集群规模的kind: Event咱们能够运用它来快速了解集群中产生的作业。
另一方面,审计日志kind: Policy关于保证集群的合规性和安全性很有用。它们能够显现登录测验、Pod 权限进步等等。
Kubernetes 作业
Kubernetes 作业供给集群内重大作业的时刻线,例如 Pod 调度、容器重启和过错。它们有助于了解状况转化并辨认问题的根本原因。
检查作业
要检查集群中的作业,请运用kubectl get events指令:
kubectl get events
输出示例:
LAST SEEN TYPE REASON OBJECT MESSAGE12s Normal Scheduled pod/web-server-pod Successfully assigned default/web-server-pod to node-110s Normal Pulling pod/web-server-pod Pulling image "nginx:latest"8s Normal Created pod/web-server-pod Created container web-container7s Normal Started pod/web-server-pod Started container web-container5s Warning BackOff pod/db-server-pod Back-off restarting failed container
过滤作业
您能够过滤作业以重视特定命名空间、资源类型或时刻段。例如,要检查与特定 Pod 相关的作业:
kubectl get events --field-selector involvedObject.name=web-server-pod
描绘资源
kubectl describe指令在其输出中包含作业,供给有关特定资源及其作业历史记载的具体信息:
kubectl describe pod web-server-pod
输出片段:
Events: Type Reason Age From Message ---- ------ ---- ---- ------- Normal Scheduled 10m default-scheduler Successfully assigned default/web-server-pod to node-1 Normal Pulled 9m kubelet, node-1 Container image "nginx:latest" already present on machine Normal Created 9m kubelet, node-1 Created container web-container Normal Started 9m kubelet, node-1 Started container web-container
Kubernetes 审计日志
审计日志供给了对一切发送到 Kubernetes API 服务器的 API 恳求的具体记载,包含用户、履行的操作和成果。它们关于安全审计和合规性至关重要。
启用审计日志
要启用审计日志,请运用恰当的标志和审计战略装备 API 服务器。以下是一个审计战略装备示例:
# audit-policy.yamlapiVersion: audit.k8s.io/v1kind: Policyrules:- level: Metadata resources: - group: "" resources: ["pods"]- level: RequestResponse users: ["admin"] verbs: ["update", "patch"] resources: - group: "" resources: ["configmaps"]
装备 API 服务器
在发动 API 服务器时指定审计战略文件和日志文件方位:
kube-apiserver --audit-policy-file=/etc/kubernetes/audit-policy.yaml --audit-log-path=/var/log/kubernetes/audit.log
检查审计日志
审计日志一般写入文件。您能够运用标准日志剖析东西来检查和过滤日志。以下是一个审计日志条意图示例:
{ "kind": "Event", "apiVersion": "audit.k8s.io/v1", "level": "Metadata", "auditID": "12345", "stage": "ResponseComplete", "requestURI": "/api/v1/namespaces/default/pods", "verb": "create", "user": { "username": "admin", "groups": ["system:masters"] }, "sourceIPs": ["192.168.1.1"], "objectRef": { "resource": "pods", "namespace": "default", "name": "web-server-pod" }, "responseStatus": { "metadata": {}, "code": 201 }, "requestReceivedTimestamp": "2024-01-01T12:00:00Z", "stageTimestamp": "2024-01-01T12:00:01Z"}
Kubernetes 仪表盘是一个根据 Web 的 UI,供给了一种简略的办法来办理和排查 Kubernetes 集群。它答应您可视化集群资源、布置运用程序并履行各种办理使命。
装置 Kubernetes 仪表盘
有关装置和拜访仪表盘的具体信息,请参阅kubernetes 文档。
运用仪表盘
仪表盘供给各种功用来协助办理和排查 Kubernetes 集群:
监控资源运用情况有助于您了解运用程序怎么耗费资源并确认优化时机。
监控东西
运用 kubectl top
kubectl top指令显现了 Pod 和节点的当时 CPU 和内存运用情况。
kubectl top pods kubectl top nodes
示例输出:
NAME CPU(cores) MEMORY(bytes)my-app-pod 100m 120Mi
在调试 Kubernetes 运用程序时,kubectl logs是咱们武器库中最根本东西之一。此指令有助于从 Pod 中的特定容器中检索日志,使您能够有用地确诊和处理问题。
根本用法
检索 Pod 日志的最简略办法是运用kubectl logs指令,后跟 Pod 称号和命名空间。以下是一个在default命名空间中运转的 Pod 的根本示例:
此指令从指定 Pod 中的第一个容器中获取日志。假如您的 Pod 包含多个容器,您还需求指定容器称号:
kubectl logs
-c
运用-f标志实时获取日志
要实时流式传输日志,类似于 Linux 中的tail -f,请运用-f标志:
kubectl logs -f
这关于在运用程序运转时监控日志并调查实时进程的输出特别有用。
有一些项目增强了日志跟随功用,例如 [stern]。
检索曾经的日志
假如 Pod 已重新发动,您能够运用--previous标志检查从前实例的日志:
kubectl logs
--previous
这有助于经过检查毛病之前的日志来了解导致 Pod 重新发动的原因。
运用标签过滤日志
您还能够运用kubectl以及jq来过滤与特定标签匹配的 Pod 的日志,以进行高档过滤:
kubectl get pods -l
-o json | jq -r '.items[] | .metadata.name'| xargs -I {} kubectl logs {}
将
替换为您的特定标签,例如app=myapp。
与其他东西结合运用
您能够将kubectl logs与其他 Linux 指令结合运用,以增强您的调试进程。例如,要在日志中查找特定过错音讯,能够运用grep:
kubectl logs web-server-pod | grep "Error"
关于实时日志中的接连查找:
kubectl logs -f web-server-pod | grep --line-buffered "Error"
实用技巧
日志轮换和保存: 保证您的运用程序处理日志轮换,以避免日志占用过多的磁盘空间。
结构化日志记载: 运用结构化日志记载(例如 JSON 格局),以便运用jq等东西更轻松地解析和剖析日志。
会集式日志记载: 考虑设置会集式日志记载体系(例如 Elasticsearch、Fluentd 和 Kibana - EFK 仓库)来聚合和查找来自一切 Kubernetes Pod 的日志。
kubectl exec答应咱们直接在正在运转的容器内履行指令。这关于交互式毛病扫除特别有用,能够检查容器的环境、运转确诊指令并履行实时修正。
根本用法
kubectl exec的根本语法如下:
kubectl exec
--
要在 Pod 中的特定容器中履行指令,请运用-c标志。请注意,这将履行指令并当即退出容器。
kubectl exec
-c
--
运转交互式 Shell
kubectl exec最常见的用处之一是在容器内翻开交互式 Shell 会话。这答应您以交互办法运转多个指令。以下是怎么操作:
kubectl exec -it
-- /bin/bash
关于运用sh而不是bash的容器:
kubectl exec -it
-- /bin/sh
示例:检查环境变量
要检查容器内的环境变量,能够运用env指令:
kubectl exec
-- env
假如您需求检查特定容器中的环境变量:
kubectl exec
-c
-- env
示例:检查装备文件
假定您需求检查容器内的装备文件。您能够运用cat或容器内可用的任何文本编辑器:
kubectl exec
-- cat /path/to/config/file
关于特定容器:
kubectl exec
-c
-- cat /path/to/config/file
将文件仿制到容器和从容器仿制文件
假如您在容器中没有需求的二进制文件,能够运用kubectl cp轻松地将文件仿制到容器和从容器仿制文件。例如,要将文件从本地机器仿制到容器:
kubectl cp /local/path/to/file
:/container/path/to/file
要将文件从容器仿制到本地机器:
kubectl cp
:/container/path/to/file /local/path/to/file
实用技巧
运用-i和-t标志:-i标志使会话交互,-t标志分配一个伪终端。-it一同启用彻底交互式会话。
以特定用户身份运转: 假如需求,运用--user标志以特定用户身份在容器内履行指令。
kubectl exec --user=
-it
-- /bin/bash
安全注意事项: 在运用进步的权限运转kubectl exec时要慎重。保证您已施行恰当的 RBAC(根据人物的拜访操控)战略,以避免未经授权的拜访。
大多数调试技能都会集在运用程序等级,可是也能够运用kubectl debug node指令调试特定 Kubernetes 节点。
节点级调试关于确诊影响 Kubernetes 节点自身的问题至关重要,例如资源耗尽、装备过错或硬件毛病。
这样,调试 Pod 能够拜访节点的根文件体系,该文件体系在 Pod 中以/*方式挂载。
创立调试会话:
运用kubectl debug指令在节点上发动调试会话。此指令会在指定的节点上创立一个运转调试容器的 Pod。
kubectl debug node/
-it --image=busybox
将
替换为要调试的节点的称号。-it标志翻开交互式终端,--image=busybox指定用于调试容器的镜像。
有关更多具体信息,请参阅Kubernetes 官方文档关于节点级调试。
关于更杂乱的问题,请考虑运用预装东西的调试容器。有很多好的 Docker 镜像包含用于调试的东西和脚本,其间一个我引荐的是https://github.com/nicolaka/netshoot。能够运用以下指令快速创立它:
kubectl run tmp-shell --rm -i --tty --image nicolaka/netshoot
示例:运用调试容器作为 sidecar
apiVersion: apps/v1 kind: Deployment metadata: name: nginx-netshoot labels: app: nginx-netshoot spec: replicas: 1 selector: matchLabels: app: nginx-netshoot template: metadata: labels: app: nginx-netshoot spec: containers: - name: nginx image: nginx:1.14.2 ports: - containerPort: 80 - name: netshoot image: nicolaka/netshoot command: ["/bin/bash"] args: ["-c", "while true; do ping localhost; sleep 60;done"]
运用装备:
kubectl apply -f debug-pod.yaml
实用技巧
设置重启战略:保证您的 Pod 标准具有恰当的重启战略以处理不同的毛病场景。
自动化监控:运用 Prometheus 和 Alertmanager 设置对关键问题的自动化监控和警报,例如CrashLoopBackOff。
暂时容器是暂时的,专门用于调试意图。它们关于运转确诊东西和指令很有用,而不会影响正在运转的运用程序。本章将讨论怎么在 Kubernetes 中创立和运用暂时 Pod 以进行交互式毛病扫除。
为什么运用暂时 Pod?
创立暂时 Pod
在 Kubernetes 中创立暂时 Pod 有多种办法。一种常见的办法是运用kubectl run指令。
示例:创立暂时 Pod
运用 kubectl run:
kubectl debug mypod -it --image=nicolaka/netshoot
此指令运用netshoot镜像创立一个调试 Pod 并翻开一个交互式 shell。
运用暂时 Pod 的实用技巧
东西可用性:保证调试容器镜像包含一切必要的毛病扫除东西,例如curl、netcat、nslookup、df、top等。
安全注意事项:在创立暂时 Pod 时要注意安全。保证它们具有有限的拜访权限,而且仅由授权人员运用。
示例:运用自定义调试容器进行高档调试
让咱们逐渐了解怎么运用自定义调试容器进行高档调试使命。
运用自定义调试容器创立暂时 Pod:
kubectl debug -it redis5 --image=nicolaka/netshootDefaulting debug container name to debugger-v4hfv.If you don't see a command prompt, try pressing enter. dP dP dP 88 88 8888d888b. .d8888b. d8888P .d8888b. 88d888b. .d8888b. .d8888b. d8888P88' `88 88ooood8 88 Y8ooooo. 88' `88 88' `88 88' `88 8888 88 88. ... 88 88 88 88 88. .88 88. .88 88dP dP `88888P' dP `88888P' dP dP `88888P' `88888P' dPWelcome to Netshoot! (github.com/nicolaka/netshoot)Version: 0.13 redis5 ~
运转确诊指令:
在调试容器中,咱们能够运转各种指令。
# Check DNS resolutionnslookup kubernetes.default.svc.cluster.localServer: 10.96.0.10Address: 10.96.0.10#53Name: kubernetes.default.svc.cluster.localAddress: 10.96.0.1
现在咱们将介绍两种常见的毛病扫除场景;DNS 问题和有状况 Pod 调试。让咱们看看咱们在实践中学到了什么。
常见的网络问题
用于毛病扫除的东西和指令
示例:确诊 DNS 解析问题
让咱们逐渐了解怎么确诊名为my-app-pod的 Pod 测验拜访服务my-db-service时呈现的 DNS 解析问题。
检查 DNS 解析:
kubectl exec -it my-app-pod -- nslookup my-db-service
或许,咱们能够运用调试 Pod 或暂时容器。
指示问题的输出:
Server: 10.96.0.10Address:10.96.0.10#53** server can't find my-db-service: NXDOMAIN
检查 CoreDNS 日志:
检查 CoreDNS Pod 的日志以辨认任何 DNS 解析问题。
kubectl logs -l k8s-app=kube-dns -n kube-system
查找指示 DNS 解析失利的过错或正告。
验证服务和端点:
保证服务和端点存在并已正确装备。
kubectl get svc my-db-servicekubectl get endpoints my-db-serviceNAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGEmy-db-serviceClusterIP 10.96.0.11
5432/TCP 1hNAME ENDPOINTS AGEmy-db-service10.244.0.5:5432 1h
重启 CoreDNS Pod: 重启 CoreDNS Pod 以处理潜在的瞬态问题。
kubectl rollout restart deployment coredns -n kube-system再次验证 DNS 解析: 处理问题后,再次验证 DNS 解析:
kubectl exec -it my-app-pod -- nslookup my-db-service
预期输出:
Server: 10.96.0.10Address:10.96.0.10#53Name: my-db-service.default.svc.cluster.localAddress:10.96.0.11
实用技巧
运用网络调试容器: 运用nicolaka/netshoot等网络调试容器进行全面的网络毛病扫除。
kubectl run netshoot --rm -it --image nicolaka/netshoot -- /bin/bash
监控网络目标: 运用 Prometheus 和 Grafana 监控网络目标并为网络问题设置警报。
施行冗余: 装备冗余 DNS 服务器和毛病搬运机制以进步网络可靠性。
Kubernetes 中的有状况运用程序需求针对调试进行特别考虑,因为它们依靠于耐久性存储和跨重启的共同状况。本节将讨论处理和调试有状况运用程序特有问题的办法。
什么是有状况运用程序?
有状况运用程序在会话和重启之间保护状况信息,一般运用耐久性存储。示例包含数据库、音讯行列和其他需求数据耐久性的运用程序。
有状况运用程序中的常见问题
示例:调试 MySQL StatefulSet
让咱们逐渐调试名为my-mysql的 MySQL StatefulSet 。
检查 StatefulSet:
kubectl describe statefulset my-mysql
输出片段:
Name: my-mysqlNamespace: defaultSelector: app=my-mysqlReplicas: 3 desired | 3 total...Events: Type Reason Age From Message ---- ------ ---- ---- ------- Normal SuccessfulCreate 1m statefulset-controller create Pod my-mysql-0 in StatefulSet my-mysql successful Normal SuccessfulCreate 1m statefulset-controller create Pod my-mysql-1 in StatefulSet my-mysql successful Normal SuccessfulCreate 1m statefulset-controller create Pod my-mysql-2 in StatefulSet my-mysql successful
检查耐久卷声明:
kubectl get pvckubectl describe pvc data-my-mysql-0
输出片段:
Name: data-my-mysql-0Namespace: defaultStatus: BoundVolume: pvc-1234abcd-56ef-78gh-90ij-klmnopqrstuv...
检查 Pod 日志:
kubectl logs my-mysql-0
输出片段:
2024-01-01T00:00:00.000000Z 0 [Note] mysqld (mysqld 8.0.23) starting as process 1 ...`2024-01-01T00:00:00.000000Z 1 [ERROR] InnoDB: Unable to lock ./ibdata1 error: 11
在 Pod 中履行指令:
kubectl exec -it my-mysql-0 -- /bin/sh
在 Pod 内:
# Check mounted volumesdf -h# Verify MySQL data directoryls -l /var/lib/mysql# Check MySQL statusmysqladmin -u root -p status
检查网络衔接:
kubectl exec -it my-mysql-0 -- ping my-mysql-1.my-mysql.default.svc.cluster.local
输出片段:
PING my-mysql-1.my-mysql.default.svc.cluster.local (10.244.0.6): 56 data bytes64 bytes from 10.244.0.6: icmp_seq=0 ttl=64 time=0.047 ms
Kubernetes 中的高档调试技能触及运用专门的东西和战略来确诊和处理杂乱问题。本章将介绍盯梢东西和长途调试。
运用 Jaeger 进行剖析
Jaeger是一种开源的端到端分布式盯梢东西,可协助监控和调试杂乱分布式体系中的业务。运用 Jaeger 进行剖析能够供给有关微服务功用的见地,并协助辨认推迟问题。
您能够在 Kubernetes 集群中运用 Jaeger Operator 或 Helm 装置 Jaeger。
helm repo add jaegertracing https://jaegertracing.github.io/helm-chartshelm repo updatehelm install jaeger jaegertracing/jaeger
运用程序插装:
保证您的运用程序已装备为将盯梢数据发送到 Jaeger。这一般触及在您的运用程序代码中增加 Jaeger 客户端库,并将其装备为向 Jaeger 后端陈述。
Go 运用程序示例:
import ( "github.com/opentracing/opentracing-go" "github.com/uber/jaeger-client-go" "github.com/uber/jaeger-client-go/config")func initJaeger(service string) (opentracing.Tracer, io.Closer) { cfg := config.Configuration{ ServiceName: service, Sampler: &config.SamplerConfig{ Type: "const", Param: 1, }, Reporter: &config.ReporterConfig{ LogSpans: true, LocalAgentHostPort: "jaeger-agent.default.svc.cluster.local:6831", }, } tracer, closer, _ := cfg.NewTracer() opentracing.SetGlobalTracer(tracer) return tracer, closer}
拜访 Jaeger UI 检查和剖析盯梢。
kubectl port-forward svc/jaeger-query 16686:16686
在浏览器中翻开http://localhost:16686。
运用 mirrord 进行长途调试
Mirrord 是一款开源东西,它答应经过在 Kubernetes 集群和长途基础设施的上下文中运转本地进程来进行 Kubernetes 服务的长途调试。
设置 mirrord
curl -fsSL https://raw.githubusercontent.com/metalbear-co/mirrord/main/scripts/install.sh | bash
衔接到您的集群:
发动 mirrord 会话以将您的本地环境衔接到您的 Kubernetes 集群。
mirrord connect
交流布置:
运用 mirrord 将集群中的布置替换为您的本地服务。
mirrord exec --target-namespace devops-team --target deployment/foo-app-deployment nodemon server.js
此指令将来自 Kubernetes 集群的流量、环境变量和文件操作重定向到您的本地机器,答应您像在本地运转相同调试服务。
设置 mirrord 会话后,您能够运用您喜爱的调试东西和 IDE 来调试在本地机器上运转的服务。
有关运用 mirrord 进行调试的具体示例和更多信息,请阅览这篇博文。
除了中心 Kubernetes 指令和开源东西之外,还有其他一些东西能够增强您在各个类别中的毛病扫除功用。以下是一些值得注意的东西:
调试 Kubernetes 运用程序或许是一项杂乱且具有挑战性的使命,但运用正确的东西和技能,它会变得愈加简单办理。
请记住,有用的调试不仅仅是处理呈现的过错,还包含自动监控、高效的资源办理以及对运用程序架构和依靠项的深刻理解。
经过施行本攻略中概述的战略和最佳实践,您能够构建一个强壮的调试结构,使您能够快速辨认、确诊和处理问题,保证 Kubernetes 布置的顺畅运转。
感谢您抽出时刻阅览这篇文章。期望您觉得它风趣且信息丰厚。
本文在如此众生(https://yylives.cc/)首发,欢迎我们拜访。
刘云涛 封面新闻记者 陈远扬“我其时真想着手打他,骗了我那么久,那么多钱。”回想起两个月前初次与网恋“女友”张某碰头时的场景,华某仍非常气愤。网恋一年,华某不断下降对女友心思预期,从开端的“美人舞蹈教...
电影界的得奖专业户,公然名不虚传。5月23日,第十八届、十九届中国电影华表奖颁奖仪式在北京举办,闻名男艺人张译凭仗电影《我和我的祖国》,收成第十八届中国电影华表奖优异男艺人荣誉。至此,张译成果了华表奖、金鸡奖、百花奖中国内地三大电影节“大满贯”。
极目新闻记者 戎钰电影界的得奖专业户,公然名不虚传。5月23日,第十八届、十九届中国电影华表奖颁奖仪式在北京举办,闻名男艺人张译凭仗电影《我和我的祖国》,收成第十八届中国电影华表奖优异男艺人荣誉。至此...
继昨日发布通用具身智能大模型GO-1后,智元机器人今天再发新品“第二弹”——双足人形机器人灵犀X2。智元机器人创始人彭志辉(稚晖君)介绍,灵犀X2具有三方面特性:支撑高自由度运动才能、搭载情感核算引擎...
北京时间8月7日,我国男乒在巴黎奥运会男人集体第二轮中遭受老对手韩国队,以3比0打败对手,晋级4强。中、韩两队是亚洲传统劲旅,也是大赛中的老对手。上一年平昌亚锦赛和杭州亚运会,我国队都以3比0完胜对手...
嘿,各位游戏达人和像素爱好者们!今天要和大家聊一聊让人沉迷不已的时间静止像素游戏v387。时光倒流,细数经典像素风带来的创新玩法和流畅体验,你绝对不能错过哦! 先...
02:03清明节曩昔一周了,但在马来西亚“我国山”,依然能够见到当地华人的祭祀上坟活动。马来西亚华人为何注重清明节?12000余座我国式坟茔,书写着"笑傲示不平"的抗日碑铭,华人们在石碑上用汉字书写着...