作者: 启鑫

  • 基于LangChain和Ollama的本地文档问答系统

    使用 LangChain 框架和 Ollama 开源大模型搭建一个问答系统,根据提供的文档内容回答用户提出的问题。

    系统主要由以下几个部分组成:

    • 文档加载模块: 负责从指定的路径加载文档。
    • 文档切分模块: 将加载的文档按照指定的大小和重叠度进行切分,以便 LLM 处理。
    • LLM 加载模块: 负责加载指定的 Ollama 模型。
    • 问答链创建模块: 使用 LangChain 表达式语言 (LCEL) 构建问答链,将用户问题和文档内容输入到 LLM 中,并解析 LLM 的输出。
    • 提问模块: 接收用户输入的问题,调用问答链生成答案,并返回给用户。
    • 重试机制: 使用 Tenacity 库,当提问模块出现错误时,自动进行重试,以提高系统的稳定性。

    1. 创建一个虚拟环境,名字为langqa

    conda create -n langqa python=3.12

    2. 激活虚拟环境

    conda activate langqa

    3. 安装依赖

    pip install langchain langchain_community langchain-ollama ollama tenacity

    4. 部署代码

    替换为你自己的文件、模型和地址

    • 文件:tcpdump.1-4.4.0.txt
    • 模型:llama3.1:8b
    • OLLAMA :http://localhost:11434

    配置完成后使用命令行进行运行对话

    python langqa.py

    代码

    """
    Author: Qixinlee
    Description: 基于LangChain和Ollama的本地文档问答系统
    """ 
    
    import os
    from langchain_community.document_loaders import TextLoader
    from langchain.text_splitter import RecursiveCharacterTextSplitter
    from langchain_ollama import OllamaLLM
    from langchain.prompts import PromptTemplate
    import ollama
    from tenacity import retry, stop_after_attempt, wait_random_exponential
    from langchain_core.runnables import chain
    from langchain_core.output_parsers import StrOutputParser
    
    # 常量定义
    DOCUMENT_PATH = os.path.join(os.path.dirname(__file__), "tcpdump.1-4.4.0.txt")
    CHUNK_SIZE = 1000
    CHUNK_OVERLAP = 100
    LLM_MODEL_NAME = "llama3.1:8b"
    OLLAMA_HOST = "http://localhost:11434"
    
    # 1. 设置 Ollama 连接信息
    os.environ["OLLAMA_HOST"] = OLLAMA_HOST
    ollama.DEFAULT_BASE_URL = OLLAMA_HOST
    
    # 2. 加载文档
    def load_document(document_path: str):
        try:
            loader = TextLoader(document_path)
            documents = loader.load()
            print(f"Successfully loaded document from {document_path}")
            return documents
        except Exception as e:
            print(f"Error loading document: {e}")
            exit()
    
    # 3. 切分文档
    def split_document(documents, chunk_size: int, chunk_overlap: int):
        text_splitter = RecursiveCharacterTextSplitter(chunk_size=chunk_size, chunk_overlap=chunk_overlap)
        texts = text_splitter.split_documents(documents)
        return texts
    
    # 4. 加载 LLM
    def load_llm(llm_model_name: str):
        try:
            llm = OllamaLLM(model=llm_model_name)
            print(f"Successfully loaded LLM model: {llm_model_name}")
            return llm
        except Exception as e:
            print(f"Error loading LLM model: {e}")
            exit()
    
    # 5. 创建问答链 (使用 LangChain 表达式语言)
    def create_qa_chain(llm):
        try:
            template = """你是一个问答机器人。请根据以下已知信息,用简洁和专业的中文回答用户的问题。
            如果无法从中得到答案,请清晰地输出 “根据已知信息无法回答该问题”。
    
            已知信息:
            {context}
    
            问题: {question}
            答案:"""
            QA_CHAIN_PROMPT = PromptTemplate(
                input_variables=["context", "question"], template=template
            )
    
            # 使用 Runnable 序列
            qa_chain = QA_CHAIN_PROMPT | llm | StrOutputParser()
    
            print("Successfully created QA chain.")
            return qa_chain
        except Exception as e:
            print(f"Error creating QA chain: {e}")
            exit()
    
    # 6. 提问 (使用 Tenacity 实现重试机制)
    @retry(stop=stop_after_attempt(3), wait=wait_random_exponential(multiplier=1, min=4, max=10))
    def generate_answer(qa_chain, document_content: str, query: str):
        try:
            result = qa_chain.invoke({"context": document_content, "question": query})
            print("Successfully generated answer.")
            return result
        except Exception as e:
            print(f"Error during QA: {e}")
            raise
    
    # 主程序
    if __name__ == "__main__":
    
        # 1. 加载文档
        documents = load_document(DOCUMENT_PATH)
    
        # 2. 切分文档
        texts = split_document(documents, CHUNK_SIZE, CHUNK_OVERLAP)
    
        # 3. 加载 LLM (使用常量)
        llm = load_llm(LLM_MODEL_NAME)
    
        # 4. 将所有文本块连接成一个字符串
        document_content = "\n".join([text.page_content for text in texts])
    
        # 5. 创建问答链
        qa_chain = create_qa_chain(llm)
    
        # 6. 循环提问
        while True:
            query = input("请输入你的问题 (输入 'exit' 退出): ")
            if query.lower() == "exit":
                break
    
            try:
                result = generate_answer(qa_chain, document_content, query)
                print("Question (中文):", query)
                print("Answer (中文):", result)
    
            except Exception as e:
                print(f"Failed to generate answer: {e}")
                exit()
  • 深度学习模型的优化与部署让 AI 更轻、更快、更实用

    优化和部署深度学习模型是一项综合性的工作,涉及到硬件、算法、软件工程等多个方面。没有万能的解决方案,关键在于理解各种技术的原理和适用场景,然后根据你的具体目标(比如,是追求极致速度,还是要在极低功耗下运行?)、资源限制(硬件预算、内存大小)和对精度、隐私的要求,像“量体裁衣”一样,选择并组合最合适的技术。这是一个持续探索和平衡的过程,最终目的是让强大的人工智能真正落地,服务于各行各业。

    一、 硬件与内存

    AI 模型的高效运行也离不开硬件支持和内存管理。

    硬件加速器

    • GPU(图形处理单元):可以想象成拥有成百上千个小型计算核心,能同时做很多简单的计算。特别适合处理像图像、视频这样包含大量并行数据的任务。NVIDIA 和 AMD 是主要玩家。
    • TPU(张量处理单元):Google 定制的“AI 专用芯片”,就像为特定 AI 计算量身打造的超高速引擎,在运行兼容的 AI 框架(如 TensorFlow)时效率极高。
    • FPGA(现场可编程门阵列):像一块可以“自定义电路”的板子。非常灵活,能为特定任务(比如超低延迟响应)设计最优硬件逻辑,但设计难度大。
    • NPU(神经网络处理单元):常内置于手机芯片或小型边缘设备中,是低功耗、高效率的“迷你 AI 加速器”,让 AI 能在不怎么耗电的情况下运行。
    • 为什么需要它们? 普通电脑的 CPU 虽然通用,但处理 AI 的大规模并行计算时不够快。这些专用硬件能把速度提升成百上千倍。

    内存管理

    • 挑战:现在顶尖的 AI 模型参数动辄数十亿甚至上万亿,需要巨大的内存(显存/RAM)来存储自身和计算过程中的临时数据。就像想在一台小内存电脑上运行一个超大型软件,直接运行会崩溃。

    解决方案

    • 并行技术:把一个大任务“拆分”给多个硬件(多块 GPU 或多台机器)同时处理。有的负责模型的一部分(模型并行),有的负责处理一部分数据(数据并行),大家分工合作,降低单个硬件的内存压力。
    • 梯度累积:想象一下内存一次只能处理 10 张图片,但你想模拟一次处理 100 张的效果。可以分 10 次处理,每次处理完 10 张后,先把结果(梯度)记下来累加,最后再一次性更新模型。相当于“少量多次”模拟“一次大量”。
    • 激活检查点:在模型训练计算过程中,会产生很多中间结果(激活值)需要存储。这个技术就像是“好记性不如烂笔头”的反面——为了节省“桌面空间”(内存),只记下关键结果,中间步骤需要时再重新算一遍。用计算时间换内存空间。
    • 为什么重要? 没有高效的内存管理,那些最先进的超大 AI 模型根本无法训练和运行。

    二、 模型效率提升技术

    让模型更小、计算更快,才能在手机、智能手表甚至普通电脑上流畅运行。

    量化:用“更简洁”的数字表示信息

    • 好比:把一张色彩极其丰富的图片(高精度,如 FP32)转换成只有 256 种颜色的图片(低精度,如 INT8)。图片文件变小了,加载更快了,虽然可能损失一点点细节,但整体看起来差别不大。
    • 技术:模型里的数字精度从 32 位浮点数(FP32,很精确)降低到 16 位(FP16/BF16,精度稍低)甚至 8 位整数(INT8,更简单)。数字越简单,存储占空间越小,计算也越快。
    • 两种方法:训练后量化(PTQ)是训练完成后再“压缩”数字,简单方便;量化感知训练(QAT)是在训练过程中就“教”模型适应使用这些简单数字,通常效果更好。
    • 为什么要做? 模型体积能缩小几倍,推理速度提升 2-4 倍甚至更多,功耗也降低,这对于移动设备和边缘设备至关重要。

    剪枝:砍掉模型中“不重要”的部分

    • 好比:修剪一棵植物,去掉多余的枝叶,让它更健康、更专注于结果,或者能放进一个小花盆里。
    • 技术:识别并移除神经网络中那些对最终结果贡献不大的连接或神经元(权重设为零或直接移除结构)。
    • 为什么要做? 减少模型的计算量和大小,进一步提升速度和降低资源占用。

    模型蒸馏:“名师”带“高徒”

    • 好比:一位经验丰富、知识渊博的“大师傅”(大型教师模型)把他做菜的精髓(预测逻辑、中间步骤的诀窍)传授给一个“小徒弟”(小型学生模型)。小徒弟虽然没那么“博学”,但学到了关键技能,能做出和师傅差不多水准的菜,而且动作更快、占厨房空间更小。
    • 技术:训练一个小模型去模仿一个大模型的输出或内部行为。
    • 为什么要做? 能在保持较高准确率的同时,获得一个计算量远小于原始大模型的小模型,非常适合资源受限的场景。

    三、选择合适的“运行引擎” (推理框架)

    优化好的模型还需要一个能高效执行它的“软件引擎”,才能在目标硬件上跑起来。

    • 它们是做什么的? 这些推理引擎/框架就像是为优化后的 AI 模型定制的“播放器”,知道如何在特定的硬件上(CPU, GPU, NPU 等)最高效地执行模型的计算。

    选择

    • ONNX Runtime: 像一个“万能转换插头”,支持多种 AI 框架导出的标准格式(ONNX),能在很多不同硬件和系统上运行。
    • TensorRT (NVIDIA): 专为 NVIDIA GPU 打造的“超跑引擎”,能把模型优化到极致,在 N 卡上跑出最高速度。
    • OpenVINO (Intel): 针对 Intel 硬件(CPU, 集成显卡等)的优化引擎。
    • TensorFlow Lite (TFLite): 谷歌为安卓、iOS 和嵌入式设备设计的“轻量级引擎”。
    • Core ML (Apple): 苹果设备(iPhone, Mac)上的原生引擎。
    • TorchScript/torch.compile (PyTorch): PyTorch 自带的工具,能把模型打包成独立、高效的格式运行。
    • 为什么重要? 直接用原始训练框架运行模型通常效率不高。这些引擎能进行深度优化(比如把多个计算步骤合并),让推理速度快几倍甚至几十倍。

    四、优化模型“学习”过程 (训练优化)

    改进模型的训练方式,不仅能加快训练,还可能得到更好的模型。

    • 混合精度训练:训练时“粗略计算”和“精确计算”相结合。大部分计算用速度快、省内存的半精度(FP16/BF16),关键步骤用全精度(FP32)保证准确性。就像草稿用铅笔快速写,重要部分用钢笔仔细写。
    • 学习率调度:控制模型学习“步伐”的策略。刚开始可能需要“慢跑”预热(Warmup),然后进入“稳定配速”(主学习率),最后快到终点时再“减速冲刺”(衰减)。合适的节奏能让模型学得更快更好。
    • 自适应优化器:像一个聪明的“导航系统”,能根据路况(模型参数的梯度)自动调整前往目的地的路线(每个参数的学习速度),避免走弯路或卡住。

    五、规模化部署与运维 (MLOps)

    模型训练好了只是第一步,如何稳定、可靠、大规模地让用户用上才是关键。

    部署在哪?

    • 边缘计算:在靠近用户或数据源的设备(如智能摄像头、工厂机器、手机)上直接运行 AI。好处是响应快(不用等数据传到云端再回来)、省带宽、隐私性好(敏感数据不出本地)。
    • 云端/分布式:利用云服务器集群的强大计算力,处理大规模训练任务,或者为海量用户提供 AI 推理服务。

    如何管理?(MLOps – 机器学习运维)

    • 版本控制:像对待软件代码一样,严格管理模型、数据、代码的每一个版本。方便追踪问题、回滚、复现结果。工具如 Git (代码) + DVC (数据) + MLflow (实验/模型)。
    • 自动化测试与部署:建立流程自动测试新模型,并通过 A/B 测试(让一小部分用户使用新模型,对比效果)、灰度发布(逐步扩大新模型使用范围)等策略,安全地将新模型上线替换旧模型。
    • 为什么需要 MLOps? 避免混乱,确保 AI 应用的质量、稳定性和可维护性,让 AI 开发部署像成熟的软件工程一样规范。

    六、 做负责任的 AI:关注隐私与透明度

    AI 越强大,越需要确保其使用方式合乎道德、保护用户隐私、并且决策过程可以被理解。

    保护隐私

    • 联邦学习 (FL):想象一下,多个医院想一起训练一个诊断模型,但又不能共享各自病人的敏感数据。FL 让每个医院在本地用自己的数据训练,只把学习到的“经验”(模型更新)匿名地发给中心服务器聚合,这样既利用了大家的数据,又保护了病人隐私。
    • 差分隐私 (DP):在数据或模型训练过程中加入一些精心计算过的“噪音”,使得从最终结果里几乎不可能反推出任何单个用户的信息。就像给群体照片打上马赛克,能看到整体,但看不清个人。

    让 AI 不再是“黑盒子”

    • 为什么需要? 有时 AI 做出的决定我们不理解,可能是错的,或者带有偏见。我们需要工具来“问”AI:“你为什么这么判断?”
    • 方法:LIME, SHAP 等工具可以分析出,对于某一个具体的预测结果,是输入里的哪些部分(比如一句话里的哪个词,一张图片里的哪个区域)起到了决定性作用。
    • 价值:帮助调试模型、发现并修正偏见、建立用户对 AI 的信任、满足法规要求。

  • 迁移 Ubuntu 24.04 系统从 VMware虚拟化迁移到 KVM 虚拟化

    当我们将虚拟机从 VMware 环境迁移到 KVM 虚拟化平台时,虽然系统能够成功启动,但可能会出现无法联网的情况。解决迁移 Ubuntu 24.04 系统从 VMware 到 KVM,无法获取IP导致没有网络的问题

    1. 迁移前的准备

    在迁移之前,需要做好以下准备工作:

    • 备份虚拟机:为了防止意外丢失数据,首先应该备份虚拟机。
    • 安装 QEMU-Guest-Agent:QEMU-Guest-Agent 是 KVM 环境中必要的工具,它能增强虚拟机和宿主机之间的交互,例如提供更好的网络性能和电源管理。 安装命令如下:
    sudo apt update
    sudo apt install qemu-guest-agent

    2. 虚拟机迁移操作

    迁移过程中,可以使用如下两种方法之一进行迁移:

    • 迁移虚拟磁盘:通过将 VMware 虚拟机的虚拟磁盘(通常为 .vmdk 文件)转换为 KVM 支持的格式(如 .qcow2.raw 格式)。

    可以使用 qemu-img 工具进行格式转换:

    qemu-img convert -f vmdk -O qcow2 vmware_disk.vmdk kvm_disk.qcow2
    • 直接导出并导入虚拟机:导出 VMware 虚拟机的配置并导入到 KVM 中,使用 KVM 的虚拟机管理工具如 virt-managervirsh 进行虚拟机的创建和配置。

    3. 启动虚拟机并验证迁移

    完成迁移后,启动虚拟机,确保虚拟机能够成功启动并进入系统。此时,我们会发现虚拟机能够正常启动,但有时候会出现无法联网的情况。

    网络问题分析

    在迁移完成后,我们的 Ubuntu 24.04 系统成功启动,但无法连接到网络。执行 ip a 命令时,虚拟机没有分配到 IP 地址,且网络接口无法连接。经过排查,发现问题的根本原因在于虚拟机的网络接口名称发生了变化。

    VMware 与 KVM 中的网卡名称差异

    在不同的虚拟化平台中,网络接口的命名规则是不同的:

    • VMware 中,网卡设备名通常是 ens33 或类似的名称。
    • KVM 中,网卡名称可能变为 ens3eth0 或其他类似的格式。

    在迁移过程中,由于底层虚拟化平台的差异,网卡名称发生了变化,而系统中的网络配置文件仍然使用的是旧的设备名称,导致虚拟机无法正确连接到网络。

    排查步骤

    1. 查看实际网卡名称

    通过执行 ip a 命令查看系统中的实际网卡名称。该命令输出中显示网卡名称为 ens3,而不是 VMware 中的 ens33

    ip a
    1. 检查 Netplan 配置文件

    Netplan 是 Ubuntu 系统中用于网络配置的工具。我们需要检查 Netplan 配置文件,确认是否仍然使用旧的设备名称。

    cat /etc/netplan/50-cloud-init.yaml

    如果文件中仍然使用的是旧的 ens33,而实际的设备名称是 ens3,这将导致无法应用正确的网络配置。

    解决方法

    为了修复这个网络问题,只需将 Netplan 配置文件中的网卡名称从 ens33 更改为实际的 ens3,然后重新应用网络配置即可。

    步骤 1:编辑 Netplan 配置文件

    打开 Netplan 配置文件进行编辑:

    sudo nano /etc/netplan/50-cloud-init.yaml

    将原配置:

    network:
      version: 2
      ethernets:
        ens33:
          dhcp4: true

    修改为:

    network:
      version: 2
      ethernets:
        ens3:
          dhcp4: true

    步骤 2:应用新的网络配置

    保存并关闭文件后,应用新的网络配置:

    sudo netplan apply

    步骤 3:检查网络是否恢复

    重新执行 ip a 命令,检查网络接口是否已成功获取到 IP 地址:

    ip a

    您应该可以看到 ens3 接口已成功获取到 IP 地址,网络恢复正常。

  • WordPress通过代码实现评论回复进行邮件通知

    我最近遇到了WordPress邮件发送的问题,在我印象中WordPress有评论回复是可以正常发送邮件的,经过我的排查发现twentytwentyfour主题,在文章评论页面没有如果有人回复我的评论,请通过电子邮件通知我这个功能,昨天翻阅了WordPress Developer Resources文档开始折腾这个功能,成功实现了

    1. 编辑twentytwentyfour主题的 functions.php 文件

    1. 编辑到您当前使用的主题目录,通常位于 wp-content/themes/your-theme-name/
    2. 找到 functions.php 文件并使用文本编辑器打开它。

    2. 添加代码

    将代码粘贴到 functions.php 文件的末尾,确保不要覆盖任何现有的代码

    // WordPress Comment Reply Notification
    function wpdocs_notify_comment_reply( $comment_id ) {
        $comment = get_comment( $comment_id );
        $parent_comment = get_comment( $comment->comment_parent );
    
        // 只有当这是一个回复并且存在父级评论时才继续
        if ( $comment->comment_parent != 0 && $parent_comment ) {
            $parent_author_email = $parent_comment->comment_author_email;
            $parent_author_name  = $parent_comment->comment_author;
            $post_title           = get_the_title( $parent_comment->comment_post_ID );
            $post_link            = get_permalink( $parent_comment->comment_post_ID );
            $reply_author_name    = $comment->comment_author;
            $reply_content        = $comment->comment_content;
            $site_name            = get_bloginfo('name'); // 获取站点名称
    
            // 避免给自己回复发送通知
            if ( $parent_author_email != $comment->comment_author_email ) {
                $subject = sprintf( '[%s] 您的评论收到了新的回复 - %s', $site_name, $post_title );
                $message = sprintf(
                    "您好 %s,\n\n" .
                    "您在文章《%s》上的评论收到了新的回复。\n\n" .
                    "回复人:%s\n" .
                    "回复内容:\n%s\n\n" .
                    "点击以下链接查看完整对话:\n%s#comment-%s\n\n" .
                    "如果这封邮件不是由您回复的,请忽略。\n\n" .
                    "感谢您的参与!\n\n" .
                    "%s 团队",
                    $parent_author_name,
                    $post_title,
                    $reply_author_name,
                    $reply_content,
                    $post_link,
                    $comment->comment_parent,
                    $site_name
                );
    
                wp_mail( $parent_author_email, $subject, $message );
            }
        }
    }
    add_action( 'comment_post', 'wpdocs_notify_comment_reply' );
  • Windows11安装和配置Stable Diffusion web UI

    1. 安装 Git 和 Conda

    首先,确保你的系统中已安装 Git 和 Conda。如果尚未安装,可以通过以下链接下载并安装:

    2. 创建并激活 Conda 环境

    打开终端(推荐使用 Anaconda Prompt 或 PowerShell),输入以下命令来创建一个新的 Python 3.10.6 环境并激活它:

    conda create --name sdai python=3.10.6
    conda activate sdai

    这将创建一个名为“sdai”的Conda环境,并使用Python 3.10.6版本。激活后,你的终端将切换到该环境。

    3. 克隆 Stable Diffusion web UI 仓库

    使用 Git 克隆 Stable Diffusion web UI 的 GitHub 仓库,然后进入该目录:

    git https://github.com/AUTOMATIC1111/stable-diffusion-webui
    cd sdai

    这样你就成功克隆了仓库并进入相应目录。

    4. 启动 Stable Diffusion web UI

    安装完成后,在同一目录下运行以下命令启动Stable Diffusion web UI:

    python launch.py

    如果一切顺利,Stable Diffusion web UI将启动,你可以通过浏览器访问它的界面。

    在浏览器中访问 http://localhost:7860

  • Ubuntu24.04在本地搭建 Kubernetes 开发环境:Docker、Minikube 和 kubectl 安装与配置指南

    如何在本地环境中通过 Docker、Minikube 和 kubectl 构建一个 Kubernetes 集群。Kubernetes 是目前主流的容器编排平台,而 Minikube 提供了一个轻量级的本地集群环境,方便开发者和学习者进行实验和测试。

    1. 安装 Docker

    首先,您需要在系统中安装 Docker。运行以下命令以下载并安装 Docker:

    # 安装 Docker
    curl -fsSL https://get.docker.com -o get-docker.sh
    sudo sh get-docker.sh

    安装完成后,将普通用户添加到 docker 用户组中,以便无需使用 sudo 来运行 Docker 命令:

    # 配置普通用户加入到 docker 用户组
    sudo usermod -aG docker $USER

    执行以上命令后,您需要退出并重新登录才能使更改生效。

    2. 安装 Minikube

    Minikube 是用于在本地启动 Kubernetes 集群的工具。运行以下命令以安装 Minikube:

    curl -LO https://github.com/kubernetes/minikube/releases/latest/download/minikube-linux-amd64
    sudo install minikube-linux-amd64 /usr/local/bin/minikube && rm minikube-linux-amd64
    
    minikube version

    3. 安装 kubectl

    1. 更新系统软件包列表,并安装必要的依赖:
    sudo apt-get update
    sudo apt-get install -y apt-transport-https ca-certificates curl gnupg
    1. 添加 Kubernetes 的 APT 仓库 GPG 密钥:
    curl -fsSL https://pkgs.k8s.io/core:/stable:/v1.32/deb/Release.key | sudo gpg --dearmor -o /etc/apt/keyrings/kubernetes-apt-keyring.gpg
    sudo chmod 644 /etc/apt/keyrings/kubernetes-apt-keyring.gpg
    1. 配置 Kubernetes APT 仓库源:
    echo 'deb [signed-by=/etc/apt/keyrings/kubernetes-apt-keyring.gpg] https://pkgs.k8s.io/core:/stable:/v1.32/deb/ /' | sudo tee /etc/apt/sources.list.d/kubernetes.list
    sudo chmod 644 /etc/apt/sources.list.d/kubernetes.list
    1. 更新软件包列表并安装 kubectl
    sudo apt-get update
    sudo apt-get install -y kubectl

    4. 启动 Minikube

    安装完成后,启动 Minikube 集群:

    minikube start --driver=docker

    5. 验证安装

    使用以下命令检查 Minikube 和 kubectl 的状态:

    minikube status
    kubectl get nodes

    如果输出显示集群状态正常,Minikube 已成功启动。

    6. 常用 kubectl 命令

    • 查看所有命名空间中的所有 Pod:
    kubectl get pods --all-namespaces
    • 查看默认命名空间中的所有 Pod:
    kubectl get pods
    • 查看服务:
    kubectl get services
    • 查看集群节点:
    kubectl get nodes
    • 查看所有 Deployments:
    kubectl get deployments
    • 查看资源使用情况(如节点的 CPU、内存等):
    kubectl top nodes
    • 删除一个 Pod:
    kubectl delete pod <pod-name>
    • 启动一个新的 Pod(如运行一个 nginx 容器):
    kubectl run nginx --image=nginx

    7. 访问 Kubernetes Dashboard(可选)

    如果您想进行可视化管理,可以访问 Kubernetes Dashboard:

    minikube dashboard

    8. 测试 Nginx 部署

    1. 创建一个 Nginx 部署:
    kubectl create deployment nginx --image=nginx
    1. 将 Nginx 部署暴露到集群外部:
    kubectl expose pod nginx --type=NodePort --name=nginx-service --port=80
    1. 查看服务的端口分配:
    kubectl get services
    1. 获取 Minikube 的 IP 地址:
    minikube ip
    1. 使用浏览器测试 Nginx 服务:
    curl http://<IP>:<端口>

    9. 临时暴露端口供其他人访问,使用 kubectl port-forward 访问 Nginx

    1. 确保 Nginx Pod 正在运行:
    kubectl create deployment nginx --image=nginx
    1. 查找 Nginx Pod 的名称:
    kubectl get pods -l app=nginx
    1. 使用 kubectl port-forward 进行端口转发:
    kubectl port-forward --address 0.0.0.0 <pod-name> <host-port>:<container-port>

    例如,将本地的 8080 端口转发到 Nginx 容器的 80 端口:

    kubectl port-forward --address 0.0.0.0 nginx-5869d7778c-qdfr2 8080:80
    1. 保持终端窗口打开。
    2. 从外部访问 Nginx:
    http://<IP>:8080

    10. 注意事项

    • kubectl port-forward 端口转发是临时的,关闭终端窗口时会断开连接。
    • 使用 --address 0.0.0.0 将服务暴露到所有网络接口,确保在公共网络中谨慎使用。
    • Pod 故障时,需要重新执行端口转发命令。