首页 > 其他分享 >从K8s的“临时容器”看K8s设计的厉害之处

从K8s的“临时容器”看K8s设计的厉害之处

时间:2024-07-26 10:42:00浏览次数:15  
标签:容器 -- 厉害 Host 命令行 镜像 K8s

本文分享自华为云社区《从K8s的“临时容器”看K8s设计的厉害之处》,作者: tsjsdbd。

从一个容器的不足说起

容器概念出现时,有个非常重要的理念:容器中极简。

即容器里面只保留需要运行的进程就可以,其他一律不要安装。这也是为什么Docker出现的那时,有一篇文章《为什么不需要在Docker容器中运行sshd》经常被提及的原因。

但有时候Docker容器中缺少需要的软件。比如 curl,wget,ifconfig,ip,tcpdump 等基础软件包,遇到问题时,什么命令都敲不了,很是让人抓狂。平时定位问题的技术(各种Linux命令行工具),一点都用不上了。自己打的镜像倒还好,大不了重新打镜像把需要的工具也安装后,重新打镜像。但是如果是开源镜像就比较棘手。

如何在没有安装软件包的容器里面,执行需要的命令行(二进制工具)进行调试,一直是K8s平台的一个小遗憾。

我以前想K8s可以补充的功能

之前唐老师写过《跟唐老师学习云网络 - nsenter魔法棒》,我还想着:可以利用Host上面的命令行呀,通过nsenter跳到容器里面,不就可以执行了么。

当年还幻想可以给K8s提点proposal:让exec命令增加 --from-host 参数,当带上这个参数的时候,让kubelet直接从Host执行nsenter运行主机上面的二进制,这样就绕过了容器里面没有命令行的约束。方便管理员调试容器中相关问题。

想法似乎挺好,后面转战上层AI平台,并没有继续关注这么底层的了。直到最近看到K8s的新功能:“临时容器” (ephemeral containers)。发现K8s对某个特性的设计还是非常值得点赞的。

结果K8s实现的功能

K8s为了能在容器里面,执行不存在的命令行,增加了一个 kubectl debug命令

大致流程如下图:

其中红色容器,就是一个“临时容器”,它与目标容器共享各种namespace,所以与直接在目标容器中执行命令的效果是一样的。通过指定镜像地址,来控制这个新启动的“临时容器”里面包含自己所需要的各类命令行。

这样就可以在任意K8s的容器里面,执行不存在的命令行工具了。比如,对某Pod里面的名为app的容器执行调试:

kubectl debug -it -c debugger --target=app --image=busybox {POD_NAME}

--target参数,是指定Pod中需要调试的目标Container(有时Pod有多个Container)。

果然还是人家的更厉害

看完K8s的实现,明显比我早期想的 “借用Host” 方法更好:其仍然保持Host节点的“极简”,而是将需要的工具仍然保持由容器来承载。这样可以借用任意的容器镜像,而不必在Host节点上面安装各种工具包。非常优雅。

更“过分”的是,在节点上没有的命令行工具,也不需要给节点安装软件包,也可以通过临时容器来执行。

kubectl debug node/mynode -it --image=ubuntu

扩展性也很赞,确实考虑的挺周全。

So,启动“临时容器”来在目标容器中“整活”走起~

 

点击关注,第一时间了解华为云新鲜技术~

 

标签:容器,--,厉害,Host,命令行,镜像,K8s
From: https://www.cnblogs.com/huaweiyun/p/18324806

相关文章

  • 通过rancher部署k8s集群
    一、Rancher介绍Rancher是为使用容器的公司打造的容器管理平台。Rancher简化了使用Kubernetes的流程,开发者可以随处运行Kubernetes(RunKubernetesEverywhere),满足IT需求规范,赋能DevOps团队。Rancher可以创建来自Kubernetes托管服务提供商的集群,自动创建节点并安装K......
  • k8s证书续期10年
    现象通过kubeadm安装kubernetes集群时会存在一个证书问题:由kubeadm生成的客户端证书在1年后到期。随着kubernetes集群的使用,某一天证书过期了,此时kubernetes集群将无法正常使用,比如:kubectl命令执行会产生错误(Youmustbeloggedintotheserver(unauthorized))、......
  • 关于k8s中的pv和pvc无法绑定
    在一次申明pv和pvc时,发现两者怎么都无法绑定,以下是两个文件申明pvapiVersion:v1kind:PersistentVolumemetadata:name:my-pvspec:capacity:storage:5GiaccessModes:-ReadWriteManypersistentVolumeReclaimPolicy:RecyclestorageClassName:nfs......
  • 05、K8s安全
    3.1API资源对象NetworkPolicyNetworkPolicy用来控制Pod与Pod之间的网络通信,它也支持针对Namespace进行限制。基于白名单模式,符合规则的对象通过,不符合的拒绝应用场景:PodA不能访问PodB开发环境所有Pod不能访问测试命名空间提供对外访问时,限制外部IP官方NetworkPolic......
  • Velero backup and restore k8s cluster
    Velero部署及使用示例Velero是用于备份和恢复Kubernetes集群资源和PV的开源项目。基于VeleroCRD创建备份(Backup)和恢复作业(Restore)可以备份或恢复集群中的几乎所有对象,也可以按类型、名称空间或标签过滤对象支持基于文件系统备份(FileSystemBackup,简称FSB)备份Pod卷中的数......
  • Docker常用容器启动命令
    redisdockerrun-p6379:6379--nameredis2-vD:\Docker_Container\redis\conf\redis.conf:/etc/redis/redis.conf-vD:\Docker_Container\redis\data:/data-dredis:7.2.3redis-server/etc/redis/redis.conf--appendonlyyes-p6379:6379:将宿主机的6379端口......
  • STL 容器以及各函数及其复杂度
    主要是实质、函数、性质。如果没有特殊提出,那么是常数复杂度。vector相当于变长数组。支持随机访问(可以直接查询\(v_i\)),但是不任意位置\(O(1)\)插入。通常为了保证效率,只在末尾加入删除元素。size:返回实际长度(通常声明的长度会大于实际长度),也就是包含的元素个数。empty:......
  • 在K8S中,创建pod的过程是什么?
    在Kubernetes(K8S)中,创建一个Pod是一个涉及多个步骤的过程。Pod是Kubernetes中的基本部署单元,它封装了一个或多个容器(通常是Docker容器),这些容器共享存储、网络和生命周期。以下是创建Pod的详细过程:定义Pod资源:首先,需要定义一个Pod资源,通常通过编写一个YAML或JSON格式的配置文件......
  • 在K8S中,api-service 和 kube-schedule 高可用原理是什么?
    在Kubernetes(简称K8s)中,api-service和kube-scheduler的高可用原理是确保这些关键组件在部分节点或实例出现故障时,集群的整体功能和稳定性不受影响。下面分别详细解释这两个组件的高可用原理:1.APIServer高可用原理APIServer作为Kubernetes集群的API网关,负责接收来自用户和其他......
  • 在K8S中,节点故障pod驱逐pod过程,时间怎么定义的?
    在Kubernetes(K8S)中,节点故障导致Pod驱逐的过程是一个涉及多个组件和参数协同工作的复杂流程。这个过程的时间定义主要通过一系列参数来配置和确定。以下是该过程的详细解释以及时间定义的说明:一、节点故障检测节点控制器(NodeController)检查间隔:node-monitor-period:这是节点控......