用8个命令调试Kubernetes集群
如果使用任何系统的时间足够长,那么你肯定必须对其进行调试,Kubernetes也不例外。它是一个分布式系统,有许多运动部件。我们将介绍8个可以运行以调试任何Kubernetes集群的命令。
它将帮助你了解集群,并确保核心功能,运行pods可用。
假设你有集群的管理员权限,收到一个kubeconfig文件可以访问集群,并且你被告知集群已损坏。我们可以从下面8个命令调试Kubernetes。
1.kubectl version -short
通过这个命令,我们可以查看API服务器正在运行的版本。这为我们以后在对特定错误进行故障排除时提供了重要信息,对了解是否在1.16这样的旧集群上非常有用。
了解版本也可以帮助我们搜索错误和阅读变更日志。可能存在需要版本升级或新引入错误的已知问题。不同组件之间有时会存在版本兼容性问题,了解正在运行的版本是第一步。
2.kubectl cluster-info
接下来,我们应该了解集群在哪里运行,以及CoreDNS是否在运行。你可以解析控制平面URL,以了解你是在处理托管集群还是内部部署。
在这个示例输出中,我们可以看出我们正在美国东部2地区运行一个Amazon Elastic Kubernetes Service(Amazon EKS)集群。如果你的供应商当前发生停机,此信息也有助于查找。你可以查看供应商的“服务运行状况”仪表板,以了解当前的问题是与集群有关还是与集群无关。
这还可以为集群是否需要额外的身份验证提供线索。可能存在AWS Identity和访问管理(IAM)权限问题,或者需要安装类似aws-iam-authenticator的身份验证插件。
3.kubectl get componentstatus
此命令是发现调度器、控制器管理器和etcd节点是否正常的最简单方法。这些都是运行pod的关键控制平面组件。你应该查找任何未显示“ok”状态的组件,并查找一切错误。
如果你使用的集群具有托管控制平面(例如Amazon EKS),则可能无法直接访问调度器或控制器管理器。能够从这个输出中看到它们的状态可能是了解etcd或其他组件是否有问题的最简单方法。
还需要注意的是,CLI中弃用了componentstatus命令,但尚未删除。目前没有此命令的替代品,但在将其从CLI中删除之前,它是安全的,非常有用。根据集群的不同,可能需要多个命令才能获得类似的输出。此命令存在设计限制,这就是它被弃用的原因。
查看其他健康端点(包括etcd)的另一个选择是kubectl get--raw'/healthz?verbose':
尽管此命令不显示调度器或控制器管理器输出,但它添加了许多额外的检查,如果出现问题,这些检查可能很有价值。
4.kubectl api-resource -o wide -sort-by name
这是第一个包含大量信息的命令。我们已经知道集群运行的版本和位置。此时,我们应该知道控制平面是否正常,现在需要查看集群中的一些资源。
为了保持一致性,笔者喜欢列出所有按名称排序的资源,更容易按字母顺序扫描资源。添加-o wide将显示每个资源上可用的verb。这可能很重要,因为有些资源比其他资源做得更多。了解哪些可用,哪些不可用,将有助于缩小查找错误的范围。
使用此命令将告诉你集群中安装了哪些CRD(自定义资源定义)以及每个资源的API版本。这可以让你深入了解控制器或工作负载定义上的日志。你的工作负载可能使用旧的alpha或beta API版本,但集群可能只使用v1或apps/v1。
5.kubectl get events -A
我们已经了解了集群中运行的是什么,接下来应该看看发生了什么。如果最近发生了故障,你可以查看集群事件,了解故障前后发生了什么。如果你知道某个特定命名空间中只有一个问题,那么可以将事件过滤到该命名空间中,并排除健康服务中的一些额外干扰。
有了这个输出,你应该关注输出的类型、原因和对象。通过这三条信息,你可以缩小要查找的错误以及可能配置错误的组件的范围。
6.kubectl get nodes -o wide
节点是Kubernetes内部的一级资源,也是pods运行的基础。使用-o-wide选项将告诉我们其他细节,如操作系统(OS)、IP地址和容器运行时。你首先要看的是状态。如果节点没有说“就绪”,你可能会遇到问题,但并非总是如此。
查看节点的年龄,查看状态和年龄之间是否存在任何关联。可能只有新节点出现问题,因为节点镜像中发生了更改。该版本将帮助你快速了解kubelet上是否存在版本偏差,并且可能由于kubelet和API服务器之间的版本不同而存在已知错误。
如果你看到子网之外的IP地址,则内部IP可能很有用。可能是节点以错误的静态IP地址启动,并且CNI无法将流量路由到工作负载。
OS镜像、内核版本和容器运行时都是导致问题的可能差异的重要指标。你可能只有特定操作系统或运行时有问题。这些信息将帮助你快速关注潜在的问题,并知道在哪里可以更深入地查看日志。
7.kubectl get pods -A -o wide
这是最后一个信息收集命令。与列表节点一样,你应该首先查看status列并查找错误。ready列将显示需要多少pod以及有多少正在运行。
使用-A将列出所有命名空间中的pod,-o-wide将显示IP地址、节点以及pod的指定位置。使用列表节点中的信息,你可以查看哪些pod在哪些节点上出现故障。将这些信息与操作系统、内核和容器运行时等细节相关联,可能会提供修复集群所需的洞察。
8.kubectl run a -image alpine -command — /bin/sleep 1d
有时候,调试某些东西的最佳方法是从最简单的示例开始。这个命令没有任何直接输出,但你应该可以从中看到一个名为“a”的正在运行的pod。
如果没有与其他人一起调试某些东西,笔者喜欢将调试容器命名为单个字母,因为这样可以更快地键入,并且很容易进行迭代(例如b、c、d)。笔者喜欢在调试时保留旧的容器,因为有时查看与以前的pod有什么不同会很有帮助,让它们运行或崩溃比搜索终端输出历史记录更容易。
如果由于某种原因,你没有从该命令中看到正在运行的pod,那么使用kubectl descripte po a是下一个最佳选择。查看事件,找出可能出错的错误。
使用这些命令,你应该能够开始使用任何集群,并知道它是否足够健康,可以运行工作负载。还有其他需要考虑的事情,如CoreDNS缩放、负载均衡、卷,以及中央日志记录和度量。这些命令应该可以在云中或内部部署中工作。
如果需要对节点或外部资源(例如负载均衡器)进行故障排除,则应查看控制器和API服务器日志以查找错误。根据损坏的内容,你可能需要查看kube-proxy、CNI插件或服务网格sidecar容器日志。
这8条命令能帮助你缩小集群中可能出现的问题的范围。如果你不知道问题是什么,那么从广度优先搜索开始是最好的方法。请注意不匹配的版本和不同的节点或设置的异常情况。如果你查找发生了什么变化,它可以指出正确的方向,快速发现并解决问题。
转载:https://www.tuicool.com/wx/em2UjyY
用8个命令调试Kubernetes集群的更多相关文章
- Kubernetes — 从0到1:搭建一个完整的Kubernetes集群
准备工作 首先,准备机器.最直接的办法,自然是到公有云上申请几个虚拟机.当然,如果条件允许的话,拿几台本地的物理服务器来组集群是最好不过了.这些机器只要满足如下几个条件即可: 满足安装 Docker ...
- K8s 二、(1、kubeadm部署Kubernetes集群)
准备工作 满足安装 Docker 项目所需的要求,比如 64 位的 Linux 操作系统.3.10 及以上的内核版本: x86 或者 ARM 架构均可: 机器之间网络互通,这是将来容器之间网络互通的前 ...
- 以对话的形式管理你的Kubernetes集群
BotKube BotKube 是一个用于监控和调试 Kubernetes 集群的消息传递工具. BotKube 可以与多个消息传递平台(如 Slack.Mattermost 或 Microsoft ...
- 手把手从0到1:搭建Kubernetes集群
搭建 k8s 集群网上很多教程,如果是手工部署或者实验环境可以直接使用 MiniKube 或者 Kind,来在本地启动简单的 Kubernetes 集群进行后面的学习即可.如果是使用 MiniKube ...
- kubernetes集群管理之通过jq来截取属性
系列目录 首先要声明,这里的jq并不是批前端框架里的jquery,而是一个处理json的命令行工具. jq工具相比yq,它更加成熟,功能也更加强大,主要表现在以下几个方面 支持递归查找(我点对我们平时 ...
- Kubernetes集群管理工具kubectl命令技巧大全
一. kubectl概述 Kubectl是用于控制Kubernetes集群的命令行工具,通过kubectl能够对集群本身进行管理,并能够在集群上进行容器化应用的安装部署. kubectl命令的语法如下 ...
- Kubernetes集群的监控报警策略最佳实践
版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/M2l0ZgSsVc7r69eFdTj/article/details/79652064 本文为Kub ...
- Gitlab CI 集成 Kubernetes 集群部署 Spring Boot 项目
在上一篇博客中,我们成功将 Gitlab CI 部署到了 Docker 中去,成功创建了 Gitlab CI Pipline 来执行 CI/CD 任务.那么这篇文章我们更进一步,将它集成到 K8s 集 ...
- 【转载】浅析从外部访问 Kubernetes 集群中应用的几种方式
一般情况下,Kubernetes 的 Cluster Network 是属于私有网络,只能在 Cluster Network 内部才能访问部署的应用.那么如何才能将 Kubernetes 集群中的应用 ...
随机推荐
- 【LeetCode】1465. 切割后面积最大的蛋糕 Maximum Area of a Piece of Cake After Horizontal and Vertical Cuts
作者: 负雪明烛 id: fuxuemingzhu 个人博客:http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 找最大间隔之积 日期 题目地址:https://lee ...
- 【LeetCode】221. Maximal Square 解题报告(Python & C++)
作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 动态规划 日期 题目地址: https://leet ...
- hdu 4704 Sum(组合,费马小定理,快速幂)
题目链接http://acm.hdu.edu.cn/showproblem.php?pid=4704: 这个题很刁是不是,一点都不6,为什么数据范围要开这么大,把我吓哭了,我kao......说笑的, ...
- P1753HackSon的趣味题
1 #include<stdio.h> 2 #include<algorithm> 3 #include<iostream> 4 #include<stdli ...
- 「实用」打造自我感觉非常漂亮的Mac终端
背景 (今天我是一个美妆博主) 突然发现自己使用的iterm2终端样式有些朴素,为了让她看起来花枝招展的,我决定给她打扮打扮.毕竟每天面对她的时间比对象还多-- 效果对比 因为每个人的喜好都不一样,所 ...
- 《HelloGitHub》第 69 期
兴趣是最好的老师,HelloGitHub 让你对编程感兴趣! 简介 HelloGitHub 分享 GitHub 上有趣.入门级的开源项目. https://github.com/521xueweiha ...
- 为什么加密后的数据往往都是base64输出而不是hex16进制输出
通常加密后的数据都是字节数组,比如流行的aes128对称加密,还有Rsa非对称加密,加密后得到了一个字节数组,这个字节数组存在内存中,往往我们需要输出得到我们人眼能看到的字符. 加密aes(xxx) ...
- 《python-美藏篇》1.可迭代、迭代器与生成器
首先区分可迭代对象(Iterable).迭代器(Iterator) 可迭代对象:包含__iter__方法的对象为可迭代对象,如List.Tuple.Dictionary 迭代器:包含__iter__. ...
- Elasticsearch安装X-Pack插件
Elasticsearch安装X-Pack插件, 基于已经安装好的6.2.2版本的Elasticsearch, 安装6.2.2版本的X-Pack插件. 1.下载x-pack的zip包到本地 https ...
- 图解MongoDB集群部署原理(3)
MongoDB的集群部署方案中有三类角色:实际数据存储结点.配置文件存储结点和路由接入结点. 连接的客户端直接与路由结点相连,从配置结点上查询数据,根据查询结果到实际的存储结点上查询和存储数据.Mon ...