Kubernetes(k8s)-日志(logs)和exec内部逻辑

作者介绍:简历上没有一个精通的运维工程师。请点击上方的蓝色《运维小路》关注我,下面的思维导图也是预计更新的内容和当前进度(不定时更新)。

我们上一章介绍了Docker基本情况,目前在规模较大的容器集群基本都是Kubernetes,但是Kubernetes涉及的东西和概念确实是太多了,而且随着版本迭代功能在还增加,笔者有些功能也确实没用过,所以只能按照我自己的理解来讲解。

前面介绍Kubernetes的时候,经常使Kubectl命令,都是直接操作的kube-apiserver,但是今天这2个命令实际操作对象的是Pod,而Pod分布在不同的Node节点,所以需要搞清楚他们的原理,方便更好运维Kubernetes集群。

在我们日常运维当中,经常需要看容器日志或者进入容器,Docker里面我们使用的参数是logs和exec。Kubernetes里面使用Kubectl命令也有2个同样的参数,但是他们内部逻辑是什么呢?如果有什么问题应该怎么排查呢?所以我们需要对它有一定的理解才可以。

1.进入容器exec

scss 复制代码
kubectl exec -it xxx -n xxxx  sh(或者bash)

xxx 代表是Pod名字。

-n xxxx 代表是命名空间,如果是默认命名空间(default)可以省略。

sh或者bash则需要看容器里面有什么。根据经验大部分容器都有bash和sh;极少部分只有sh;还有特殊容器bash和sh都没有,也就无法通过该方式进入。

进入以后就和使用Docker exec进入容器是一样的效果。可以看到容器里面的文件和ip等信息。

2.查看日志logs

shell 复制代码
#和linux命令tail效果基本是一样的
#从头显示到结尾
kubectl   logs xxx -n xxxx
#持续显示kubectl   logs -f xxx -n xxxx 

xxx 代表是Pod名字。

-n xxxx 代表是命名空间,如果是默认命名空间(default)可以省略。

还需要特别注意一点,无论是log还是exec的参数,如果是针对单容器的Pod是没问题的,如果是多容器的Pod则需要添加另外一个参数 -c xxxx,指的就是容器或者说containerd的名字。-p参数的含义是如果上一个容器因为故障崩溃了,然后重启启动了一个新的容器,使用-p参数可以看到上一个崩溃容器的日志(等效于在Docker里面先找到退出容器的ID,然后查看这个容器的日志)。

r 复制代码
kubectl   logs xxx -n xxxx -c xxxxx
#查看退出pod的日志
kubectl   logs -f xxx -n xxxx -p
kubectl exec -it xxx -n xxxx -c xxxxx  sh(或者bash)

我们在部署集群的时候,有个操作是把 /etc/kubernetes/admin.conf文件复制到/root/.kube/config的操作,实际上这个文件就是kubectl文件的配置文件,这个配置文件决定了kubectl去连接谁。从这个配置文件上可以看到我们kubectl的所有操作都是连接到kube-apiserver的,那它是怎么连接到不同节点的的容器呢?

Node节点的kubelet显示从kube-apiserver有连接过来,正常是kubelet主动向kube-apiserver汇报自己的状态,只有当使用logs和exec的时候kube-apiserver才会主动向kubelet发起连接。

bash 复制代码
[root@node01 ~]# netstat -lnpa |grep 10250
tcp6       0      0 :::10250                :::*                    LISTEN      26156/kubelet       
tcp6       0      0 192.168.31.212:10250    192.168.31.211:55594    ESTABLISHED 26156/kubelet 

根据端口查看连接客户端

bash 复制代码
[root@master01 ~]# netstat -lnpa |grep 55594
tcp        0      0 192.168.31.211:55594    192.168.31.212:10250    ESTABLISHED 10900/kube-apiserve 

如果终止logs和exec命令,则这个网络连接就会消失,所以这两个功能可能出现问题的地方就是:kube-apiserver连接kubelet的10250端口或者kubelet连接容器运行时。尤其是kube-apiserver连接kubelet的10250端口,因为这个连接都是通过网络连接,网络连接异常就会出现问题,这个问题在生产环境也遇到过。

这里有个疑惑的点,我也一直没太研究明白。kubelet的监听的10250是属于https端口,使用的证书是文件:/var/lib/kubelet/pki/kubelet.crt和kubelet.key,这个证书默认是1年有效期。但是在我以前运维的环境中,多次发现这个证书过期,但是也并没有影响logs和exec命令的使用。

运维小路

一个不会开发的运维!一个要学开发的运维!一个学不会开发的运维!欢迎大家骚扰的运维!

关注微信公众号《运维小路》获取更多内容。

相关推荐
一技安身9 小时前
【Docker】 镜像导出 & 导入,实验环境aarch64(arm64)Linux操作系统
linux·docker·容器
代码村新手9 小时前
Linux调试器-gdb的使用
linux
新时代牛马10 小时前
PCI与PCIe 硬件原理、配置空间/BAR 与 Linux 驱动完整篇:从 LTSSM、TLP 到 ECAM 与probe
java·linux·服务器
两点王爷12 小时前
解决 Linux 中 version `CXXABI_1.3.8‘ not found 报错
linux·运维·服务器
xx~t12 小时前
嵌入式——51单片机1
linux·c语言·单片机·嵌入式硬件·51单片机
啦啦啦啦啦zzzz12 小时前
利用RAII机制进行日志的采集
linux·服务器·c++·网络编程·c++20
0+11112 小时前
Linux --线程概念与控制
linux·运维·服务器·jvm
nLif12 小时前
基于GTK的简易MFC对话框兼容层 -- MfcToGTK
linux·c++·mfc·gtk
宽海智能仓储物流13 小时前
航发自动化立体库异构系统改造:宽海智能30天联调技术全解析
运维·数据仓库·自动化
鹤落晴春13 小时前
【K8s】从 ConfigMap 到 Argo CD:Kubernetes 配置管理链路
运维·云原生·容器·kubernetes