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命令的使用。

运维小路

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

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

相关推荐
I · T · LUCKYBOOM3 分钟前
21.Linux网络设置
linux·运维·网络
Likeyou74 分钟前
关于Linux下的Oracle的rman备份操作指南
linux·运维·oracle
峰顶听歌的鲸鱼8 分钟前
13.docker部署
linux·运维·笔记·docker·容器·云计算
橘子编程10 分钟前
仓颉语言变量与表达式解析
java·linux·服务器·开发语言·数据库·python·mysql
虚神界熊孩儿16 分钟前
linux下创建用户和用户组
linux·运维·服务器
hhwyqwqhhwy18 分钟前
linux 驱动 rtc
linux·运维·实时音视频
python百炼成钢20 分钟前
53.Linux regmap驱动框架
linux·运维·服务器·驱动开发
python百炼成钢23 分钟前
54.Linux IIO驱动框架
linux·运维·服务器·驱动开发
纷飞梦雪24 分钟前
ubuntu22开启root
linux·运维·ubuntu