临时容器 Ephemeral Containers

  1. 当由于容器崩溃或容器镜像不包含调试工具而导致 kubectl exec 无用时, 临时容器对于交互式故障排查很有用。
  2. 尤其是,Distroless 镜像 允许用户部署最小的容器镜像,从而减少攻击面并减少故障和漏洞的暴露。 由于 distroless
    镜像不包含 Shell 或任何的调试工具,因此很难单独使用 kubectl exec 命令进行故障排查。
  3. 使用临时容器时,启用 进程名字空间共享 很有帮助,可以查看其他容器中的进程。

开启临时容器功能

开启特性

1. master 节点配置 APIServer 组件
[root@vms120 ~]# cat /etc/kubernetes/manifests/kube-apiserver.yaml
- --feature-gates=EphemeralContainers=true
...2. master 节点配置 controller-manager
[root@vms120 ~]# vim /etc/kubernetes/manifests/kube-controller-manager.yaml
spec:containers:- command:- --feature-gates=EphemeralContainers=true            # 增加
...3. master 节点配置 kube-scheduler
[root@vms120 ~]# vim /etc/kubernetes/manifests/kube-scheduler.yaml
spec:containers:- command:- --feature-gates=EphemeralContainers=true            # 增加
# 重启服务
[root@vms120 ~]# systemctl restart kubelet.service4. 所有 node 节点配置 kubelet 参数
添加 --feature-gates=EphemeralContainers=true
[root@vms121 kubernetes]# cat /var/lib/kubelet/kubeadm-flags.env
KUBELET_KUBEADM_ARGS="--network-plugin=cni --pod-infra-container-image=registry.aliyuncs.com/google_containers/pause:3.6 --feature-gates=EphemeralContainers=true"
# 重启 node kubelet 服务
[root@vms121 kubernetes]# systemctl daemon-reload
[root@vms121 kubernetes]# systemctl restart kubelet

测试

1. 创建 pod
[root@vms120 ~]# kubectl run ephemeral-demo --image=registry.aliyuncs.com/google_containers/pause:3.2 --restart=Never
pod/ephemeral-demo created[root@vms120 ~]# kubectl  exec -it ephemeral-demo  -- sh
OCI runtime exec failed: exec failed: unable to start container process: exec: "sh": executable file not found in $PATH: unknown
command terminated with exit code 126
# 无法 kubectl exec

解决无法 exec ,我们创建一个临时容器添加到这个pod里

加上-i参数将直接进入添加的临时容器的控制台界面,因为是使用kubectl run 创建的pod ,所以需要-target 参数指定另一个容器的进程命名空间。因为 kubectl run 不能在它创建的pod中启用 共享进程命名空间

[root@vms120 ~]# kubectl debug -it ephemeral-demo --image=busybox --target=ephemeral-demo
Targeting container "ephemeral-demo". If you don't see processes from this container it may be because the container runtime doesn't support this feature.
Defaulting debug container name to debugger-bljnj.
If you don't see a command prompt, try pressing enter.
/ # ls
bin   dev   etc   home  proc  root  sys   tmp   usr   var
/ # 

此时再去看pod 的信息会发现已经被添加了一个类型为ephemeralContainers的容器

[root@vms120 ~]# kubectl  get pod ephemeral-demo   -o json|jq .spec
{"containers": [{"image": "registry.aliyuncs.com/google_containers/pause:3.2","imagePullPolicy": "IfNotPresent","name": "ephemeral-demo","resources": {},"terminationMessagePath": "/dev/termination-log","terminationMessagePolicy": "File","volumeMounts": [{"mountPath": "/var/run/secrets/kubernetes.io/serviceaccount","name": "kube-api-access-sqmzl","readOnly": true}]}],"dnsPolicy": "ClusterFirst","enableServiceLinks": true,"ephemeralContainers": [{"image": "busbox","imagePullPolicy": "Always","name": "debugger-9l8mw","resources": {},"stdin": true,"targetContainerName": "ephemeral-demo","terminationMessagePath": "/dev/termination-log","terminationMessagePolicy": "File","tty": true},{"image": "busybox","imagePullPolicy": "Always","name": "debugger-slx6g","resources": {},"stdin": true,"targetContainerName": "ephemeral-demo","terminationMessagePath": "/dev/termination-log","terminationMessagePolicy": "File","tty": true},{"image": "busybox","imagePullPolicy": "Always","name": "debugger-gw6zt","resources": {},"stdin": true,"terminationMessagePath": "/dev/termination-log","terminationMessagePolicy": "File"},{"image": "busybox","imagePullPolicy": "Always","name": "debugger-cxc8b","resources": {},"stdin": true,"targetContainerName": "ephemeral-demo","terminationMessagePath": "/dev/termination-log","terminationMessagePolicy": "File","tty": true},{"image": "busybox","imagePullPolicy": "Always","name": "debugger-bljnj","resources": {},"stdin": true,"targetContainerName": "ephemeral-demo","terminationMessagePath": "/dev/termination-log","terminationMessagePolicy": "File","tty": true}],"nodeName": "vms121.rhce.cc","preemptionPolicy": "PreemptLowerPriority","priority": 0,"restartPolicy": "Never","schedulerName": "default-scheduler","securityContext": {},"serviceAccount": "default","serviceAccountName": "default","terminationGracePeriodSeconds": 30,"tolerations": [{"effect": "NoExecute","key": "node.kubernetes.io/not-ready","operator": "Exists","tolerationSeconds": 300},{"effect": "NoExecute","key": "node.kubernetes.io/unreachable","operator": "Exists","tolerationSeconds": 300}],"volumes": [{"name": "kube-api-access-sqmzl","projected": {"defaultMode": 420,"sources": [{"serviceAccountToken": {"expirationSeconds": 3607,"path": "token"}},{"configMap": {"items": [{"key": "ca.crt","path": "ca.crt"}],"name": "kube-root-ca.crt"}},{"downwardAPI": {"items": [{"fieldRef": {"apiVersion": "v1","fieldPath": "metadata.namespace"},"path": "namespace"}]}}]}}]
}

有些时候 Pod 的配置参数使得在某些情况下很难执行故障排查。例如,在容器镜像中不包含 shell 或者你的应用程序在启动时崩溃的情况下, 就不能通过运行 kubectl exec 来排查容器故障。在这些情况下,你可以使用 kubectl debug 来创建 Pod 的副本,通过更改配置帮助调试。

报错

error: ephemeral containers are disabled for this cluster (error from server: "the server could not find the requested resource").

未成功开启ephemeralContainers特性

K8s-临时容器 Ephemeral Containers相关推荐

  1. k8s临时容器ephemeral

         ▲ 点击上方"DevOps和k8s全栈技术"关注公众号 什么是临时容器? 临时容器与其他容器的不同之处在于,它们缺少对资源或执行的保证,并且永远不会自动重启,因此不适用于 ...

  2. k8s开启临时容器ephemeral进行debug调试

    1.1 什么是临时容器? 临时容器与其他容器的不同之处在于,它缺少对资源或执行的保证,并且永远不会自动重启,因此不适用于构建应用程序.临时容器使用与常规容器相同的 Container.Spec字段进行 ...

  3. kubernetes临时存储 Ephemeral Storage

    volume Container 中的文件在磁盘上是临时存放的,使之Container中运行的相对重要的应用业务带来一些问题 第一个问题是当容器崩溃时文件丢失.kubelet 会重新启动容器, 但容器 ...

  4. 浅谈K8S的容器管理

    一.引言 目录 一.引言 Kubernetes(K8S)基本概念 K8S是什么? K8S对象管理 对象规约(Spec)与状态(Status) 标签和选择算符 理解命名空间 名字空间 何时使用多个名字空 ...

  5. Kubernetes(K8s)容器设计模式实践案例 – 分散收集模式

    <Kubernetes与云原生应用>专栏是InfoQ向轻元科技首席架构师王昕约稿的系列 文章.本专栏包含8篇内容,将会从介绍和分析Kubernetes系统以及云原生应用 入手,逐步推出基于 ...

  6. Docker镜像分层和临时容器

    镜像分层:对于已经构建过的镜像,修改Dockerfile文件后,再次构建只会对修改的部分进行执行,已经执行过的步骤并未修改的话会掠过. 临时容器:每执行一个步骤就会产生一个临时容器.

  7. K8S查看容器日志、进入容器内部

    K8S查看容器日志.进入容器内部 前言 常用命令 查看所有正在运行的pod 查看容器日志 查看pod的详细信息,以yaml格式或json格式显示 查看pod的描述信息 查看node或pod的资源使用情 ...

  8. k8s部署-48-k8s中如何选择使用哪个api,开发一个k8s的容器管理平台的思路是什么?

    k8s中有很多的api,我们的yaml文件开头一定要申明一个apiversion,怎么知道该使用哪个api呢?如何来选择正确的api呢? 我们又该如何来开发一个基于k8s的容器管理平台,开发k8s容器 ...

  9. 2021年最新 k8s安装部署步骤 kubernetes从入门到实践 K8S实战容器化迁移实战教程 K8S存储之Ceph分布式存储系统 K8S架构师实战指南

    2021年最新 k8s安装部署步骤 kubernetes从入门到实践 K8S实战容器化迁移实战教程 K8S存储之Ceph分布式存储系统 K8S架构师实战指南

  10. Docker入门(三):容器(Containers)

    这个<Docker入门系列>文档,是根据Docker官网(https://docs.docker.com)的帮助文档大致翻译而成.主要是作为个人学习记录.有错误的地方,Robin欢迎大家指 ...

最新文章

  1. 集合list set Map问题
  2. Docker网络解决方案 - Calico部署记录
  3. 总结一下一般游戏中3D模型各种勾边方法遇到的工程性问题
  4. 学习打卡-2018/08/09
  5. 教你如何使用 OpenCV检测图像中的轮廓
  6. 获取IE (控件)的所有链接(包括Frameset, iframe)zz
  7. 内推 | 腾讯视觉感知算法全职实习生
  8. python中的pyinstaller库_Python(00):PyInstaller库,打包成exe基本介绍
  9. sqlite journal恢复数据_数据库是咋工作的?
  10. 小程序模板template
  11. 无需重装软件,解决不满足升级要求问题,Windows10成功升级Windows11方案——以戴尔XPS15 9550 i7-6700HQ CPU为例
  12. spring configuration注解原理
  13. 项目管理六大制约因素_项目管理有哪些主要风险及如何控制?
  14. 【ZYNQ】petalinux包含自定义的动态库
  15. 什么样的项目算是成功的?项目目标有什么特点?
  16. 【建议收藏】新到手的电脑Windows10/11系统优化、使用规范和技巧及软件推荐,提升范电脑性能和体验
  17. Unity限制旋转角度
  18. OpenStack HA集群3-Pacemake Corosync
  19. wildfly部署springboot项目
  20. Java高级--->多线程的学习

热门文章

  1. FPGA电源设计总结
  2. JAVA自学-day14-正则表达式、Math类、Random类、System、BigInteger、BigDecimal、Date/DateFormat、Calendar
  3. 【经验篇】记如何排查Linux服务器CPU使用率过高的问题
  4. 高精度加法(蓝桥杯)
  5. 阿里 P7 前端高级工程师,都需要掌握哪些技术栈?
  6. 对往届软件工程的思考——写在软件工程开课之际 by 姜健
  7. 安卓标题栏优化(1)——纪念火影--隐身术
  8. beini奶瓶-无线网络蹭网破解-简明说明
  9. SpringBoot2核心技术-笔记
  10. LAMP虚拟主机架设论坛