一 k8s debug 浅谈
说明: 本文只是基于对'kubectl debug'浅显认识总结的知识点,后续'实际使用'再补充案例
Kubernetes 官方出品调试工具上手指南(无需安装,开箱即用)
debug-application
简化 Pod 故障诊断: kubectl-debug 介绍
1.18 版本之前需要自己安装kubectl debug 下载位置 debug_0.1.1_linux_amd64.tar.gz
① 低版本安装kubectl-debug工具
# linux x86_64
export PLUGIN_VERSION=0.1.1
mv debug_${PLUGIN_VERSION}_linux_amd64.tar.gz kubectl-debug.tar.gz
tar -zxvf kubectl-debug.tar.gz kubectl-debug
mv kubectl-debug /usr/local/bin/
机制: 关于为什么安装kubectl-debug,但是却可以使用'kubectl debug'命令参考'plugin的'机制
② 临时容器
1、 EphemeralContainer '临时容器'
Debugging using a copy of the Pod
③ debug的背景
1、kubectl是 k8s 管理员的日常工具,当'调试'或'排查 pod'问题时
2、一般情况使用 'logs'、describe、exec '子命令'便可以找到'问题'原因
java 排错 --> 镜像如果没有'提供相关'的工具,怎么排错呢? --> 'gcc 日志'分析、jvm性能分析
补充: 容器所在节点'执行nsenter',查看pod或容器 ps: 不一定有'worker节点的登陆权限'
思考: 哪些场景'不满足'驱使我们使用'kubectl debug'
--feature-gates="EphemeralContainers=true"
④ kubectl debug原理
kubectl debug 调试运行中的pod
1、内置的 kubectl debug 命令其实很'简单'
2、通过 '--target' 参数指定'Pod中的哪个容器',给'正在运行中的 Pod' 增加一个'临时'容器
备注: 默认是'主'容器,'第一个',也即'业务容器'
补充:--image参数就是用于指定使用'哪个镜像来debug',这个镜像包含我们'常使用的工具'即可
3、'共享进程命名空间',容器文件系统通过 '/proc/$pid/root' 链接对 pod 中的'其他容器'可见
++++++++++++ "分割线" ++++++++++++
运行 debug 命令, 把'日志级别'设置为 10 ,查看创建 debug 容器的'过程':
kubectl run ephemeral-demo --image=pause:3.5 --restart=Never
kubectl -v=10 debug -it ephemeral --image=busybox:1.33.1 --target=temp_demo
GET 获取 pod -> 'PATCH' 增加临时容器 -> 'GET' 获取临时容器 -> 'POST' 进入临时容器
kubeadm 安装的集群如何启动 kubectl debug 调试容器
1、当'debug'连接到Pod后,使用 'chroot /host' 突破 chroot,并完全'进入'主机
2、可以获取到'节点完全的权限',查看到节点所有的文件,甚至'重启节点'
二 如何启动临时容器
① 在已经运行k8s集群中开启临时容器
需求: 在kubeadm 安装的'已经运行'的 Kubernetes 集群中开启'临时容器'功能
1、/etc/kubernetes/manifests/kube-apiserver.yaml
添加 'EphemeralContainers=true' 开启'临时容器'功能,如下'所示'
- --feature-gates=DynamicKubeletConfig=true,EphemeralContainers=true
备注: 如果要开启'多个特性'门控功能用 ',' 隔开
② 集群初始化的时候开启临时容器功能
说明: 如果想在'初始化' Kubernetes 集群时'开启'临时容器功能,则修改 'kubeadm' 配置文件
# init.yaml
apiVersion: kubeadm.k8s.io/v1beta2
kind: ClusterConfiguration
kubernetesVersion: v1.19.3
apiServer:
extraArgs:
feature-gates: EphemeralContainers=true
然后通过 'kubeadm init' 初始化 Kubernetes 集群:
kubeadm init --config init.yaml
③ 验证
1、随着集群的运行,我们需要'验证其有效性'
2、最简单方法是检查 'Pod API',它现在应该包含'临时容器'部分以及通常容器
kubectl explain pod.spec.ephemeralContainers
④ 容器进程共享
share-process-namespace
ephemeral-containers
feature-gates
1、验证 Pod 中是否允许'进程共享',那么可以运行:
kubectl get pod pod_name -o json | jq .spec.shareProcessNamespace --> 'true'
⑤ docker 逃逸方法汇总
容器逃逸: 避免'忘记'密码,'重启'服务器 --> 弄一个备用'紧急的逃生'通路
引申: 镜像是否做过'安全'扫描