K8s-临时容器 Ephemeral Containers
临时容器 Ephemeral Containers
- 当由于容器崩溃或容器镜像不包含调试工具而导致 kubectl exec 无用时, 临时容器对于交互式故障排查很有用。
- 尤其是,Distroless 镜像 允许用户部署最小的容器镜像,从而减少攻击面并减少故障和漏洞的暴露。 由于 distroless
镜像不包含 Shell 或任何的调试工具,因此很难单独使用 kubectl exec 命令进行故障排查。 - 使用临时容器时,启用 进程名字空间共享 很有帮助,可以查看其他容器中的进程。
开启临时容器功能
开启特性
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相关推荐
- k8s临时容器ephemeral
▲ 点击上方"DevOps和k8s全栈技术"关注公众号 什么是临时容器? 临时容器与其他容器的不同之处在于,它们缺少对资源或执行的保证,并且永远不会自动重启,因此不适用于 ...
- k8s开启临时容器ephemeral进行debug调试
1.1 什么是临时容器? 临时容器与其他容器的不同之处在于,它缺少对资源或执行的保证,并且永远不会自动重启,因此不适用于构建应用程序.临时容器使用与常规容器相同的 Container.Spec字段进行 ...
- kubernetes临时存储 Ephemeral Storage
volume Container 中的文件在磁盘上是临时存放的,使之Container中运行的相对重要的应用业务带来一些问题 第一个问题是当容器崩溃时文件丢失.kubelet 会重新启动容器, 但容器 ...
- 浅谈K8S的容器管理
一.引言 目录 一.引言 Kubernetes(K8S)基本概念 K8S是什么? K8S对象管理 对象规约(Spec)与状态(Status) 标签和选择算符 理解命名空间 名字空间 何时使用多个名字空 ...
- Kubernetes(K8s)容器设计模式实践案例 – 分散收集模式
<Kubernetes与云原生应用>专栏是InfoQ向轻元科技首席架构师王昕约稿的系列 文章.本专栏包含8篇内容,将会从介绍和分析Kubernetes系统以及云原生应用 入手,逐步推出基于 ...
- Docker镜像分层和临时容器
镜像分层:对于已经构建过的镜像,修改Dockerfile文件后,再次构建只会对修改的部分进行执行,已经执行过的步骤并未修改的话会掠过. 临时容器:每执行一个步骤就会产生一个临时容器.
- K8S查看容器日志、进入容器内部
K8S查看容器日志.进入容器内部 前言 常用命令 查看所有正在运行的pod 查看容器日志 查看pod的详细信息,以yaml格式或json格式显示 查看pod的描述信息 查看node或pod的资源使用情 ...
- k8s部署-48-k8s中如何选择使用哪个api,开发一个k8s的容器管理平台的思路是什么?
k8s中有很多的api,我们的yaml文件开头一定要申明一个apiversion,怎么知道该使用哪个api呢?如何来选择正确的api呢? 我们又该如何来开发一个基于k8s的容器管理平台,开发k8s容器 ...
- 2021年最新 k8s安装部署步骤 kubernetes从入门到实践 K8S实战容器化迁移实战教程 K8S存储之Ceph分布式存储系统 K8S架构师实战指南
2021年最新 k8s安装部署步骤 kubernetes从入门到实践 K8S实战容器化迁移实战教程 K8S存储之Ceph分布式存储系统 K8S架构师实战指南
- Docker入门(三):容器(Containers)
这个<Docker入门系列>文档,是根据Docker官网(https://docs.docker.com)的帮助文档大致翻译而成.主要是作为个人学习记录.有错误的地方,Robin欢迎大家指 ...
最新文章
- 集合list set Map问题
- Docker网络解决方案 - Calico部署记录
- 总结一下一般游戏中3D模型各种勾边方法遇到的工程性问题
- 学习打卡-2018/08/09
- 教你如何使用 OpenCV检测图像中的轮廓
- 获取IE (控件)的所有链接(包括Frameset, iframe)zz
- 内推 | 腾讯视觉感知算法全职实习生
- python中的pyinstaller库_Python(00):PyInstaller库,打包成exe基本介绍
- sqlite journal恢复数据_数据库是咋工作的?
- 小程序模板template
- 无需重装软件,解决不满足升级要求问题,Windows10成功升级Windows11方案——以戴尔XPS15 9550 i7-6700HQ CPU为例
- spring configuration注解原理
- 项目管理六大制约因素_项目管理有哪些主要风险及如何控制?
- 【ZYNQ】petalinux包含自定义的动态库
- 什么样的项目算是成功的?项目目标有什么特点?
- 【建议收藏】新到手的电脑Windows10/11系统优化、使用规范和技巧及软件推荐,提升范电脑性能和体验
- Unity限制旋转角度
- OpenStack HA集群3-Pacemake Corosync
- wildfly部署springboot项目
- Java高级--->多线程的学习