掌握 Kubernetes 故障排除:有效维护集群的最佳实践和工具
Kubernetes 是一款管理容器化应用程序的强大工具。然而,与任何复杂的系统一样,使用它时也可能出错。当问题出现时, 掌握有效的故障排除技术和工具非常重要。
本文将介绍以下步骤,助您了解事件收集的入门知识:
- 检索最新事件
- 使用 Pod 模拟问题
- 在位于 PV 的 Pod 中存储事件
检索最新事件
对 Kubernetes 集群进行故障诊断的第一步是检索最新的事件。 Kubernetes 中的事件由集群中的各种组件和对象(如 Pod、节点和服务)生成。它们可提供有关集群状态和可能发生的任何问题的信息。
要检索最新事件,可以使用 Kubectl get events 命令。这将显示集群中所有事件的列表。
kubectl get events
LAST SEEN TYPE REASON OBJECT MESSAGE
78s Warning BackOff pod/bbb Back-off restarting failed container
72s Warning BackOff pod/bbb2 Back-off restarting failed container
12m Normal Pulling pod/bbb3 Pulling image "busybox"
12m Normal Created pod/bbb3 Created container bbb3
46m Normal Started pod/bbb3 Started container bbb3
如上所示,它按 时间排序 显示了集群中所有通信口的列表。您还可以添加 -w 标记,以观察新事件发生的变化。
这将显示集群中发生事件的实时状态。通过观察事件,您可以 快速识别可能发生的任何问题。
虽然 kubectl get events 命令有助于检索事件,但如果事件按时间顺序显示,则很难识别问题。为了更容易识别问题,您可以按照 metadata.creationTimestamp 对事件进行排序。
kubectl get events --sort-by=.metadata.creationTimestamp
LAST SEEN TYPE REASON OBJECT MESSAGE
104s Normal Pulling pod/busybox13 Pulling image "busybox"
88s Warning FailedScheduling pod/mysqldeployment-6f8b755598-phgzr 0/2 nodes are available: 2 Insufficient cpu. preemption: 0/2 nodes are available: 2 No preemption victims found for incoming pod.
104s Warning BackOff pod/busybox6 Back-off restarting failed container
82s Warning ProvisioningFailed persistentvolumeclaim/pv-volume storageclass.storage.k8s.io "csi-hostpath-sc" not found
82s Warning ProvisioningFailed persistentvolumeclaim/pv-volume-2 storageclass.storage.k8s.io "csi-hostpath-sc" not found
如上所示,按 metada.creationTimestamp 排序显示集群中所有事件的列表。通过这种方式对通信口进行排序,您可以快速识别最近的事件和可能出现的任何问题。
使用 Pod 模拟问题
如果您发现存在 与联网或服务发现相关的问题, 终止 kube-proxy pod 可能会有帮助。 kube-proxy pod 负责集群中的联网和服务发现,因此终止它有助于识别与这些功能相关的任何问题。
要终止 kube-proxy pod,可以使用 kubectl delete pod 命令。如果您需要指定 kube-proxy pod 的名称,可以使用 kubectl get pods 命令找到它。
kubectl get pods -n kube-system
NAME READY STATUS RESTARTS AGE
coredns-57575c5f89-66z2h 1/1 Running 1 (45h ago) 36d
coredns-57575c5f89-bcjdn 1/1 Running 1 (45h ago) 36d
etcd-k81 1/1 Running 1 (45h ago) 36d
fluentd-elasticsearch-5fdvc 1/1 Running 2 (45h ago) 60d
fluentd-elasticsearch-wx6x9 1/1 Running 1 (45h ago) 60d
kube-apiserver-k81 1/1 Running 1 (45h ago) 36d
kube-controller-manager-k81 1/1 Running 2 (45h ago) 36d
kube-proxy-bqpb5 1/1 Running 1 (45h ago) 36d
kube-proxy-q94sk 1/1 Running 1 (45h ago) 36d
kube-scheduler-k81 1/1 Running 2 (45h ago) 36d
metrics-server-5c59ff65b6-s4kms 1/1 Running 2 (45h ago) 58d
weave-net-56pl2 2/2 Running 3 (45h ago) 61d
weave-net-rml96 2/2 Running 5 (45h ago) 62d
如上,将显示 Kube 系统命名空间中所有 pod 的列表,其中包括 kube-proxy pod。获得 kube-proxy pod 的名称后,就可以使用 kubectl delete pod 命令将其删除。
kubectl delete pod -n kube-system kube-proxy-q94sk
这将删除 kube-system 命名空间中的 kube-proxy pod。Kubernetes 会自动创建一个新的 kube-proxy pod 来替代它。
您可以使用以下命令检查事件:
kubectl get events -n=kube-system --sort-by=.metadata.creationTimestamp
LAST SEEN TYPE REASON OBJECT MESSAGE
4m59s Normal Killing pod/kube-proxy-bqpb5 Stopping container kube-proxy
4m58s Normal Scheduled pod/kube-proxy-cbkx6 Successfully assigned kube-system/kube-proxy-cbkx6 to k82
4m58s Normal SuccessfulCreate daemonset/kube-proxy Created pod: kube-proxy-cbkx6
4m57s Normal Pulled pod/kube-proxy-cbkx6 Container image "registry.k8s.io/kube-proxy:v1.24.11" already present on machine
在位于 PV 的 Pod 中存储事件
将事件存储在位于 PV 中的 Pod,是跟踪 Kubernetes 集群中所发生事件的有效方法。下面是关于如何操作的分步讲解:
为 Pod 添加权限
要在 pod 中连接 Kubernetes API,您需要赋予它适当的权限。下面是一个将权限绑定到 pod 的 YAML 文件示例。
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
name: event-logger
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: cluster-admin
subjects:
- kind: ServiceAccount
name: default
namespace: default
创建持久加密卷 (PV) 和持久加密卷声明 (PVC)
现在我们已经设置好 ClusterRoleBind,可以创建一个持久卷来存储我们的事件。下面是一个使用 hostPath 创建 PC 的 YAML 文件示例:
# pv.yaml
apiVersion: v1
kind: PersistentVolume
metadata:
name: my-pv
spec:
capacity:
storage: 1Gi
accessModes:
- ReadWriteOnce
hostPath:
path: /mnt/data
---
# pvc.yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: my-pvc
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 1Gi
volumeName: my-pv
创建 Pod 以收集事件
现在,我们已经设置好 PV 和 PVC,可以创建 Pod 来收集事件了。下面是一个 YAML 文件示例,用于创建一个 Pod,在 Pod 中连接到 Kubernetes API,并将所有事件存储到文件 events.log 中。
apiVersion: v1
kind: Pod
metadata:
name: event-logger
spec:
containers:
- name: event-logger
image: alpine
command: ["/bin/sh", "-c"]
args:
- |
apk add --no-cache curl jq && while true; do
EVENTS=$(curl -s -k -H "Authorization: Bearer $(cat /var/run/secrets/kubernetes.io/serviceaccount/token)" https://${KUBERNETES_SERVICE_HOST}/api/v1/events | jq -r '.items[]')
if [ -n "$EVENTS" ]; then
echo "$EVENTS" >> /pv/events.log
fi
sleep 10
done
volumeMounts:
- name: event-log
mountPath: /pv
- name: sa-token
mountPath: /var/run/secrets/kubernetes.io/serviceaccount
readOnly: true
volumes:
- name: event-log
persistentVolumeClaim:
claimName: my-pvc
- name: sa-token
projected:
sources:
- serviceAccountToken:
path: token
expirationSeconds: 7200
- configMap:
name: kube-root-ca.crt
该 Pod 将运行一个安装了 curl 和 jq 的简单 shell 脚本,使用 event-logger ClusterRoleBinding 连接到 Kubernetes API,并将所有事件存储在 /pv/events.log 中。
可以运行以下命令检查事件:
kubectl exec event-logger -- cat /pv/events.log
通过使用这些故障排除技术和工具,您可以 保持 Kubernetes 集群的健康和平稳运行。检索最新事件、模拟问题并将事件存储在位于 PV 中的 pod 中,是有效维护集群的基本步骤。随着您对 Kubernetes 的使用经验越来越丰富,您可以探索更高级的工具,如用于分析事件的 Kibana、Prometheus 或 Grafana,以及集中式日志记录解决方案,如 Elasticsearch 或 Fluentd。
掌握 Kubernetes 故障排除:有效维护集群的最佳实践和工具的更多相关文章
- 《DevOps故障排除:Linux服务器运维最佳实践》读书笔记
首先,这本书是Linux.CN赠送的,多谢啦~ http://linux.cn/thread-12733-1-1.html http://linux.cn/thread-12754-1-1.html ...
- TKE 集群组建最佳实践
Kubernetes 版本 Kubernetes 版本迭代比较快,新版本通常包含许多 bug 修复和新功能,旧版本逐渐淘汰,建议创建集群时选择当前 TKE 支持的最新版本,后续出新版本后也是可以支持 ...
- Mesos+Zookeeper+Marathon+Docker分布式集群管理最佳实践
参考赵班长的unixhot以及马亮blog 笔者QQ:572891887 Linux架构交流群:471443208 1.1Mesos简介 Mesos是Apache下的开源分布式资源管理框架,它被称为分 ...
- [转载] Redis集群搭建最佳实践
转载自http://blog.csdn.net/sweetvvck/article/details/38315149?utm_source=tuicool 要搭建Redis集群,首先得考虑下面的几个问 ...
- Redis集群搭建最佳实践
要搭建Redis集群.首先得考虑以下的几个问题; Redis集群搭建的目的是什么?或者说为什么要搭建Redis集群? Redis集群搭建的目的事实上也就是集群搭建的目的.全部的集群主要都是为了解决一个 ...
- kubernetes 故障排除、处理、预防
kubernetes 故障排除.处理.预防 故障排除顺序和思路 第一步: 我们可以通过查看节点是否正常,一是保证 K8S API Server 是正常的,二是可以查看节点集群网络中是否存在节点异常.如 ...
- kubernetes kubeadm部署高可用集群
k8s kubeadm部署高可用集群 kubeadm是官方推出的部署工具,旨在降低kubernetes使用门槛与提高集群部署的便捷性. 同时越来越多的官方文档,围绕kubernetes容器化部署为环境 ...
- Kubernetes 部署 Nebula 图数据库集群
Kubernetes 是什么 Kubernetes 是一个开源的,用于管理云平台中多个主机上的容器化的应用,Kubernetes 的目标是让部署容器化的应用简单并且高效,Kubernetes 提供了应 ...
- 集群通信组件Tribes之如何维护集群成员信息
一个集群包含若干成员,要对这些成员进行管理就必须要有一张包含所有成员的列表,当要对某个节点做操作时通过这个列表可以准确找到该节点的地址进而对该节点发送操作消息.如何维护这张包含所有成员的列表是本节要讨 ...
- Gravitational Teleport 开源的通过ssh && kubernetes api 管理linux 服务器集群的网关
Gravitational Teleport 是一个开源的通过ssh && kubernetes api 管理linux 服务器集群的网关 支持以下功能: 基于证书的身份认证 ssh ...
随机推荐
- 2023-07-09:给定N、M两个参数, 一共有N个格子,每个格子可以涂上一种颜色,颜色在M种里选, 当涂满N个格子,并且M种颜色都使用了,叫一种有效方法。 求一共有多少种有效方法。 1 <= N,
2023-07-09:给定N.M两个参数, 一共有N个格子,每个格子可以涂上一种颜色,颜色在M种里选, 当涂满N个格子,并且M种颜色都使用了,叫一种有效方法. 求一共有多少种有效方法. 1 <= ...
- 前端关于table的设置
表格超长度后加... table{ table-layout:fixed; } td{ overflow:hidden; text-overflow:ellipsis; white-space:now ...
- YOLOX目标检测实战:LabVIEW+YOLOX ONNX模型实现推理检测(含源码)
目录 前言 一.什么是YOLOX 二.环境搭建 1.部署本项目时所用环境: 2.LabVIEW工具包下载及安装: 三.模型的获取与转化[推荐方式一] 1.方式一:直接在官网下载yolox的onnx模型 ...
- 【Java】工具类 -- 持续更新
Java原生工具类 Objects requireNotNull():为空抛异常,不为空返回本身 deepEquals():对象深度相等(数组层面)判断 调用Arrays.deepEquals0() ...
- Redis核心技术与实践 03 | 高性能IO模型:为什么单线程Redis能那么快?
原文地址:https://time.geekbang.org/column/article/268262 个人博客地址:http://njpkhuan.cn/archives/redis-he-xin ...
- 使用Locust进行性能测试
当涉及到评估应用程序或服务的性能时,Locust是一个功能强大且易于使用的开源工具.本文将介绍Locust的基本概念和使用方法. 什么是Locust? Locust是一个用于编写.运行和分析负载测试的 ...
- YUM histoy 与 RPM -qa --last
查看Linux yum安装包的安装时间,可以使用以下命令: rpm -qa --last 该命令将显示已安装的所有rpm包及其安装日期和时间. 可以使用管道符 '|' 和 grep 命令来查找特定的包 ...
- vue项目node_modules文件过大问题
node_modules目录下.cache下最大文件删除即可(vue-loader)
- 一文了解react中定义样式(css/less/sass)的常用方法
react中通过jsx的语法方式,将html标签和js语法联系在一起,而css的编写方式,没有明确的指定编写方式,目前就有很多不同方法,每个方式各有其优缺点,我们一起来看看常用的定义方式有哪些. 最基 ...
- 服务端不回应客户端的syn握手,连接建立失败原因排查
背景 测试环境有一个后台服务,部署在内网服务器A上(无外网地址),给app提供接口.app访问这个后台服务时,ip地址是公网地址,那这个请求是如何到达我们的内网服务器A呢,这块我咨询了网络同事,我画了 ...