Kubernetes-Docker容器故障排除工具

安装docker可视化工具 Portainer中文版(ubuntu上演示,所有docker通用) 支持控制各种容器,容器操作简单化 降低容器门槛 【摘要】本文介绍了在免费星宇科技4090云主机(Ubuntu 22.04系统)上部署Portainer容器管理工具的完整流程。主要内容包括:1)推荐使用预装环境的免费云主机加速入门;2)提供两种Portainer安装方式(DockerHub拉取和本地镜像构建);3)详细讲解docker-compose配置文件参数及优化建议;4)端口放行与防火墙设置指南;5)针对云主机特殊网络架构的外网访问方案;6)常见问题排查方法(如镜像源加速配置)。文章强调通过标准化部署流程降低Docker管理门槛,特别适合初学者快速搭 阅读详情

Docker容器本着轻量化的原则,很多容器镜像在制作的时候只安装了服务需要的软件包

这样做确实能达到容器轻量化,启动快等特点,但是同时也有个问题就是由于镜像中最基本的工具也没安装,导致排查问题是有很大的困扰,尤其是网络问题的排查,很多容器镜像中ifconfig、netstat、lsof、tcpdump等工具都没有

比如dockerhub提供的mysql容器中 netstat、tcp工具都没有,那么像查询mysql连接数时就必须手动安装

Netshoot镜像是一个集成了相关网络工具的镜像,可以通过该工具共享指定容器的网络命名空间来进行相关的操作

现在有一个mysql的容器

[root@k8s-node1 ~]# kubectl --namespace=kube-system get pod mysql-74b59f4f5b-l2zct -owide
NAME                             READY   STATUS    RESTARTS   AGE   IP            NODE        NOMINATED NODE   READINESS GATES
mysql-74b59f4f5b-l2zct   1/1     Running   0          9d    172.17.39.9   k8s-node1   <none>           <none>

进入容器查看,可以看到该容器中网络的工具基本上都没有安装

[root@k8s-node1 ~]# kubectl --namespace=kube-system exec -it mysql-74b59f4f5b-l2zct bash
root@mysql-74b59f4f5b-l2zct:/# netstat
bash: netstat: command not found
root@aistack-mysql-74b59f4f5b-l2zct:/# ifconfig
bash: ifconfig: command not found
root@aistack-mysql-74b59f4f5b-l2zct:/# lsof
bash: lsof: command not found

使用Netshoot可以实现在mysql容器中查看网络相关信息

1. 查看容器所在的节点,通过-owide可以看到该POD调度在k8s-node1节点

2. 查看docker container PID, 取前16位即可,本次查出来的是4b2160c0e96fe44b

[root@k8s-node1 ~]# kubectl --namespace=kube-system get pod mysql-74b59f4f5b-l2zct -ojson | grep containerID
                "containerID": "docker://4b2160c0e96fe44b02dd50e4abf6e9fe7528bbe885dd11a90cd18d6576a2b0ce",

3. 使用Netshoot镜像指定mysql容器的网络重新启动一个容器(--network可以指定网络命名空间),可以看到在该容器中相关的网络工具都有了(虽然是新的容器,但是由于使用的网络命名空间是一样的,所以网络信息是一摸一样的,包括IP,网卡,路由等)

[root@k8s-node1 ~]# docker run -it --rm --network=container:4b2160c0e96fe44b netshoot:latest bash -l
                    dP            dP                           dP
                    88            88                           88
88d888b. .d8888b. d8888P .d8888b. 88d888b. .d8888b. .d8888b. d8888P
88'  `88 88ooood8   88   Y8ooooo. 88'  `88 88'  `88 88'  `88   88
88    88 88.  ...   88         88 88    88 88.  .88 88.  .88   88
dP    dP `88888P'   dP   `88888P' dP    dP `88888P' `88888P'   dP

Welcome to Netshoot! (github.com/nicolaka/netshoot)
root @ /
 [1] ?  → netstat -anp| grep 6379

4. 除了--network之外,还可以指定--ipc,--pid,--volume保证内存空间,进程命名空间都一样

5. 如下脚本可以直接在k8s环境中使用

#!/usr/bin/env bash


function kube_inject {
    local ns_name="${1}"
    local pod_name="${2}"
    local container_name_or_idx="${3:-1}"

    local usage="Usage: ${FUNCNAME[0]} <ns_name> <pod_name> [container_name|container_index]"
    local kube_inject_image="netshoot:latest"
    local docker_daemon_port="2375"
    local docker_tls_flag="--tlsverify \
                           --tlscacert=/etc/kubernetes/ssl/ca.pem \
                           --tlscert=/etc/kubernetes/ssl/docker.pem \
                           --tlskey=/etc/kubernetes/ssl/docker-key.pem"

    if [[ $# -lt 2 ]]; then
        echo "Error: ${FUNCNAME[0]} requires at least 2 arguments for ns_name and pod_name;" \
             "and an optional argument for container's name or index!"
        echo "${usage}"
        return 1
    fi

    // 获取Pod调度的Node节点IP
    hostIP="$(kubectl -n ${ns_name} get pod ${pod_name} -ojsonpath='{.status.hostIP}' 2>/dev/null)"
    if [[ -z "${hostIP}" ]]; then
        echo "Error: no such pod ${pod_name} in the namespace ${ns_name}!"
        echo "${usage}"
        return 2
    fi

    // 判断Pod状态
    status="$(kubectl -n ${ns_name} get pod ${pod_name} -ojsonpath='{.status.phase}')"
    if [[ "${status}" != "Running" ]]; then
        echo "Error: the pod ${pod_name} in the namespace ${ns_name} is not Running!"
        echo "${usage}"
        return 3
    fi

    // 获取Pod对应的ContainerID
    if [[ "${container_name_or_idx}" =~ ^[0-9]+$ ]]; then
        # treat 'container_name_or_idx' as the index of the container in the pod.
        jsonpath="{.status.containerStatuses[$((container_name_or_idx-1))].containerID}"
    else
        # treat 'container_name_or_idx' as the name of the container in the pod.
        jsonpath="{.status.containerStatuses[?(@.name=='${container_name_or_idx}')].containerID}"
    fi

    cid=$(kubectl -n ${ns_name} get pod ${pod_name} -ojsonpath="${jsonpath}" 2>/dev/null)

    if [[ ! ("${cid}" =~ ^docker://[0-9a-f]{64}$) ]]; then
        if [[ "${container_name_or_idx}" =~ ^[0-9]+$ ]]; then
            echo "Error: container index ${container_name_or_idx} is out of bounds!"
        else
            echo "Error: no such container ${container_name_or_idx} in the pod ${pod_name}!"
        fi

        echo "${usage}"
        return 4
    fi

    # remove the prefix 'docker://'.
    cid="${cid:9:64}"
    docker_cmd="docker -H ${hostIP}:${docker_daemon_port} ${docker_tls_flag}"
    // 获取container的根目录
    merged_dir="$(${docker_cmd} inspect -f '{{.GraphDriver.Data.MergedDir}}' ${cid})"

    // 获取container的mount volume信息
    volumes=""
    for bind in $(${docker_cmd} inspect -f '{{.HostConfig.Binds}}' ${cid} |tr -d '\[\]'); do
        # [[ "${bind}" =~ (/etc/hosts|/dev/termination-log) ]] && continue
        # notes: the tailing space ' ' is necessary here.
        volumes+="--volume=$(sed -nr 's|([^:]+):(.*)|\1:/container_root\2|p' <<< ${bind}) "
    done

    ${docker_cmd} run \
                  -it --rm \
                  --ipc=container:${cid} \    // IPC Mode
                  --network=container:${cid} \    // 共享网络命名空间
                  --pid=container:${cid} \    // 共享进程命名空间
                  --volume=${merged_dir}:/container_root:rw \    // MountVolume
                  ${volumes} \
                  ${kube_inject_image} bash -l
}

kube_inject "$@"
[root@k8s-node1 ~]# kube-inject
Error: kube_inject requires at least 2 arguments for ns_name and pod_name; and an optional argument for container's name or index!
Usage: kube_inject <ns_name> <pod_name> [container_name|container_index]

 

docker入门之DockerDesktop 文档:Docker Desktop overview | Docker Documentation 1.简介 Docker Desktop 适用于 Mac 或 Windows 环境。包括: Docker Engine Docker CLI 客户端 Docker Compose Docker Content Trust Kubernetes Credential Helper 包括以下关键特性: 以多种语言和框架在云平台上容器化和共享应用 轻松安装 Docker 开发环境 最 阅读详情

相关推荐

netshoot:Docker + Kubernetes网络对瑞士军队容器进行故障排除

netshoot:Docker + Kubernetes网络对瑞士军队容器进行故障排除

k8s网络排障NetShoot详解

k8s中网络排查用的工具

weixin_45432833的博客 1036

STM407ZET6+OV5640调试心得

最近一个项目用了STMF407ZET6 +OV5640,调试了好几天做些总结; STMF407ZET6 开发板用的是正点原子的开发板,OV5640摄像头用的是秉火摄像头; 这其中有一个大坑,开发板的DCMI接口跟摄像头的接口不一样,要重新用杜邦线进行连接; 本人是在正点原子的“”15,ATK-OV5640摄像头模块“”源码上进行修改的。

kingseacjh的专栏 8325

第10关 netshoot:一个Docker + Kubernetes网络故障排查瑞士军刀容器

这里给大家推荐一款开源的容器工具箱 https://github.com/nicolaka/netshoot (打开慢的同学,可以在github后面加上fast来提升访问浏览速度形容) ,它是一个Docker + Kubernetes网络故障排除瑞士军刀容器一点都不为过,我们可以使用这个工具或者参考这个开源项目打造属于自己的容器瑞士军刀

博哥爱运维 1845

SQLite学习——Dapper初识

dapper下载:https://www.nuget.org/packages/Dapper/1.40.0

jiDxiaohuo的博客 1295

EETI_eGTouch驱动移植及校准

一.环境 芯片:NXP IMX6Q 内核版本:4.1.15 uname:Linux myimx6ek314 4.1.15-myimx6-g5d588fa6-dirty #4 SMP PREEMPT Tue Nov 17 17:26:34 CST 2020 armv7l armv7l armv7l GNU/Linux 二.官方《EETI_eGTouch_Linux_Programming_Guide_v2.5l.pdf》文档勘误 HID_MULTITOUCH =Y or N(官方文档设置为M): 正确设置H

Garden的博客 4332

终极网络诊断神器:netshoot 5分钟快速上手完全指南

在网络故障排查的世界里,netshoot 网络诊断工具堪称是 Docker 和 Kubernetes 环境中的多用途工具。这款强大的网络诊断工具让网络故障排查变得简单高效,即使是网络新手也能快速上手。 ## 🚀 什么是 netshoot? netshoot 是一个专门为 Docker 和 Kubernetes 环境设计的网络诊断容器,集成了超过 50 种专业的网络故障排查工具。无论你是遇到容

gitblog_00461的博客 475

DCM4CHEE Archive Light 应用配置-存储配置

本文介绍了在DICOM归档系统中配置和管理存储的方法,包括通过用户界面和LDAP导入两种方式。主要内容包括: 存储配置概述:用户可根据需求配置单个或多个存储设备,支持在磁盘空间不足或多任务并行时使用。存储分为Archive设备级(序列元数据存储)和Application Entity级(对象存储/元数据存储)。 用户界面操作: 设备级存储配置:通过菜单导航添加/编辑存储描述符,设置Storage ID、URI等关键参数 应用级存储引用:在设备扩展和网络AE中分别配置元数据和对象存储引用 LDAP配置方法:

洪城叮当的博客 1416

docker 查看ip 工具 nicolaka/netshoot image

ip 地址为172.18.0.2。

Legendlijianfei的博客 330

c++11 无锁队列

/************************************************************************* &gt; File Name: lockfreequeue.cpp &gt; Author: &gt; Mail: &gt; Created Time: Wed 08 Aug 2018 11:38:08 AM CST ********...

qq_35728402的博客 5021

基于 STM32 单片机的实验室多参数安全监测系统设计与实现

本系统以 STM32F103C8T6 单片机为核心,集成温湿度监测、烟雾检测、气体泄漏报警、人体移动监测等功能模块,通过 OLED 显示屏实时显示数据,并支持 Wi-Fi 远程传输。系统可对实验室异常环境参数(如高温、烟雾、燃气泄漏)及非法入侵实时报警,保障实验室安全。本文从硬件选型、电路设计到软件实现提供了完整的实验室安全监测系统方案,可根据实际需求调整传感器类型和通信方式,适用于科研、教学等场景的环境安全防护。:可增加继电器模块控制通风设备或切断电源,集成 ZigBee 组网实现多实验室联动监测。

weixin_42300449的博客 1285

终极网络故障排查指南:netshoot工具包深度解析

netshoot是一款专为Docker和Kubernetes环境设计的网络故障排查瑞士军刀容器,集成了数十种强大的网络诊断工具,帮助开发者和运维人员快速定位和解决复杂的网络问题。无论是容器间通信故障、DNS解析异常还是网络性能瓶颈,netshoot都能提供一站式的诊断解决方案。 ## 为什么选择netshoot? 在Docker和Kubernetes环境中,网络故障排查往往面临两大挑战:一是容

gitblog_00287的博客 1041

基于 SoC 的卷积神经网络车牌识别系统设计(1)引言

通过 CPU 软核 IP 在纯 FPGA 平台上构建一个 AI SoC 卷积神经网络车牌识别系统,其中,缩放、填充层、卷积层、ReLU、池化层、全连接层 IP 都是 Verilog 设计的,同时集成了各种高性能的 IP。这是最具挑战性的 AI SoC 芯片设计项目,集成了 Python 卷积神经网络代码、Verilog 卷积神经网络硬件设计、ARM SoC 设计、ARM 与 FPGA 的交叉编译流程等等。这不仅是科研学习、集创竞赛、秋招求职的一个极具优势的精彩项目,也是目前最火热的芯片行业之中的一个...

新芯设计的博客 3779

10个鲜为人知的容器调试工具:awesome-container-tinkering精选

cntr是一个基于FUSE的容器调试工具,旨在替代`docker exec`,让你可以随身携带所有开发工具。它通过将一个容器(或主机)的文件系统挂载到目标容器中,并借助FUSE文件系统创建一个嵌套容器。 cntr支持多种运行时,包括docker、podman、LXC/LXD、rkt、systemd-nspawn和containerd,因为它直接在操作系统层面运行。 项目地址:[cntr](ht

gitblog_00738的博客 871

YOLOv8进阶实战:融合SAHI超推理算法,在无人机应用中精准捕捉视频与图片中的微小目标

YOLOv8改进是一种先进的目标检测算法,通过引入辅助超推理算法SAHI推理,使得小目标无法逃避检测。SAHI推理算法结合视频和图片的特点,利用先进的超推理技术,提高了目标检测的准确性和鲁棒性。不仅如此,YOLOv8改进还支持对视频和图片进行实时的目标检测,将检测结果直观地呈现给用户。这一技术的应用范围广泛,可以用于安防领域,提升监控设备的性能和效率;也可以用于无人驾驶领域,实现精准的目标识别和跟踪。总之,YOLOv8改进是一项具有突破性的技术,为目标检测领域带来了重大的进展。

weixin_51988935的博客 807

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

gitui部署方案:Docker容器化与云原生部署

在当今云原生时代,传统命令行工具的部署方式正在经历革命性变革。gitui作为一款基于Rust开发的极速终端Git UI工具,其轻量级、高性能的特性使其成为容器化部署的理想选择。本文将深入探讨gitui的Docker容器化部署方案,以及如何在云原生环境中实现高效、可靠的部署。 ## gitui项目概述 gitui是一个用Rust编写的终端Git用户界面,具有以下核心特性: - **极速性能**...

gitblog_00220的博客 461

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

docker容器部署的应用启动日志在哪里看_深入容器监控指南

集装箱已经风靡全球。通过允许开发人员将软件打包到轻量级,自包含的环境中,容器可以更轻松,更快地部署应用程序。容器有无数的用例,从运行本地应用程序到为世界上最大的网站供电。容器允许开发人员将应用程序及其依赖项打包成自包含,可重现的单元。这些单元可以独立启动,修改,更换和关闭,而不会影响其他单元。这使得它们对于许多应用程序非常有用,包括数据处理,Web托管和一次性任务。容器类似于虚拟机(VM),因为它...

weixin_39750195的博客 1228

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

FlashAI Convert Lite云原生:在Kubernetes集群中的部署方案

FlashAI Convert Lite云原生:在Kubernetes集群中的部署方案 【免费下载链接】convert-lite flashai-convert-lite,离线免费文档转换工具,支持pdf to markdown,word to markdown,excel to markdown,ppt to mark...

gitblog_00388的博客 679

cs-self-learning 教材链接失效后,如何快速找回完整自学路径?

开源自学指南 cs-self-learning 中 MIT 18.330 课程的教材链接,因原作者资源迁移被发现失效;本文复盘整个事件,并给出一份可直接套用的文档维护操作清单。 ## 这次失效是怎么发生的 整个过程并不复杂,可以拆成四个阶段: 1. **资源迁移**:MIT 18.330 课程教材的原作者,把资源搬到了新的永久域名,旧地址随之停止服务。 2. **链接失效**:项目数学进阶模

gitblog_00160的博客 348

16个 Awesome 工具让 Kubernetes 如虎添翼

在 DevOps 生态系统中,拥有出色的 DevOps 工具来减轻人为操作非常重要。每个 DevOps 阶段都可以使用大量的 DevOps 工具。如果您在 DevOps 领域中工作并在容器中运行应用程序,那么 Kubernetes 是必备工具之一。有数百种工具可与 Kubernetes 配合使用以添加更多功能。我说的是用于更好地管理,安全性,仪表板和 Kubernetes 集群监控的工具。这是一系...

关注微信公众号【开源Linux】,后台回复『10T』,领取10T学习资源大放送,涵盖Linux、虚拟化、容器、云计算、网络、Python、Go等书籍和视频 329

查看pods 对应的docker

我整理的一些关于【Docker】的项目学习资料(附讲解~~)和大家一起分享、学习一下:https://d.51cto.com/f2PFnN查看 Pods 对应的 Docker 在 Kubernetes 中,每个 Pod 通常会运行一个或多个容器,而这些容器都是基于 Docker 的。对于初学者来说,查看 Pods 对应的...

weixin_42012131的博客 290

马哥教育|想从事SRE运维工程师岗位需要哪些技术?

1、自动化工具:SRE运维工程师需要熟悉使用各种自动化工具,如配置管理工具(例如Ansible、Puppet、Chef)、编排工具(例如Kubernetes、Docker)、监控工具(例如Prometheus、Grafana)等。综上所述,想成为一名高薪的SRE运维工程师需要具备广泛的技术知识和技能,包括自动化工具、编程语言、网络和系统知识、容器技术、监控和警报系统、故障排除和故障恢复能力以及安全知识。7、安全知识:SRE运维工程师需要了解基本的安全知识,包括网络安全、身份验证和授权、数据加密等。

yunwei_gtq的博客 498

instagram-private-api 响应类型详解:ReelsTrayFeedResponseRootObject 与快拍托盘(Stories Tray)数据结构

本文围绕 `instagram-private-api`(Node.js 版 Instagram 私有 API SDK)中 `ReelsTrayFeedResponseRootObject` 接口展开,它是「快拍托盘」(Stories Tray,即 App 首页顶部的横向 Story 入口栏)接口响应的根对象类型定义。读完本文你将掌握托盘响应的完整字段语义、`tray`(用户快拍列表)与 `bro

gitblog_01137的博客 706

LLM Sandbox容器后端对比:Docker、Kubernetes、Podman如何选择

LLM Sandbox是一个轻量级、可移植的LLM沙箱运行时(代码解释器)Python库,它支持多种容器后端来执行AI生成的代码。选择合适的容器后端对于确保代码安全执行、优化性能以及满足不同的部署需求至关重要。本文将深入对比Docker、Kubernetes和Podman三种主要容器后端,帮助你做出明智的选择。 ## 🔍 为什么需要多容器后端支持? LLM Sandbox的核心目标是在安全隔

gitblog_00573的博客 983

ClusterFuzz部署实战:从Docker容器到Kubernetes集群的完整指南

在当今软件安全日益重要的时代,**ClusterFuzz**作为谷歌开源的分布式模糊测试基础设施,已经成为保障软件质量的关键工具。本文将为您提供从基础Docker部署到高级Kubernetes集群配置的完整实战指南,帮助您快速搭建企业级的自动化安全测试平台。 ## 什么是ClusterFuzz? ClusterFuzz是一个可扩展的模糊测试基础设施,专门设计用于自动发现软件中的安全漏洞和稳定性

gitblog_01059的博客 1067

Linera容器化部署:Docker与Kubernetes最佳实践

Linera是一个专为高度可扩展、低延迟的Web3应用程序设计的区块链协议。在生产环境中,容器化部署是确保系统可靠性、可扩展性和易维护性的关键。本文将深入探讨Linera的Docker容器化和Kubernetes集群部署的最佳实践。 ## Docker容器化部署 ### Dockerfile架构解析 Linera的Dockerfile采用多阶段构建模式,优化镜像大小和构建效率: ```do...

gitblog_00632的博客 930
上一篇: Kubernetes-动态PV&PVC
下一篇: Docker-存储驱动解读(AUFS/DeviceMapper/Overlay)
Aaron.com
博客等级 码龄17年 25粉丝 39原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值