掌握 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 ...
随机推荐
- OpenCV计算机视觉学习(14)——浅谈常见图像后缀(png, jpg, bmp)的区别(opencv读取语义分割mask的坑)
如果需要处理的原图及代码,请移步小编的GitHub地址 传送门:请点击我 如果点击有误:https://github.com/LeBron-Jian/ComputerVisionPractice 本来 ...
- unity协程(IEnumerator)开始和结束
快速阅览: 一.结束协程无效:协程方法需要单独存一份地址,在开始和结束不直接传入方法名,而是使用这份保存的地址进行开始和结束. 二.再次开启协程时少跑了几行代码:再次开始同一个方法名的协程时,不是从第 ...
- 在VS Code 中调试远程服务器的PHP代码
背景 对于PHP的调试,一般来说我们用 echo 和 var_dump 就够用了. 有时会碰到要解决复杂的逻辑或需要确认代码的运行顺序,这里用var_dump效率就比较低了,这时建议用断点的方式进行代 ...
- MyBatis 常用工具类
SQL 类 MyBatis 提供了一个 SQL 工具类,使用这个工具类,我们可以很方便在 Java 代码动态构建 SQL 语句 String newSql = new SQL() ({ SELECT( ...
- peewee模块更改数据-sqlite
更改数据 from playhouse.migrate import *# SQLite example: my_db = SqliteDatabase('my_database.db') migra ...
- CentOS7升级python3到最新版
前言 最近在学习sanic,需要python3.7以上的版本,而centos7默认的python版本是3.6.8,所以升级了一下版本,在此笔录. 步骤 首先,从python官网下载最新版的python ...
- SpringBoot3文件管理
目录 一.简介 二.工程搭建 1.工程结构 2.依赖管理 三.上传下载 1.配置管理 2.上传下载 四.Excel文件 1.Excel创建 2.Excel读取 3.解析监听 4.导入导出 五.参考源码 ...
- Eolink 出席 QECon 大会,引领「AI+API」技术的革新浪潮
7月28日-29日,第八届 QECon 质量效能大会在北京成功召开.大会聚焦"数生智慧,高质量发展新引擎",深入探讨如何利用数字化和智能化技术推动软件质量的发展,进而为高质量的经济 ...
- 6、Mybatis之高级查询
6.1.创建接口.映射文件和测试类 ++++++++++++++++++++++++++分割线++++++++++++++++++++++++++ 注意namespace属性值为对应接口的全限定类名 ...
- 组合查询(left_inner_right)与排序(order by _DESC _ASC)在题目中的应用
1,想要让哪一列放在开头或者结尾,只需要将select中的查询位置放在最开始或者结尾即可: 2,组合查询要注意使用 on 加上组合条件: 3,order by 默认升序(ASC),降序使用:order ...