一 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_64export PLUGIN_VERSION=0.1.1mv debug_${PLUGIN_VERSION}_linux_amd64.tar.gz kubectl-debug.tar.gztar -zxvf kubectl-debug.tar.gz kubectl-debugmv kubectl-debug /usr/local/bin/机制: 关于为什么安装kubectl-debug,但是却可以使用'kubectl debug'命令参考'plugin的'机制
+++++++++++++ "推荐下面的方式,而不是plugin插件的方式" +++++++++++++1、在 'v1.23 及以上'版本中,该功能'默认'开启2、针对 '1.23 以下'的 K8S 版本,需要通过'以下'方式,'手动'开启1) '控制面' 开启 EphemeralContainers featureGate2) 进入 'master' 节点,编辑 /etc/kubernetes/manifests/ 下的 kube-apiserver.yaml、kube-controller-manager.yaml、kube-scheduler.yaml备注: 实际'操作'只修改kube-apiserver.yaml即可3) 在 command 部分添加 - --feature-gates=EphemeralContainers=true4) kubelet 服务开启该功能5) 在节点上'编辑' /var/lib/kubelet/kubeadm-flags.env添加 --feature-gates=EphemeralContainers=true或者设置KUBELET_EXTRA_ARGS="--feature-gates=EphemeralContainers=true"#6) 重启 kubelet:systemctl restart kubelet细节: v1.18.4 '版本中' 必须使用 kubectl 'alpha' debug
② 临时容器
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=Neverkubectl -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 逃逸方法汇总
容器逃逸: 避免'忘记'密码,'重启'服务器 --> 弄一个备用'紧急的逃生'通路引申: 镜像是否做过'安全'扫描