一 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的'机制
+++++++++++++ "推荐下面的方式,而不是plugin插件的方式" +++++++++++++
1、在 'v1.23 及以上'版本中,该功能'默认'开启
2、针对 '1.23 以下'的 K8S 版本,需要通过'以下'方式,'手动'开启
1) '控制面' 开启 EphemeralContainers featureGate
2) 进入 'master' 节点,编辑 /etc/kubernetes/manifests/ 下的
kube-apiserver.yaml、kube-controller-manager.yaml、kube-scheduler.yaml
备注: 实际'操作'只修改kube-apiserver.yaml即可
3) 在 command 部分添加 - --feature-gates=EphemeralContainers=true
4) 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=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: Ephemeral服务器托管网Containers=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 逃逸方法汇总
容器逃逸: 避免'忘记'密码,'重启'服务器 --> 弄一个备用'紧急的逃生'通路
引申:镜像是否做过'安全'扫描
服务器托管,北京服务器托管,服务器租用 http://www.fwqtg.net
相关推荐: 使用SpringAOP+Redis实现接口处理幂等
文章目录 一、思路分析 二、代码实战 1、搭建Springboot+AOP+Redis环境 2、自定义注解 3、切面类 4、测试一下吧 一、思路分析 在调用后台接口时,由于用户多次点击或者说第三方重试,可能会导致幂等问题。 解决方案无非就是上一次请求没有处理完…