<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>DevOps on Leanku 的博客</title><link>https://www.leanku.com/post/devops/</link><description>Recent content in DevOps on Leanku 的博客</description><generator>Hugo</generator><language>zh-cn</language><lastBuildDate>Sat, 09 Aug 2025 16:46:01 +0800</lastBuildDate><atom:link href="https://www.leanku.com/post/devops/index.xml" rel="self" type="application/rss+xml"/><item><title>Drone CICD自动化部署指南</title><link>https://www.leanku.com/post/devops/drone-cicd%E8%87%AA%E5%8A%A8%E5%8C%96%E9%83%A8%E7%BD%B2%E6%8C%87%E5%8D%97/</link><pubDate>Sat, 09 Aug 2025 16:46:01 +0800</pubDate><guid>https://www.leanku.com/post/devops/drone-cicd%E8%87%AA%E5%8A%A8%E5%8C%96%E9%83%A8%E7%BD%B2%E6%8C%87%E5%8D%97/</guid><description>&lt;h2 id="一drone核心优势与架构设计"&gt;一、Drone核心优势与架构设计&lt;/h2&gt;&#10;&lt;h3 id="11-为什么选择drone"&gt;1.1 为什么选择Drone&lt;/h3&gt;&#10;&lt;p&gt;&lt;a href="https://docs.drone.io"&gt;官方文档&lt;/a&gt;&lt;/p&gt;&#10;&lt;p&gt;Drone作为轻量级云原生CI/CD工具，相比Jenkins具有显著优势：&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;&lt;strong&gt;资源占用低&lt;/strong&gt;：基于Docker容器化运行，单个Pipeline平均内存消耗&amp;lt;100MB&lt;/p&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;&lt;strong&gt;云原生支持&lt;/strong&gt;：原生集成Kubernetes、Docker等云原生技术栈&lt;/p&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;&lt;strong&gt;配置即代码&lt;/strong&gt;：完全通过.drone.yml定义流程，版本可控&lt;/p&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;&lt;strong&gt;高性能&lt;/strong&gt;：测试显示并发构建能力比Jenkins高3-5倍16&lt;/p&gt;&#10;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h3 id="12-企业级架构设计"&gt;1.2 企业级架构设计&lt;/h3&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;1&lt;/span&gt;&lt;span class="cl"&gt;[Gitee/GitHub] → [Drone Server] → [Docker Runner] (开发环境)&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;2&lt;/span&gt;&lt;span class="cl"&gt; ↘ [K8s Runner] (生产环境)&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;3&lt;/span&gt;&lt;span class="cl"&gt; ↘ [SSH Runner] (特殊场景)&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="二-注册-oauth-应用-gitee为例"&gt;二、 注册 OAuth 应用 （Gitee为例）&lt;/h2&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;登录 Gitee → 点击右上角头像 → &lt;strong&gt;设置&lt;/strong&gt; → &lt;strong&gt;第三方应用&lt;/strong&gt; → &lt;strong&gt;创建应用&lt;/strong&gt;&lt;/p&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;填写应用信息：&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;应用名称：&lt;code&gt;Drone CI&lt;/code&gt;（自定义）&lt;/li&gt;&#10;&lt;li&gt;应用描述：&lt;code&gt;Drone CI/CD 工具&lt;/code&gt;（自定义）&lt;/li&gt;&#10;&lt;li&gt;授权回调地址：&lt;code&gt;http://你的服务器IP或域名/login&lt;/code&gt;（必须正确，否则无法登录）&lt;/li&gt;&#10;&lt;li&gt;应用主页：&lt;code&gt;http://你的服务器IP或域名&lt;/code&gt;&lt;/li&gt;&#10;&lt;li&gt;权限选择：（最少权限原则）user_info，projects，pull_requests，hooks&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;提交后，记录生成的 &lt;strong&gt;Client ID&lt;/strong&gt; 和 &lt;strong&gt;Client Secret&lt;/strong&gt;（后续配置需要）&lt;/p&gt;&#10;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h2 id="三安装-drone-服务器和-runner"&gt;三、安装 Drone 服务器和 Runner&lt;/h2&gt;&#10;&lt;p&gt;Drone 由两部分组成：&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;strong&gt;Drone Server&lt;/strong&gt;：管理项目、接收仓库事件、协调任务&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Drone Runner&lt;/strong&gt;：执行流水线任务（编译、测试、部署等）&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h3 id="31-手动启动-drone-server"&gt;3.1 手动启动 Drone Server&lt;/h3&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 1&lt;/span&gt;&lt;span class="cl"&gt;docker run -d &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 2&lt;/span&gt;&lt;span class="cl"&gt; --name drone-server &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 3&lt;/span&gt;&lt;span class="cl"&gt; --restart always &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 4&lt;/span&gt;&lt;span class="cl"&gt; -p 80:80 &lt;span class="se"&gt;\ &lt;/span&gt; &lt;span class="c1"&gt;# 端口映射（生产环境建议加 HTTPS）&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 5&lt;/span&gt;&lt;span class="cl"&gt; -v /var/lib/drone:/data &lt;span class="se"&gt;\ &lt;/span&gt; &lt;span class="c1"&gt;# 数据持久化&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 6&lt;/span&gt;&lt;span class="cl"&gt; -e &lt;span class="nv"&gt;DRONE_RPC_SECRET&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;your_agent_secret &lt;span class="se"&gt;\ &lt;/span&gt; &lt;span class="c1"&gt;# 自定义密钥（与 Runner 保持一致）&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 7&lt;/span&gt;&lt;span class="cl"&gt; -e &lt;span class="nv"&gt;DRONE_GITEE_CLIENT_ID&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;你的Gitee Client ID &lt;span class="se"&gt;\ &lt;/span&gt; &lt;span class="c1"&gt;# 替换为 Gitee 应用的 Client ID&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 8&lt;/span&gt;&lt;span class="cl"&gt; -e &lt;span class="nv"&gt;DRONE_GITEE_CLIENT_SECRET&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;你的Gitee Client Secret &lt;span class="se"&gt;\ &lt;/span&gt; &lt;span class="c1"&gt;# 替换为 Gitee 应用的 Secret&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 9&lt;/span&gt;&lt;span class="cl"&gt; -e &lt;span class="nv"&gt;DRONE_GITEE_SERVER&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;https://gitee.com &lt;span class="se"&gt;\ &lt;/span&gt; &lt;span class="c1"&gt;# Gitee 服务器地址（固定）&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;10&lt;/span&gt;&lt;span class="cl"&gt; -e &lt;span class="nv"&gt;DRONE_SERVER_HOST&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;你的服务器IP或域名 &lt;span class="se"&gt;\ &lt;/span&gt; &lt;span class="c1"&gt;# Drone 访问地址（如 drone.example.com）&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;11&lt;/span&gt;&lt;span class="cl"&gt; -e &lt;span class="nv"&gt;DRONE_SERVER_PROTO&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;http &lt;span class="se"&gt;\ &lt;/span&gt; &lt;span class="c1"&gt;# 协议（http 或 https）&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;12&lt;/span&gt;&lt;span class="cl"&gt; -e &lt;span class="nv"&gt;DRONE_USER_CREATE&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;username:你的Gitee用户名,admin:true &lt;span class="se"&gt;\ &lt;/span&gt; &lt;span class="c1"&gt;# 设置 Gitee 用户名作为管理员&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;13&lt;/span&gt;&lt;span class="cl"&gt; drone/drone:2.16&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;DRONE_AGENT_SECRET 可以简单用命令生成&lt;code&gt;openssl rand -hex 16&lt;/code&gt;&#10;Drone Server 默认监听容器内的 80 端口（HTTP）和 443 端口（HTTPS，若配置证书），你可以通过 Docker 的端口映射映射（-p 参数）自定义宿主机的端口。&lt;/p&gt;</description></item><item><title>轻量级容器编排工具指南</title><link>https://www.leanku.com/post/devops/%E8%BD%BB%E9%87%8F%E7%BA%A7%E5%AE%B9%E5%99%A8%E7%BC%96%E6%8E%92%E5%B7%A5%E5%85%B7%E6%8C%87%E5%8D%97/</link><pubDate>Sat, 09 Aug 2025 16:46:01 +0800</pubDate><guid>https://www.leanku.com/post/devops/%E8%BD%BB%E9%87%8F%E7%BA%A7%E5%AE%B9%E5%99%A8%E7%BC%96%E6%8E%92%E5%B7%A5%E5%85%B7%E6%8C%87%E5%8D%97/</guid><description>&lt;h1 id="轻量级容器编排工具指南"&gt;轻量级容器编排工具指南&lt;/h1&gt;&#10;&lt;p&gt;在 Docker 环境中，除了 K8s，还有多种轻量级方案可以实现服务自动重启、健康检查等功能，特别适合单机或中小规模部署。&lt;/p&gt;&#10;&lt;h2 id="一简单方案"&gt;一、简单方案&lt;/h2&gt;&#10;&lt;h3 id="11-docker-自身的重启策略最基础方案"&gt;1.1 Docker 自身的重启策略（最基础方案）&lt;/h3&gt;&#10;&lt;p&gt;Docker Engine 内置了容器重启策略，可直接在启动容器时配置，实现容器退出后自动重启。&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;常用重启策略：&lt;/strong&gt;&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;code&gt;--restart always&lt;/code&gt;：无论容器因何种原因退出（包括正常退出），总是自动重启。&lt;/li&gt;&#10;&lt;li&gt;&lt;code&gt;--restart on-failure[:max-retries]&lt;/code&gt;：仅在容器以非 0 状态码退出时重启，可选最大重试次数（如&lt;code&gt;on-failure:3&lt;/code&gt;最多重启 3 次）。&lt;/li&gt;&#10;&lt;li&gt;&lt;code&gt;--restart unless-stopped&lt;/code&gt;：除非手动执行&lt;code&gt;docker stop&lt;/code&gt;，否则始终重启（包括 Docker daemon 重启时）&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;&lt;strong&gt;示例：&lt;/strong&gt;&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;1&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 启动PHP容器，配置always重启策略&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;2&lt;/span&gt;&lt;span class="cl"&gt;docker run -d &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;3&lt;/span&gt;&lt;span class="cl"&gt; --name php-app &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;4&lt;/span&gt;&lt;span class="cl"&gt; --restart always &lt;span class="se"&gt;\ &lt;/span&gt; &lt;span class="c1"&gt;# 核心：容器挂掉后自动重启&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;5&lt;/span&gt;&lt;span class="cl"&gt; -p 80:80 &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;6&lt;/span&gt;&lt;span class="cl"&gt; -v /path/to/php/code:/var/www/html &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;7&lt;/span&gt;&lt;span class="cl"&gt; php:8.2-apache&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;优势：&lt;/strong&gt; 零依赖，直接使用 Docker 原生功能，适合单机部署。&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;局限：&lt;/strong&gt; 仅能监控容器本身是否存活，无法检测应用内部故障（如 PHP-FPM 假死但容器仍运行）。&lt;/p&gt;&#10;&lt;h3 id="12-ocker-compose适合多容器应用"&gt;1.2 ocker Compose（适合多容器应用）&lt;/h3&gt;&#10;&lt;p&gt;如果 项目依赖其他服务（如 MySQL、Redis），可使用docker-compose管理，通过配置restart参数实现自动重启，同时支持健康检查。&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;docker-compose.yml示例：&lt;/strong&gt;&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-yaml" data-lang="yaml"&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 1&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;version&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;3.8&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 2&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;services&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 3&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;php-app&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 4&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;image&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;php:8.2-apache&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 5&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;restart&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;always &lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c"&gt;# 容器退出后自动重启&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 6&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;ports&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 7&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="s2"&gt;&amp;#34;80:80&amp;#34;&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 8&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;volumes&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 9&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="l"&gt;./php-code:/var/www/html&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;10&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;depends_on&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;11&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="l"&gt;mysql&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;12&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c"&gt;# 健康检查：检测PHP服务是否正常响应&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;13&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;healthcheck&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;14&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;test&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;CMD&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;curl&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;-f&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;http://localhost/health.php&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c"&gt;# 自定义健康检查接口&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;15&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;interval&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;30s &lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c"&gt;# 每30秒检查一次&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;16&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;timeout&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;10s &lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c"&gt;# 检查超时时间&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;17&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;retries&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;3&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c"&gt;# 连续3次失败视为不健康&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;18&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;start_period&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;60s &lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c"&gt;# 启动后60秒内不检查&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;19&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;20&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;mysql&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;21&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;image&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;mysql:8.0&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;22&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;restart&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;always&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;23&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;environment&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;24&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;MYSQL_ROOT_PASSWORD&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;rootpass&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;25&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;MYSQL_DATABASE&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;phpapp&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;健康检查补充：&lt;/strong&gt;&#10;在 PHP 项目中创建health.php作为健康检查接口（返回 200 状态码表示正常）：&lt;/p&gt;</description></item><item><title>wrk 使用指南</title><link>https://www.leanku.com/post/devops/wrk-%E4%BD%BF%E7%94%A8%E6%8C%87%E5%8D%97/</link><pubDate>Mon, 30 Jun 2025 23:46:01 +0800</pubDate><guid>https://www.leanku.com/post/devops/wrk-%E4%BD%BF%E7%94%A8%E6%8C%87%E5%8D%97/</guid><description>&lt;h1 id="wrk-使用指南"&gt;wrk 使用指南&lt;/h1&gt;&#10;&lt;h2 id="一介绍"&gt;一、介绍&lt;/h2&gt;&#10;&lt;p&gt;wrk 是一款现代化的 HTTP 基准测试工具，使用 C 语言编写，基于事件通知机制（如 epoll, kqueue），能够产生巨大的负载。相比 ab(apache benchmark)，wrk 具有以下优势：&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;支持多线程 + 协程模式，能更好地利用多核 CPU&lt;/p&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;支持 LuaJIT 脚本扩展，可自定义请求生成和结果处理&lt;/p&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;性能更高，单机可轻松产生数万 QPS&lt;/p&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;提供更详细的统计信息（延迟分布等）&lt;/p&gt;&#10;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h2 id="二安装-wrk"&gt;二、安装 wrk&lt;/h2&gt;&#10;&lt;p&gt;Linux 系统安装&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 1&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Ubuntu/Debian&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 2&lt;/span&gt;&lt;span class="cl"&gt;sudo apt install wrk -y&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 3&lt;/span&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 4&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# CentOS/RHEL&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 5&lt;/span&gt;&lt;span class="cl"&gt;sudo yum install wrk -y&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 6&lt;/span&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 7&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 或从源码编译安装&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 8&lt;/span&gt;&lt;span class="cl"&gt;git clone https://github.com/wg/wrk.git&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 9&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;cd&lt;/span&gt; wrk&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;10&lt;/span&gt;&lt;span class="cl"&gt;make&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;11&lt;/span&gt;&lt;span class="cl"&gt;sudo cp wrk /usr/local/bin/&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;macos&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;1&lt;/span&gt;&lt;span class="cl"&gt;brew install wrk&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="三基础使用方法"&gt;三、基础使用方法&lt;/h2&gt;&#10;&lt;h3 id="1--基本命令格式"&gt;1. 基本命令格式&lt;/h3&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;1&lt;/span&gt;&lt;span class="cl"&gt;wrk &amp;lt;选项&amp;gt; &amp;lt;测试URL&amp;gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="2-常用选项说明"&gt;2. 常用选项说明&lt;/h3&gt;&#10;&lt;table&gt;&#10;&#9;&lt;thead&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th style="text-align: left"&gt;选项&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th style="text-align: left"&gt;说明&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th style="text-align: left"&gt;示例值&lt;/th&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/thead&gt;&#10;&#9;&lt;tbody&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;-t&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;使用的线程数&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;12 (建议设置为CPU核心数的2-4倍)&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;-c&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;保持打开的连接数&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;100&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;-d&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;测试持续时间&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;30s (30秒), 2m (2分钟)&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;-s&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;指定Lua脚本&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;post.lua&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;-H&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;添加HTTP头&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;&amp;ldquo;User-Agent: wrk&amp;rdquo;&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;&amp;ndash;latency&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;打印延迟统计&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;无参数&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;&amp;ndash;timeout&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;超时设置&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;10s&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/tbody&gt;&#10;&lt;/table&gt;&#10;&lt;h3 id="3-基本测试示例"&gt;3. 基本测试示例&lt;/h3&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;1&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 简单测试：12线程，100连接，持续30秒&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;2&lt;/span&gt;&lt;span class="cl"&gt;wrk -t12 -c100 -d30s http://localhost:8080/&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;3&lt;/span&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;4&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 带延迟统计的输出&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;5&lt;/span&gt;&lt;span class="cl"&gt;wrk -t12 -c100 -d30s --latency http://localhost:8080/api&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;6&lt;/span&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;7&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 带自定义HTTP头&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;8&lt;/span&gt;&lt;span class="cl"&gt;wrk -t12 -c100 -d30s -H &lt;span class="s2"&gt;&amp;#34;Authorization: Bearer token123&amp;#34;&lt;/span&gt; http://localhost:8080/api&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="四高级功能使用-lua-脚本"&gt;四、高级功能：使用 Lua 脚本&lt;/h2&gt;&#10;&lt;p&gt;wrk 的强大之处在于支持通过 Lua 脚本自定义请求。&lt;/p&gt;</description></item><item><title>基于 Gogs + Jenkins + Harbor + Docker 的自动化部署方案</title><link>https://www.leanku.com/post/devops/%E5%9F%BA%E4%BA%8E-gogs--jenkins--harbor--docker-%E7%9A%84%E8%87%AA%E5%8A%A8%E5%8C%96%E9%83%A8%E7%BD%B2%E6%96%B9%E6%A1%88/</link><pubDate>Sat, 17 May 2025 18:46:01 +0800</pubDate><guid>https://www.leanku.com/post/devops/%E5%9F%BA%E4%BA%8E-gogs--jenkins--harbor--docker-%E7%9A%84%E8%87%AA%E5%8A%A8%E5%8C%96%E9%83%A8%E7%BD%B2%E6%96%B9%E6%A1%88/</guid><description>&lt;h1 id="基于-gogs--jenkins--harbor--docker-的自动化部署方案"&gt;基于 Gogs + Jenkins + Harbor + Docker 的自动化部署方案&lt;/h1&gt;&#10;&lt;h2 id="1-系统架构总览"&gt;1. 系统架构总览&lt;/h2&gt;&#10;&lt;pre tabindex="0"&gt;&lt;code class="language-mermaid" data-lang="mermaid"&gt;开发者提交代码 → Git仓库 → Jenkins触发构建 → Docker构建镜像 → 推送至Harbor → &#10;Kubernetes部署更新 → 监控反馈&#10;&lt;/code&gt;&lt;/pre&gt;&lt;h2 id="2-环境准备"&gt;2. 环境准备&lt;/h2&gt;&#10;&lt;h3 id="21-硬件要求"&gt;2.1 硬件要求&lt;/h3&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;最低配置：2核CPU/4GB内存/100GB存储&lt;/li&gt;&#10;&lt;li&gt;推荐配置：4核CPU/8GB内存/200GB SSD&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h2 id="3-组件安装与配置"&gt;3. 组件安装与配置&lt;/h2&gt;&#10;&lt;h3 id="31-gogs-安装"&gt;3.1 Gogs 安装&lt;/h3&gt;&#10;&lt;p&gt;另外一篇&lt;a href="https://www.leanku.com/content/post/Jenkins%20%E4%BD%BF%E7%94%A8.md"&gt;Jenkins 使用&lt;/a&gt;&lt;/p&gt;&#10;&lt;h3 id="32-jenkins-安装"&gt;3.2 &lt;a href="https://www.jenkins.io/doc/book/installing/linux/"&gt;Jenkins&lt;/a&gt; 安装&lt;/h3&gt;&#10;&lt;p&gt;另外一篇&lt;a href="https://www.leanku.com/content/post/Gogs%20%20%E4%BD%BF%E7%94%A8.md"&gt;Gogs 使用&lt;/a&gt;&lt;/p&gt;&#10;&lt;h3 id="33-harbor-安装"&gt;3.3 Harbor 安装&lt;/h3&gt;&#10;&lt;p&gt;另外一篇&lt;a href="https://www.leanku.com/content/post/Harbor%20%E4%BD%BF%E7%94%A8.md"&gt;Harbor 使用&lt;/a&gt;&lt;/p&gt;&#10;&lt;h2 id="4-环境配置"&gt;4. 环境配置&lt;/h2&gt;&#10;&lt;p&gt;下面以wordpress项目为例&lt;/p&gt;&#10;&lt;pre tabindex="0"&gt;&lt;code&gt;wordpress/&#10;├── app/ # 项目代码&#10;├── docker # Docker 相关文件&#10;| ├── Dockerfile &#10;| ├── entrypont.sh &#10;| └── nginx.conf &#10;| └── nginx-wordpress.conf &#10;├── Jenkinsfile # Jenkins Pipeline 定义&#10;└── k8s/ # Kubernetes 部署文件&#10; ├── deployment.yaml # Deployment 配置&#10; ├── service.yaml # Service 配置&#10; └── ingress.yaml # Ingress 配置（可选）&#10; └── namespace.yaml # namespace 配置（可选）&#10;&lt;/code&gt;&lt;/pre&gt;&lt;h3 id="41-jenkinspipeline配置"&gt;4.1 JenkinsPipeline配置&lt;/h3&gt;&#10;&lt;ol&gt;&#10;&lt;li&gt;安装必要插件&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;Kubernetes Continuous Deploy&lt;/li&gt;&#10;&lt;li&gt;Docker Pipeline&lt;/li&gt;&#10;&lt;li&gt;Gogs plugin&lt;/li&gt;&#10;&lt;li&gt;Harbor&lt;/li&gt;&#10;&lt;li&gt;Git&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;ol start="2"&gt;&#10;&lt;li&gt;配置凭据:&#10;Manage Jenkins &amp;gt; Credentials&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;Git仓库访问凭据 ID如 gogs-credential&lt;/li&gt;&#10;&lt;li&gt;Harbor仓库凭据 ID如harbor-credential&lt;/li&gt;&#10;&lt;li&gt;Kubernetes集群凭据 （/etc/rancher/k3s）ID如 k3s-kubeconfig&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;Jenkins 示例：&lt;/p&gt;</description></item><item><title>K3s使用指南</title><link>https://www.leanku.com/post/devops/k3s%E4%BD%BF%E7%94%A8%E6%8C%87%E5%8D%97/</link><pubDate>Mon, 12 May 2025 21:46:01 +0800</pubDate><guid>https://www.leanku.com/post/devops/k3s%E4%BD%BF%E7%94%A8%E6%8C%87%E5%8D%97/</guid><description>&lt;h1 id="k3s使用指南rancher"&gt;K3s使用指南+Rancher&lt;/h1&gt;&#10;&lt;h2 id="1-k3s--简介"&gt;1. &lt;a href="https://k3s.io"&gt;K3s&lt;/a&gt; 简介&lt;/h2&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;K3s 是一个轻量级的 Kubernetes 发行版，由 Rancher Labs（现在是 SUSE 旗下）开发。&lt;/li&gt;&#10;&lt;li&gt;它完全兼容 Kubernetes API，但设计上更轻便、易安装，适合边缘计算、物联网设备、单节点或资源有限环境。&lt;/li&gt;&#10;&lt;li&gt;K3s 把 Kubernetes 的很多组件做了简化，比如内置了 containerd，默认启用 flannel 网络，去掉了复杂的插件，安装非常简单。&lt;/li&gt;&#10;&lt;li&gt;主要目标是让 Kubernetes 快速部署、低资源占用，并且更适合国内和小型集群使用。&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h2 id="2-k3s-对比-kubeadm"&gt;2. K3s 对比 kubeadm&lt;/h2&gt;&#10;&lt;table&gt;&#10;&#9;&lt;thead&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;特性/方面&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;K3s&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;kubeadm&lt;/th&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/thead&gt;&#10;&#9;&lt;tbody&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;strong&gt;定位&lt;/strong&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;轻量级、开箱即用的 Kubernetes 发行版&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;官方工具，用于标准 Kubernetes 集群的快速部署和引导&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;strong&gt;安装复杂度&lt;/strong&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;极简安装，单条命令搞定&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;需要多个步骤，配置复杂，适合有一定 Kubernetes 经验的用户&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;strong&gt;组件集成&lt;/strong&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;集成了 &lt;code&gt;containerd&lt;/code&gt;，默认内置 &lt;code&gt;flannel&lt;/code&gt; 网络，默认关闭了部分复杂组件（如部分云插件、Helm等）&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;只负责初始化集群，组件和网络插件需要用户自行选择安装&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;strong&gt;资源占用&lt;/strong&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;非常低，适合边缘设备、物联网、单机小集群&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;资源占用较大，适合生产多节点环境&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;strong&gt;多节点支持&lt;/strong&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;支持多节点，但更适合轻量和小规模集群&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;原生支持多节点和大规模集群，灵活度高&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;strong&gt;适用场景&lt;/strong&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;单机、开发测试、小型集群、资源受限环境&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;生产环境，多节点，企业级集群部署&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;strong&gt;网络插件&lt;/strong&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;默认集成 Flannel，安装简单&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;用户需自行部署网络插件（Flannel、Calico、Weave等）&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;strong&gt;更新升级&lt;/strong&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;版本更新简单，内置自动化升级工具&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;需要手动升级，过程复杂&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;strong&gt;集成工具和生态&lt;/strong&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;内置 Traefik（可选关闭），轻量且默认功能有限&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;灵活，可按需安装 Ingress、Dashboard、Helm 等组件&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;strong&gt;社区和支持&lt;/strong&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Rancher 支持，社区活跃&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;CNCF 官方支持，社区广泛&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;strong&gt;官网文档&lt;/strong&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;a href="https://k3s.io"&gt;https://k3s.io&lt;/a&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;a href="https://kubernetes.io/docs/setup/production-environment/tools/kubeadm/"&gt;https://kubernetes.io/docs/setup/production-environment/tools/kubeadm/&lt;/a&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/tbody&gt;&#10;&lt;/table&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;如果你是想快速搭建一个单机或轻量集群，或者资源有限，想要简单易用、快速上手，推荐用 K3s。&lt;/p&gt;</description></item><item><title>Kubernetes（k8s）单机环境部署</title><link>https://www.leanku.com/post/devops/kubernetesk8s%E5%8D%95%E6%9C%BA%E7%8E%AF%E5%A2%83%E9%83%A8%E7%BD%B2/</link><pubDate>Sun, 11 May 2025 22:46:01 +0800</pubDate><guid>https://www.leanku.com/post/devops/kubernetesk8s%E5%8D%95%E6%9C%BA%E7%8E%AF%E5%A2%83%E9%83%A8%E7%BD%B2/</guid><description>&lt;h1 id="kubernetesk8s单机环境部署"&gt;Kubernetes（k8s）单机环境部署&lt;/h1&gt;&#10;&lt;h2 id="1-kubernetes-k8s--简介"&gt;1. &lt;a href="https://kubernetes.p2hp.com/"&gt;Kubernetes (K8s)&lt;/a&gt; 简介&lt;/h2&gt;&#10;&lt;p&gt;此文适合新手快速上手，涵盖安装、配置、基本使用 单机环境&lt;/p&gt;&#10;&lt;h2 id="2-环境"&gt;2. 环境&lt;/h2&gt;&#10;&lt;p&gt;&lt;strong&gt;系统要求&lt;/strong&gt;&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;操作系统：Linux（Ubuntu/CentOS）或 macOS（开发环境）&lt;/li&gt;&#10;&lt;li&gt;内存：至少 2GB（推荐 4GB+）&lt;/li&gt;&#10;&lt;li&gt;CPU：2 核+&lt;/li&gt;&#10;&lt;li&gt;存储：20GB+ 可用空间&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;&lt;strong&gt;安装工具&lt;/strong&gt;&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;Docker（K8s 依赖容器运行时）&lt;/li&gt;&#10;&lt;li&gt;kubectl（K8s 命令行工具）&lt;/li&gt;&#10;&lt;li&gt;Minikube（本地单节点 K8s，适合学习）&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h2 id="3-前置配置"&gt;3. 前置配置&lt;/h2&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 1&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 1.关闭 swap&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 2&lt;/span&gt;&lt;span class="cl"&gt;sudo swapoff -a&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 3&lt;/span&gt;&lt;span class="cl"&gt;sudo sed -i &lt;span class="s1"&gt;&amp;#39;/ swap / s/^\(.*\)$/#\1/g&amp;#39;&lt;/span&gt; /etc/fstab&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 4&lt;/span&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 5&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 2.加载内核模块&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 6&lt;/span&gt;&lt;span class="cl"&gt;sudo modprobe overlay&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 7&lt;/span&gt;&lt;span class="cl"&gt;sudo modprobe br_netfilter&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 8&lt;/span&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 9&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 3.设置内核参数&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;10&lt;/span&gt;&lt;span class="cl"&gt;cat &lt;span class="s"&gt;&amp;lt;&amp;lt;EOF | sudo tee /etc/sysctl.d/k8s.conf&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;11&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;net.bridge.bridge-nf-call-ip6tables = 1&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;12&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;net.bridge.bridge-nf-call-iptables = 1&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;13&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;net.ipv4.ip_forward = 1&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;14&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;EOF&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;15&lt;/span&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;16&lt;/span&gt;&lt;span class="cl"&gt;sudo sysctl --system&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="4安装container-runtime推荐使用-containerd"&gt;4.安装&lt;strong&gt;container runtime&lt;/strong&gt;（推荐使用 containerd）&lt;/h2&gt;&#10;&lt;p&gt;Kubernetes v1.24 开始，完全移除了 dockershim&lt;/p&gt;</description></item><item><title>SSH 使用指南</title><link>https://www.leanku.com/post/devops/ssh-%E4%BD%BF%E7%94%A8%E6%8C%87%E5%8D%97/</link><pubDate>Sun, 11 May 2025 13:46:01 +0800</pubDate><guid>https://www.leanku.com/post/devops/ssh-%E4%BD%BF%E7%94%A8%E6%8C%87%E5%8D%97/</guid><description>&lt;h1 id="ssh-使用指南从基础到服务器密钥登录"&gt;SSH 使用指南：从基础到服务器密钥登录&lt;/h1&gt;&#10;&lt;h2 id="什么是-ssh"&gt;什么是 SSH？&lt;/h2&gt;&#10;&lt;p&gt;SSH (Secure Shell) 是一种加密的网络协议，用于在不安全的网络中安全地进行远程登录和其他网络服务。它通过加密技术保护通信安全，防止信息泄露和中间人攻击，是系统管理员和开发人员管理远程服务器的必备工具。&lt;/p&gt;&#10;&lt;h2 id="基本-ssh-连接"&gt;基本 SSH 连接&lt;/h2&gt;&#10;&lt;p&gt;最基本的 SSH 连接命令格式如下：&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;1&lt;/span&gt;&lt;span class="cl"&gt;ssh username@hostname&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;例如，要连接到 IP 为 192.168.1.100 的服务器，用户名为 admin：&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;1&lt;/span&gt;&lt;span class="cl"&gt;ssh admin@192.168.1.100&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;首次连接时会提示验证服务器指纹：&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;1&lt;/span&gt;&lt;span class="cl"&gt;The authenticity of host &amp;#39;192.168.1.100 (192.168.1.100)&amp;#39; can&amp;#39;t be established.&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;2&lt;/span&gt;&lt;span class="cl"&gt;ECDSA key fingerprint is SHA256:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx.&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;3&lt;/span&gt;&lt;span class="cl"&gt;Are you sure you want to continue connecting (yes/no)?&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;输入 &lt;code&gt;yes&lt;/code&gt; 后，服务器指纹会被保存在本地 &lt;code&gt;~/.ssh/known_hosts&lt;/code&gt; 文件中，以后连接时会自动验证。&lt;/p&gt;&#10;&lt;h2 id="ssh-配置文件"&gt;SSH 配置文件&lt;/h2&gt;&#10;&lt;p&gt;SSH 客户端配置文件 &lt;code&gt;~/.ssh/config&lt;/code&gt; 可以简化连接命令。例如：&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;1&lt;/span&gt;&lt;span class="cl"&gt;Host myserver&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;2&lt;/span&gt;&lt;span class="cl"&gt; HostName 192.168.1.100&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;3&lt;/span&gt;&lt;span class="cl"&gt; User admin&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;4&lt;/span&gt;&lt;span class="cl"&gt; Port 2222&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;配置后，只需输入 &lt;code&gt;ssh myserver&lt;/code&gt; 即可连接。&lt;/p&gt;</description></item><item><title>Prometheus + Grafana + Alertmanager轻量级监控告警系统</title><link>https://www.leanku.com/post/devops/prometheus--grafana--alertmanager%E8%BD%BB%E9%87%8F%E7%BA%A7%E7%9B%91%E6%8E%A7%E5%91%8A%E8%AD%A6%E7%B3%BB%E7%BB%9F/</link><pubDate>Sun, 11 May 2025 00:00:00 +0000</pubDate><guid>https://www.leanku.com/post/devops/prometheus--grafana--alertmanager%E8%BD%BB%E9%87%8F%E7%BA%A7%E7%9B%91%E6%8E%A7%E5%91%8A%E8%AD%A6%E7%B3%BB%E7%BB%9F/</guid><description>&lt;h1 id="prometheus--grafana--alertmanager轻量级监控告警系统"&gt;Prometheus + Grafana + Alertmanager轻量级监控告警系统&lt;/h1&gt;&#10;&lt;h2 id="一工具简介与官网"&gt;&lt;strong&gt;一、工具简介与官网&lt;/strong&gt;&lt;/h2&gt;&#10;&lt;table&gt;&#10;&#9;&lt;thead&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th style="text-align: left"&gt;工具&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th style="text-align: left"&gt;作用&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th style="text-align: left"&gt;官网文档地址&lt;/th&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/thead&gt;&#10;&#9;&lt;tbody&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;&lt;strong&gt;Prometheus&lt;/strong&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;指标采集、存储与告警规则管理&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;&lt;a href="https://prometheus.io/docs/"&gt;prometheus.io/docs&lt;/a&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;&lt;strong&gt;Node Exporter&lt;/strong&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;暴露服务器硬件/OS指标&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;&lt;a href="https://github.com/prometheus/node_exporter"&gt;github.com/prometheus/node_exporter&lt;/a&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;&lt;strong&gt;Alertmanager&lt;/strong&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;告警聚合与通知发送&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;&lt;a href="https://prometheus.io/docs/alerting/latest/alertmanager/"&gt;prometheus.io/docs/alerting&lt;/a&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;&lt;strong&gt;Grafana&lt;/strong&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;数据可视化与仪表盘&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;&lt;a href="https://grafana.com/docs/"&gt;grafana.com/docs&lt;/a&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/tbody&gt;&#10;&lt;/table&gt;&#10;&lt;h2 id="二安装与配置"&gt;&lt;strong&gt;二、安装与配置&lt;/strong&gt;&lt;/h2&gt;&#10;&lt;h3 id="1-prometheus-安装"&gt;&lt;strong&gt;1. Prometheus 安装&lt;/strong&gt;&lt;/h3&gt;&#10;&lt;h4 id="11-下载与解压"&gt;&lt;strong&gt;1.1 下载与解压&lt;/strong&gt;&lt;/h4&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;1&lt;/span&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;2&lt;/span&gt;&lt;span class="cl"&gt;wget https://github.com/prometheus/prometheus/releases/download/v2.51.0/prometheus-2.51.0.linux-amd64.tar.gz&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;3&lt;/span&gt;&lt;span class="cl"&gt;tar xvf prometheus-2.51.0.linux-amd64.tar.gz&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;4&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;cd&lt;/span&gt; prometheus-2.51.0.linux-amd64&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h4 id="12-配置监控目标"&gt;&lt;strong&gt;1.2 配置监控目标&lt;/strong&gt;&lt;/h4&gt;&#10;&lt;p&gt;编辑 &lt;code&gt;prometheus.yml&lt;/code&gt;：&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-yaml" data-lang="yaml"&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 1&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;global&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 2&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;scrape\_interval&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;15s&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 3&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;evaluation\_interval&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;15s&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 4&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 5&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;scrape\_configs&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 6&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;\- job\_name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;prometheus&amp;#34;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;\# 监控自身&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 7&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;static\_configs&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 8&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;\- targets&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;\[&amp;#34;localhost:9090&amp;#34;\]&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 9&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;\- job\_name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;node&amp;#34;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;\# 监控服务器&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;10&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;static\_configs&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;11&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;\- targets&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;\[&amp;#34;&amp;lt;NODE\_IP&amp;gt;:9100&amp;#34;\] \# 替换为Node Exporter的IP&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h4 id="13-启动-prometheus"&gt;&lt;strong&gt;1.3 启动 Prometheus&lt;/strong&gt;&lt;/h4&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;1&lt;/span&gt;&lt;span class="cl"&gt;./prometheus &lt;span class="se"&gt;\-&lt;/span&gt;-config.file&lt;span class="se"&gt;\=&lt;/span&gt;prometheus.yml&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;访问 &lt;code&gt;http://&amp;lt;PROMETHEUS_IP&amp;gt;:9090&lt;/code&gt; 验证。&lt;/p&gt;</description></item><item><title>Jenkins 使用</title><link>https://www.leanku.com/post/devops/jenkins-%E4%BD%BF%E7%94%A8/</link><pubDate>Fri, 09 May 2025 20:46:01 +0800</pubDate><guid>https://www.leanku.com/post/devops/jenkins-%E4%BD%BF%E7%94%A8/</guid><description>&lt;h1 id="jenkins-使用"&gt;Jenkins 使用&lt;/h1&gt;&#10;&lt;h2 id="1-安装jenkins"&gt;1. &lt;a href="https://www.jenkins.io/doc/book/installing/linux/"&gt;安装Jenkins&lt;/a&gt;&lt;/h2&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;1&lt;/span&gt;&lt;span class="cl"&gt;sudo wget -O /etc/yum.repos.d/jenkins.repo &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;2&lt;/span&gt;&lt;span class="cl"&gt; https://pkg.jenkins.io/redhat/jenkins.repo&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;3&lt;/span&gt;&lt;span class="cl"&gt;sudo rpm --import https://pkg.jenkins.io/redhat/jenkins.io-2023.key&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;4&lt;/span&gt;&lt;span class="cl"&gt;sudo yum upgrade&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;5&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Add required dependencies for the jenkins package&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;6&lt;/span&gt;&lt;span class="cl"&gt;sudo yum install fontconfig java-21-openjdk&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;7&lt;/span&gt;&lt;span class="cl"&gt;sudo yum install jenkins&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="2-启动-jenkins"&gt;2. 启动 Jenkins&lt;/h2&gt;&#10;&lt;pre tabindex="0"&gt;&lt;code&gt;sudo systemctl enable jenkins&#10;sudo systemctl start jenkins&#10;# 检查状态&#10;sudo systemctl status jenkins&#10;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;正常输出应显示 active (running)。&lt;/p&gt;&#10;&lt;h3 id="开放防火墙如需"&gt;开放防火墙（如需）&lt;/h3&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;1&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 开放 8080 端口（Jenkins 默认端口）&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;2&lt;/span&gt;&lt;span class="cl"&gt;sudo firewall-cmd --permanent --add-port&lt;span class="o"&gt;=&lt;/span&gt;8080/tcp&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;3&lt;/span&gt;&lt;span class="cl"&gt;sudo firewall-cmd --reload&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="3-配置jenkins"&gt;3. 配置Jenkins&lt;/h2&gt;&#10;&lt;h3 id="31-访问-jenkins-并完成初始化"&gt;3.1 访问 Jenkins 并完成初始化&lt;/h3&gt;&#10;&lt;ol&gt;&#10;&lt;li&gt;在浏览器访问：http://&amp;lt;服务器IP&amp;gt;:8080&lt;/li&gt;&#10;&lt;li&gt;获取初始管理员密码：&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;1&lt;/span&gt;&lt;span class="cl"&gt;sudo cat /var/lib/jenkins/secrets/initialAdminPassword&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;复制输出的密码粘贴到网页。&lt;/li&gt;&#10;&lt;li&gt;安装推荐插件：选择默认插件集（包括Git、Pipeline等常用工具）。&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;h3 id="32-基础配置中文支持优化"&gt;3.2 基础配置（中文支持+优化）&lt;/h3&gt;&#10;&lt;ol&gt;&#10;&lt;li&gt;切换为中文界面&#10;&lt;ol&gt;&#10;&lt;li&gt;进入 Manage Jenkins &amp;gt; Plugins&amp;gt;Available plugins，搜索 Locale 安装 &amp;ldquo;Localization: Chinese (Simplified)&amp;rdquo; 插件。&lt;/li&gt;&#10;&lt;li&gt;进入Manage Jenkins &amp;gt; Appearance， 默认语言设置为 zh_CN，勾选 &amp;ldquo;Ignore browser preference&amp;rdquo;。&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;配置全局工具（如Git、Maven）&#10;&lt;ol&gt;&#10;&lt;li&gt;进入 Manage Jenkins &amp;gt; Global Tool Configuration：&#10;&lt;ul&gt;&#10;&lt;li&gt;Git：指定路径（默认 /usr/bin/git，或通过 which git 检查）。&lt;/li&gt;&#10;&lt;li&gt;Maven：自动安装或指定现有路径。&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;创建管理员账户：设置用户名、密码和邮箱（避免继续使用初始密码）。&#10;&lt;ol&gt;&#10;&lt;li&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;Manage Jenkins（管理 Jenkins） &amp;gt; Security &amp;gt; User &amp;gt; Create User&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;Manage Jenkins &amp;gt; Security 在 Authorization（授权策略） 部分选择 Matrix-based security（矩阵权限） 或 Role-Based Strategy（基于角色的权限） 需要安装授权策略插件&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;h3 id="33-创建第一个任务示例执行shell命令"&gt;3.3 创建第一个任务（示例：执行Shell命令）&lt;/h3&gt;&#10;&lt;ol&gt;&#10;&lt;li&gt;点击 新建任务 &amp;gt; 输入任务名（如 test-job）&amp;gt; 选择 Freestyle project。&lt;/li&gt;&#10;&lt;li&gt;在 构建 部分添加构建步骤：&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;1&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;Hello, Jenkins!&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;2&lt;/span&gt;&lt;span class="cl"&gt;date&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;&#10;&lt;li&gt;点击 保存 &amp;gt; 立即构建，在 控制台输出 中查看结果。&lt;/li&gt;&#10;&lt;/ol&gt;</description></item><item><title>Kubernetes学习指北</title><link>https://www.leanku.com/post/devops/kubernetes%E5%AD%A6%E4%B9%A0%E6%8C%87%E5%8C%97/</link><pubDate>Thu, 01 May 2025 11:46:01 +0800</pubDate><guid>https://www.leanku.com/post/devops/kubernetes%E5%AD%A6%E4%B9%A0%E6%8C%87%E5%8C%97/</guid><description>&lt;h1 id="kubernetes学习指北"&gt;Kubernetes学习指北&lt;/h1&gt;&#10;&lt;h2 id="一-大纲"&gt;一、 大纲&lt;/h2&gt;&#10;&lt;h3 id="1-了解基础概念"&gt;1. 了解基础概念&lt;/h3&gt;&#10;&lt;table&gt;&#10;&#9;&lt;thead&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th style="text-align: left"&gt;概念&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th style="text-align: left"&gt;说明&lt;/th&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/thead&gt;&#10;&#9;&lt;tbody&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;Pod&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;最小的调度单位，一个 Pod 可以包含一个或多个容器&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;Node&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;Kubernetes 集群的工作节点&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;Deployment&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;管理 Pod 的副本和升级策略&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;Service&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;用于 Pod 间通信和对外暴露&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;ConfigMap / Secret&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;配置和敏感信息管理&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;Volume&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;数据卷，用于持久化数据&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;Namespace&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;命名空间，多租户环境的逻辑隔离&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;Ingress&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;对外 HTTP/HTTPS 流量管理&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;kube-apiserver、kube-scheduler、kube-controller-manager&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;Master 组件，负责调度、管理集群&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/tbody&gt;&#10;&lt;/table&gt;&#10;&lt;h3 id="2-核心组件及职责-必须的核心组件"&gt;2. 核心组件及职责 （必须的核心组件）&lt;/h3&gt;&#10;&lt;ol&gt;&#10;&lt;li&gt;&lt;strong&gt;kube-apiserver&lt;/strong&gt; （API 服务器）&#10;&lt;ul&gt;&#10;&lt;li&gt;作用：&#10;&lt;ul&gt;&#10;&lt;li&gt;集群的 大脑入口&lt;/li&gt;&#10;&lt;li&gt;负责 接收请求（kubectl、Dashboard、其他服务），然后转给 etcd 或控制器&lt;/li&gt;&#10;&lt;li&gt;所有组件（scheduler、controller、kubelet）都通过它通信。&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;像是办事大厅，所有人（开发、运维、调度器）都必须来这里递交申请。&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;kube-scheduler&lt;/strong&gt; （调度器）&#10;* 作用：&#10;&lt;ul&gt;&#10;&lt;li&gt;负责 给 Pod 找宿主机。&lt;/li&gt;&#10;&lt;li&gt;根据 资源情况（CPU、内存）、约束（亲和性、污点）、策略 来决定 Pod 放在哪个 Node 上。&#10;* 像是一个 派单员，根据司机（Node）的空闲情况，把订单（Pod）分配给合适的人。&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;kube-controller-manager&lt;/strong&gt; （控制器管理器）&#10;* 作用：&#10;&lt;ul&gt;&#10;&lt;li&gt;内部包含很多 控制器（controller），比如：&#10;&lt;ul&gt;&#10;&lt;li&gt;Deployment Controller：保证副本数量正确&lt;/li&gt;&#10;&lt;li&gt;Node Controller：监控节点状态。&lt;/li&gt;&#10;&lt;li&gt;Endpoint Controller：维护 Service → Pod 的映射。&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;核心任务是：对比实际状态和期望状态，不断修正。&#10;* 像是一个 巡检员，不停检查「理想状态」和「现实情况」是不是一致，如果发现差错，就赶紧修正。&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;kubelet&lt;/strong&gt; （节点代理）&#10;&lt;ul&gt;&#10;&lt;li&gt;作用：&#10;&lt;ul&gt;&#10;&lt;li&gt;跑在每个 Node 上的 代理。&lt;/li&gt;&#10;&lt;li&gt;负责和 kube-apiserver 交互，接收“要运行哪些 Pod”。&lt;/li&gt;&#10;&lt;li&gt;调用底层 容器运行时（containerd、CRI-O、Docker） 来真正启动容器。&lt;/li&gt;&#10;&lt;li&gt;还会 汇报 Pod 和 Node 的运行状态。&#10;* 像是 工地上的施工队长，接到上级（apiserver）的命令，就去调度工人（containerd）建房子（Pod）。&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;etcd&lt;/strong&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;作用：&#10;&lt;ul&gt;&#10;&lt;li&gt;分布式键值存储，保存集群的所有状态（Pod、Service、配置等）&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;pre&gt;&lt;code&gt; * 像是 工地上的施工队长，接到上级（apiserver）的命令，就去调度工人（containerd）建房子（Pod）&#10;&lt;/code&gt;&lt;/pre&gt;&#10;&lt;ol start="6"&gt;&#10;&lt;li&gt;&lt;strong&gt;容器运行时（Container Runtime，如 containerd、CRI-O、DockerShim）&lt;/strong&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;作用：&#10;&lt;ul&gt;&#10;&lt;li&gt;kubelet 本身不会直接运行容器，它要依赖运行时。&lt;/li&gt;&#10;&lt;li&gt;真正负责创建和运行容器的底层引擎。&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;常见的有&#10;&lt;ul&gt;&#10;&lt;li&gt;containerd（最主流，K8s 默认推荐）&lt;/li&gt;&#10;&lt;li&gt;CRI-O（轻量化，专门为 K8s 服务）&lt;/li&gt;&#10;&lt;li&gt;Docker（以前常用，但现在 K8s 不直接依赖它了，而是通过 containerd）&#10;* 比喻：工人，真正搬砖盖房子（运行容器）。&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;h3 id="3-网络插件通常必须"&gt;3. 网络插件（通常必须）&lt;/h3&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;Flannel / Calico / Cilium / Weave 等&lt;/li&gt;&#10;&lt;li&gt;作用：&#10;&lt;ul&gt;&#10;&lt;li&gt;Kubernetes 默认不带跨节点网络，需要 CNI 插件：&lt;/li&gt;&#10;&lt;li&gt;提供 Pod 跨节点通信的网络能力。&lt;/li&gt;&#10;&lt;li&gt;在多节点集群中 必须（单节点集群不一定需要）&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h3 id="4-常用工具"&gt;4. 常用工具&lt;/h3&gt;&#10;&lt;ol&gt;&#10;&lt;li&gt;kubectl&#10;&lt;ul&gt;&#10;&lt;li&gt;集群客户端工具，用于执行命令、部署应用。&lt;/li&gt;&#10;&lt;li&gt;从严格意义上来说 不是集群必须，但管理集群时必不可少。&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;kubeadm&#10;&lt;ul&gt;&#10;&lt;li&gt;安装和初始化 Kubernetes 的工具。&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;kubeadm init&lt;/strong&gt; 的时候会用静态 Pod 的方式自动在 control-plane 节点上拉取(apiserver、scheduler、controller-manager、etcd)这些镜像并启动&lt;/li&gt;&#10;&lt;li&gt;不是必须，也可以手动部署 K8s（kubeadm 只是简化安装）。&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;h3 id="5-环境搭建"&gt;5. 环境搭建&lt;/h3&gt;&#10;&lt;ol&gt;&#10;&lt;li&gt;方案 A：单机多节点学习（推荐）&lt;a href="./Kubernetes%E5%AD%A6%E4%B9%A0%E6%8C%87%E5%8C%97%E4%B9%8B%E5%8D%95%E8%8A%82%E7%82%B9%E9%9B%86%E7%BE%A4%EF%BC%88Master%EF%BC%89.md"&gt;Kubernetes学习指北之单节点集群&lt;/a&gt;&lt;/li&gt;&#10;&lt;li&gt;方案 B：一键单机集群（开发学习） &lt;a href="./Kubernetes%E5%AD%A6%E4%B9%A0%E6%8C%87%E5%8C%97%E4%B9%8B%E5%A4%9A%E8%8A%82%E7%82%B9%E9%9B%86%E7%BE%A4%EF%BC%88Multi%20Node%20Cluster%EF%BC%89.md"&gt;Kubernetes学习指北之单节点集群&lt;/a&gt;&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;h3 id="6-学习操作命令"&gt;6. 学习操作命令&lt;/h3&gt;&#10;&lt;ol&gt;&#10;&lt;li&gt;安装 kubectl&lt;/li&gt;&#10;&lt;li&gt;常用命令：&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;1&lt;/span&gt;&lt;span class="cl"&gt;kubectl get nodes &lt;span class="c1"&gt;# 查看节点&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;2&lt;/span&gt;&lt;span class="cl"&gt;kubectl get pods &lt;span class="c1"&gt;# 查看 Pod&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;3&lt;/span&gt;&lt;span class="cl"&gt;kubectl get svc &lt;span class="c1"&gt;# 查看服务&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;4&lt;/span&gt;&lt;span class="cl"&gt;kubectl describe pod POD &lt;span class="c1"&gt;# 查看 Pod 详情&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;5&lt;/span&gt;&lt;span class="cl"&gt;kubectl logs POD &lt;span class="c1"&gt;# 查看容器日志&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;6&lt;/span&gt;&lt;span class="cl"&gt;kubectl apply -f file.yaml &lt;span class="c1"&gt;# 创建资源&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;7&lt;/span&gt;&lt;span class="cl"&gt;kubectl delete -f file.yaml &lt;span class="c1"&gt;# 删除资源&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;h3 id="7-部署简单应用"&gt;7. 部署简单应用&lt;/h3&gt;&#10;&lt;h3 id="8-进阶"&gt;8. 进阶&lt;/h3&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;&lt;strong&gt;ConfigMap / Secret / Volume&lt;/strong&gt;：学习如何管理配置和数据&lt;/p&gt;</description></item><item><title>Kubernetes学习指北之Kubernetes kubectl</title><link>https://www.leanku.com/post/devops/kubernetes%E5%AD%A6%E4%B9%A0%E6%8C%87%E5%8C%97%E4%B9%8Bkubernetes-kubectl/</link><pubDate>Thu, 01 May 2025 11:46:01 +0800</pubDate><guid>https://www.leanku.com/post/devops/kubernetes%E5%AD%A6%E4%B9%A0%E6%8C%87%E5%8C%97%E4%B9%8Bkubernetes-kubectl/</guid><description>&lt;h1 id="kubernetes学习指北之kubernetes-kubectl"&gt;Kubernetes学习指北之Kubernetes kubectl&lt;/h1&gt;&#10;&lt;h2 id="一-kubectl-介绍"&gt;一、 kubectl 介绍&lt;/h2&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;&lt;code&gt;kubectl&lt;/code&gt; 是 Kubernetes 官方提供的命令行工具，用于与 Kubernetes 集群交互。&lt;/p&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;它可以管理资源对象（Pods、Deployments、Services 等）、调试问题、查看日志、扩缩容、发布更新等。&lt;/p&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;本质上，它通过 Kubernetes API 与集群通信。&lt;/p&gt;&#10;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;组件关系示意：&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-rust" data-lang="rust"&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;1&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;kubectl&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;&amp;lt;--&lt;/span&gt;-&amp;gt; &lt;span class="nc"&gt;kube&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;apiserver&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;&amp;lt;--&lt;/span&gt;-&amp;gt; &lt;span class="nc"&gt;etcd&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;kubelet&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;controller&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;manager&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;scheduler&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="二安装与配置"&gt;二、安装与配置&lt;/h2&gt;&#10;&lt;h3 id="1-安装linux"&gt;1. 安装（Linux）：&lt;/h3&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;1&lt;/span&gt;&lt;span class="cl"&gt;curl -LO &lt;span class="s2"&gt;&amp;#34;https://dl.k8s.io/release/&lt;/span&gt;&lt;span class="k"&gt;$(&lt;/span&gt;curl -L -s https://dl.k8s.io/release/stable.txt&lt;span class="k"&gt;)&lt;/span&gt;&lt;span class="s2"&gt;/bin/linux/amd64/kubectl&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;2&lt;/span&gt;&lt;span class="cl"&gt;chmod +x kubectl&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;3&lt;/span&gt;&lt;span class="cl"&gt;sudo mv kubectl /usr/local/bin/&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;4&lt;/span&gt;&lt;span class="cl"&gt;kubectl version --client&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="2-配置-kubeconfig"&gt;2. 配置 kubeconfig&lt;/h3&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;默认路径：~/.kube/config&lt;/li&gt;&#10;&lt;li&gt;查看当前配置：&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;1&lt;/span&gt;&lt;span class="cl"&gt;kubectl config view&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;2&lt;/span&gt;&lt;span class="cl"&gt;kubectl config current-context&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;&#10;&lt;li&gt;切换 namespace：&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;1&lt;/span&gt;&lt;span class="cl"&gt;kubectl config set-context --current --namespace&lt;span class="o"&gt;=&lt;/span&gt;demo&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="三基础命令"&gt;三、基础命令&lt;/h2&gt;&#10;&lt;h3 id="1-查看集群信息"&gt;1. 查看集群信息&lt;/h3&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;1&lt;/span&gt;&lt;span class="cl"&gt;kubectl cluster-info &lt;span class="c1"&gt;# 控制面信息&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;2&lt;/span&gt;&lt;span class="cl"&gt;kubectl version &lt;span class="c1"&gt;# 客户端 &amp;amp; 服务端版本&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;3&lt;/span&gt;&lt;span class="cl"&gt;kubectl api-resources &lt;span class="c1"&gt;# 列出可用资源&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;4&lt;/span&gt;&lt;span class="cl"&gt;kubectl get namespaces &lt;span class="c1"&gt;# 查看命名空间&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="2-查看节点"&gt;2. 查看节点&lt;/h3&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;1&lt;/span&gt;&lt;span class="cl"&gt;kubectl get nodes&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;2&lt;/span&gt;&lt;span class="cl"&gt;kubectl describe node &amp;lt;node-name&amp;gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="四命名空间管理"&gt;四、命名空间管理&lt;/h2&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;1&lt;/span&gt;&lt;span class="cl"&gt;kubectl create namespace demo&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;2&lt;/span&gt;&lt;span class="cl"&gt;kubectl get namespaces&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;3&lt;/span&gt;&lt;span class="cl"&gt;kubectl delete namespace demo&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;&#10;&lt;li&gt;使用 -n &lt;namespace&gt; 指定命名空间：&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;1&lt;/span&gt;&lt;span class="cl"&gt;kubectl get pods -n demo&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;2&lt;/span&gt;&lt;span class="cl"&gt;kubectl apply -f deployment.yaml -n demo&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;&#10;&lt;li&gt;设置默认 namespace：&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;1&lt;/span&gt;&lt;span class="cl"&gt;kubectl config set-context --current --namespace&lt;span class="o"&gt;=&lt;/span&gt;demo&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="五podsdeploymentservice-管理"&gt;五、Pods、Deployment、Service 管理&lt;/h2&gt;&#10;&lt;h3 id="1-查看资源"&gt;1. 查看资源&lt;/h3&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;1&lt;/span&gt;&lt;span class="cl"&gt;kubectl get pods&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;2&lt;/span&gt;&lt;span class="cl"&gt;kubectl get deployments&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;3&lt;/span&gt;&lt;span class="cl"&gt;kubectl get svc&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;4&lt;/span&gt;&lt;span class="cl"&gt;kubectl get all&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;5&lt;/span&gt;&lt;span class="cl"&gt;kubectl describe pod &amp;lt;pod-name&amp;gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="2-创建--更新--删除"&gt;2. 创建 / 更新 / 删除&lt;/h3&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;1&lt;/span&gt;&lt;span class="cl"&gt;kubectl apply -f &amp;lt;file.yaml&amp;gt; &lt;span class="c1"&gt;# 创建或更新&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;2&lt;/span&gt;&lt;span class="cl"&gt;kubectl delete -f &amp;lt;file.yaml&amp;gt; &lt;span class="c1"&gt;# 删除&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="3pod-调试"&gt;3.Pod 调试&lt;/h3&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;1&lt;/span&gt;&lt;span class="cl"&gt;kubectl logs &amp;lt;pod-name&amp;gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;2&lt;/span&gt;&lt;span class="cl"&gt;kubectl &lt;span class="nb"&gt;exec&lt;/span&gt; -it &amp;lt;pod-name&amp;gt; -- /bin/bash&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;3&lt;/span&gt;&lt;span class="cl"&gt;kubectl port-forward &amp;lt;pod-name&amp;gt; 8080:80&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="4-deployment-滚动更新与回滚"&gt;4. Deployment 滚动更新与回滚&lt;/h3&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;1&lt;/span&gt;&lt;span class="cl"&gt;kubectl rollout status deployment/&amp;lt;name&amp;gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;2&lt;/span&gt;&lt;span class="cl"&gt;kubectl rollout &lt;span class="nb"&gt;history&lt;/span&gt; deployment/&amp;lt;name&amp;gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;3&lt;/span&gt;&lt;span class="cl"&gt;kubectl rollout undo deployment/&amp;lt;name&amp;gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;4&lt;/span&gt;&lt;span class="cl"&gt;kubectl scale deployment/&amp;lt;name&amp;gt; --replicas&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;3&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="六configmap-和-secret"&gt;六、ConfigMap 和 Secret&lt;/h2&gt;&#10;&lt;h3 id="1-configmap"&gt;1. ConfigMap&lt;/h3&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;1&lt;/span&gt;&lt;span class="cl"&gt;kubectl create configmap my-config --from-literal&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;key&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;value&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;2&lt;/span&gt;&lt;span class="cl"&gt;kubectl apply -f configmap.yaml&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;3&lt;/span&gt;&lt;span class="cl"&gt;kubectl get configmap&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;4&lt;/span&gt;&lt;span class="cl"&gt;kubectl describe configmap my-config&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="2-secret"&gt;2. Secret&lt;/h3&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;1&lt;/span&gt;&lt;span class="cl"&gt;kubectl create secret generic my-secret &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;2&lt;/span&gt;&lt;span class="cl"&gt; --from-literal&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;username&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;admin &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;3&lt;/span&gt;&lt;span class="cl"&gt; --from-literal&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;password&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;123456&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;4&lt;/span&gt;&lt;span class="cl"&gt;kubectl get secret&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;5&lt;/span&gt;&lt;span class="cl"&gt;kubectl describe secret my-secret&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;&#10;&lt;li&gt;Secret 可以在 Pod 中挂载为环境变量或文件：&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;1&lt;/span&gt;&lt;span class="cl"&gt;env:&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;2&lt;/span&gt;&lt;span class="cl"&gt;- name: DB_USER&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;3&lt;/span&gt;&lt;span class="cl"&gt; valueFrom:&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;4&lt;/span&gt;&lt;span class="cl"&gt; secretKeyRef:&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;5&lt;/span&gt;&lt;span class="cl"&gt; name: my-secret&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;6&lt;/span&gt;&lt;span class="cl"&gt; key: username&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="七daemonset-与-statefulset"&gt;七、DaemonSet 与 StatefulSet&lt;/h2&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;1&lt;/span&gt;&lt;span class="cl"&gt;kubectl get daemonset -n kube-system&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;2&lt;/span&gt;&lt;span class="cl"&gt;kubectl describe daemonset &amp;lt;name&amp;gt; -n &amp;lt;namespace&amp;gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;3&lt;/span&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;4&lt;/span&gt;&lt;span class="cl"&gt;kubectl get statefulset&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;5&lt;/span&gt;&lt;span class="cl"&gt;kubectl describe statefulset &amp;lt;name&amp;gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="八标签和选择器"&gt;八、标签和选择器&lt;/h2&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;查看标签：&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;1&lt;/span&gt;&lt;span class="cl"&gt;kubectl get pods --show-labels&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;&#10;&lt;li&gt;按标签选择：&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;1&lt;/span&gt;&lt;span class="cl"&gt;kubectl get pods -l &lt;span class="nv"&gt;app&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;nginx&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;2&lt;/span&gt;&lt;span class="cl"&gt;kubectl label pod &amp;lt;pod-name&amp;gt; &lt;span class="nv"&gt;env&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;dev&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;3&lt;/span&gt;&lt;span class="cl"&gt;kubectl annotate pod &amp;lt;pod-name&amp;gt; &lt;span class="nv"&gt;key&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;value&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="九资源调试与事件"&gt;九、资源调试与事件&lt;/h2&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;1&lt;/span&gt;&lt;span class="cl"&gt;kubectl get events&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;2&lt;/span&gt;&lt;span class="cl"&gt;kubectl describe pod &amp;lt;pod-name&amp;gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;3&lt;/span&gt;&lt;span class="cl"&gt;kubectl top node&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;4&lt;/span&gt;&lt;span class="cl"&gt;kubectl top pod&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="十批量与导出操作"&gt;十、批量与导出操作&lt;/h2&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;批量操作：&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;1&lt;/span&gt;&lt;span class="cl"&gt;kubectl apply -f ./manifests&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;2&lt;/span&gt;&lt;span class="cl"&gt;kubectl delete -f ./manifests&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;&#10;&lt;li&gt;导出资源：&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;1&lt;/span&gt;&lt;span class="cl"&gt;kubectl get deployment &amp;lt;name&amp;gt; -o yaml &amp;gt; deployment.yaml&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;2&lt;/span&gt;&lt;span class="cl"&gt;kubectl get all -n demo -o yaml &amp;gt; demo-all.yaml&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="十一其他操作"&gt;十一、其他操作&lt;/h2&gt;&#10;&lt;h3 id="端口转发"&gt;端口转发&lt;/h3&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;1&lt;/span&gt;&lt;span class="cl"&gt;kubectl port-forward deployment/nginx 8080:80&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="访问-pod-内部网络"&gt;访问 Pod 内部网络&lt;/h3&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;1&lt;/span&gt;&lt;span class="cl"&gt;kubectl &lt;span class="nb"&gt;exec&lt;/span&gt; -it &amp;lt;pod-name&amp;gt; -- ping &amp;lt;service-name&amp;gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;2&lt;/span&gt;&lt;span class="cl"&gt;kubectl &lt;span class="nb"&gt;exec&lt;/span&gt; -it &amp;lt;pod-name&amp;gt; -- curl http://&amp;lt;service-name&amp;gt;:&amp;lt;port&amp;gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="debug-pod"&gt;Debug Pod&lt;/h3&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;1&lt;/span&gt;&lt;span class="cl"&gt;kubectl describe pod &amp;lt;pod-name&amp;gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;2&lt;/span&gt;&lt;span class="cl"&gt;kubectl logs &amp;lt;pod-name&amp;gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;3&lt;/span&gt;&lt;span class="cl"&gt;kubectl &lt;span class="nb"&gt;exec&lt;/span&gt; -it &amp;lt;pod-name&amp;gt; -- bash&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="十二-步骤总结"&gt;十二、 步骤总结&lt;/h2&gt;&#10;&lt;p&gt;比如现在有laravel/k8s/文件结构：&lt;/p&gt;</description></item><item><title>Kubernetes学习指北之Kubernetes YAML</title><link>https://www.leanku.com/post/devops/kubernetes%E5%AD%A6%E4%B9%A0%E6%8C%87%E5%8C%97%E4%B9%8Bkubernetes-yaml/</link><pubDate>Thu, 01 May 2025 11:46:01 +0800</pubDate><guid>https://www.leanku.com/post/devops/kubernetes%E5%AD%A6%E4%B9%A0%E6%8C%87%E5%8C%97%E4%B9%8Bkubernetes-yaml/</guid><description>&lt;h1 id="kubernetes学习指北之kubernetes-yaml"&gt;Kubernetes学习指北之Kubernetes YAML&lt;/h1&gt;&#10;&lt;h2 id="一-kubernetes-yaml-的基本结构"&gt;一、 Kubernetes YAML 的基本结构&lt;/h2&gt;&#10;&lt;p&gt;Kubernetes 资源对象通常是 YAML 文件。每个 YAML 对象至少包含三个字段：&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-yml" data-lang="yml"&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;1&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;apiVersion&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;v1 &lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c"&gt;# API 版本，不同资源使用的版本不同&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;2&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;kind&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;Pod &lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c"&gt;# 资源类型，如 Pod、Deployment、Service、Secret、ConfigMap&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;3&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;metadata&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c"&gt;# 元数据&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;4&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;my-pod&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;5&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;namespace&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;default&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;6&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;spec&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c"&gt;# 具体配置&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;7&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;containers&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;8&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="nt"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;nginx&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;9&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;image&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;nginx:1.25&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="二常用字段详解"&gt;二、常用字段详解&lt;/h2&gt;&#10;&lt;h3 id="1-apiversion"&gt;1. apiVersion&lt;/h3&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;指定资源的 API 版本。&#10;&lt;ul&gt;&#10;&lt;li&gt;常见值：&#10;&lt;ul&gt;&#10;&lt;li&gt;v1：Pod、Service、ConfigMap、Secret&lt;/li&gt;&#10;&lt;li&gt;apps/v1：Deployment、StatefulSet、DaemonSet&lt;/li&gt;&#10;&lt;li&gt;batch/v1：Job、CronJob&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h3 id="2-kind"&gt;2. kind&lt;/h3&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;资源类型&#10;&lt;ul&gt;&#10;&lt;li&gt;常见类型：&#10;&lt;ul&gt;&#10;&lt;li&gt;Pod：最小的调度单位&lt;/li&gt;&#10;&lt;li&gt;Deployment：Pod 的管理控制器，可以做副本管理和滚动升级&lt;/li&gt;&#10;&lt;li&gt;Service：服务发现与负载均衡&lt;/li&gt;&#10;&lt;li&gt;ConfigMap / Secret：配置或敏感信息管理&lt;/li&gt;&#10;&lt;li&gt;Namespace：隔离资源的逻辑空间&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h3 id="3-metadata"&gt;3. metadata&lt;/h3&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;资源的名字、标签、注解等。&lt;/li&gt;&#10;&lt;li&gt;常见字段：&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-yml" data-lang="yml"&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;1&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;metadata&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;2&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;my-app&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;3&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;namespace&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;default&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;4&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;labels&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;5&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;app&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;my-app&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;6&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;annotations&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;7&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;description&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;Demo app&amp;#34;&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h3 id="4-spec"&gt;4. spec&lt;/h3&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;资源的核心配置&lt;/li&gt;&#10;&lt;li&gt;不同 kind 的 spec 完全不同，Pod、Deployment、Service 的 spec 都不一样。&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h2 id="三-pod-示例"&gt;三、 Pod 示例&lt;/h2&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-yml" data-lang="yml"&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 1&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;apiVersion&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;v1&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 2&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;kind&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;Pod&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 3&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;metadata&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 4&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;nginx-pod&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 5&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;spec&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 6&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;containers&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 7&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="nt"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;nginx&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 8&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;image&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;nginx:1.25&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 9&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;ports&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;10&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="nt"&gt;containerPort&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;80&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;解释：&lt;/p&gt;</description></item><item><title>Kubernetes学习指北之单节点集群（Master）</title><link>https://www.leanku.com/post/devops/kubernetes%E5%AD%A6%E4%B9%A0%E6%8C%87%E5%8C%97%E4%B9%8B%E5%8D%95%E8%8A%82%E7%82%B9%E9%9B%86%E7%BE%A4master/</link><pubDate>Thu, 01 May 2025 11:46:01 +0800</pubDate><guid>https://www.leanku.com/post/devops/kubernetes%E5%AD%A6%E4%B9%A0%E6%8C%87%E5%8C%97%E4%B9%8B%E5%8D%95%E8%8A%82%E7%82%B9%E9%9B%86%E7%BE%A4master/</guid><description>&lt;h1 id="kubernetes学习指北之单节点集群master"&gt;Kubernetes学习指北之单节点集群（Master）&lt;/h1&gt;&#10;&lt;h2 id="一-单节点集群single-node-cluster说明"&gt;一、 单节点集群（Single Node Cluster）说明&lt;/h2&gt;&#10;&lt;p&gt;学习和开发利器，操作简单&lt;/p&gt;&#10;&lt;h3 id="特点"&gt;特点&lt;/h3&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;Master 节点和 Worker 节点在同一台机器上&#10;&lt;ul&gt;&#10;&lt;li&gt;kube-apiserver、kube-scheduler、kube-controller-manager、kubelet 都在同一台机器&lt;/li&gt;&#10;&lt;li&gt;Pod 也在同一台机器上运行&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;资源有限：所有容器共享同一台机器的 CPU、内存和存储&lt;/li&gt;&#10;&lt;li&gt;高可用性低：Master 节点宕机，整个集群不可用&lt;/li&gt;&#10;&lt;li&gt;网络简单：只需一个节点，Pod 网络配置相对简单&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h3 id="适用场景"&gt;适用场景&lt;/h3&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;学习和测试 Kubernetes 核心概念&lt;/li&gt;&#10;&lt;li&gt;开发环境部署微服务&lt;/li&gt;&#10;&lt;li&gt;练习 kubectl 命令、Deployment、Service 等&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h3 id="优点"&gt;优点&lt;/h3&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;配置简单，一条命令就能搭建&lt;/p&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;资源占用低，不需要多台虚拟机&lt;/p&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;部署快速，便于练手&lt;/p&gt;&#10;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h3 id="缺点"&gt;缺点&lt;/h3&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;不适合生产环境&lt;/p&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;没有高可用性&lt;/p&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;无法模拟真实多节点调度&lt;/p&gt;&#10;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h2 id="二-准备环境和工具"&gt;二、 准备环境和工具&lt;/h2&gt;&#10;&lt;ol&gt;&#10;&lt;li&gt;这里我使用的CentOS7&lt;/li&gt;&#10;&lt;li&gt;做一些初始化&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 1&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 切换 root&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 2&lt;/span&gt;&lt;span class="cl"&gt;sudo -i&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 3&lt;/span&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 4&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 关闭防火墙（实验环境）&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 5&lt;/span&gt;&lt;span class="cl"&gt;systemctl stop firewalld&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 6&lt;/span&gt;&lt;span class="cl"&gt;systemctl disable firewalld&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 7&lt;/span&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 8&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 关闭 selinux&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 9&lt;/span&gt;&lt;span class="cl"&gt;setenforce &lt;span class="m"&gt;0&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;10&lt;/span&gt;&lt;span class="cl"&gt;sed -i &lt;span class="s1"&gt;&amp;#39;s/^SELINUX=enforcing$/SELINUX=disabled/&amp;#39;&lt;/span&gt; /etc/selinux/config&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;11&lt;/span&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;12&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 关闭 swap&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;13&lt;/span&gt;&lt;span class="cl"&gt;swapoff -a&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;14&lt;/span&gt;&lt;span class="cl"&gt;sed -i &lt;span class="s1"&gt;&amp;#39;/swap/d&amp;#39;&lt;/span&gt; /etc/fstab&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;15&lt;/span&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;16&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 调整内核参数（K8s 网络需要）&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;17&lt;/span&gt;&lt;span class="cl"&gt;cat &lt;span class="s"&gt;&amp;lt;&amp;lt;EOF &amp;gt; /etc/sysctl.d/k8s.conf&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;18&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;net.bridge.bridge-nf-call-ip6tables = 1&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;19&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;net.bridge.bridge-nf-call-iptables = 1&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;20&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;EOF&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;21&lt;/span&gt;&lt;span class="cl"&gt;sysctl --system&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;h3 id="三--安装-docker-或-containerd"&gt;三 、 安装 Docker 或 Containerd&lt;/h3&gt;&#10;&lt;p&gt;Kubernetes 需要一个容器运行时，这里推荐 containerd（更接近 K8s 原生）。&lt;/p&gt;</description></item><item><title>Kubernetes学习指北之多节点集群（Multi Node Cluster）</title><link>https://www.leanku.com/post/devops/kubernetes%E5%AD%A6%E4%B9%A0%E6%8C%87%E5%8C%97%E4%B9%8B%E5%A4%9A%E8%8A%82%E7%82%B9%E9%9B%86%E7%BE%A4multi-node-cluster/</link><pubDate>Thu, 01 May 2025 11:46:01 +0800</pubDate><guid>https://www.leanku.com/post/devops/kubernetes%E5%AD%A6%E4%B9%A0%E6%8C%87%E5%8C%97%E4%B9%8B%E5%A4%9A%E8%8A%82%E7%82%B9%E9%9B%86%E7%BE%A4multi-node-cluster/</guid><description>&lt;h1 id="kubernetes学习指北之多节点集群multi-node-cluster"&gt;Kubernetes学习指北之多节点集群（Multi Node Cluster）&lt;/h1&gt;&#10;&lt;h2 id="一-多节点集群multi-node-cluster说明"&gt;一、 多节点集群（Multi Node Cluster）说明&lt;/h2&gt;&#10;&lt;p&gt;真实生产环境的缩影，可以模拟调度、高可用、跨节点通信&lt;/p&gt;&#10;&lt;h3 id="特点"&gt;特点&lt;/h3&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;&lt;strong&gt;Master 节点负责管理集群&lt;/strong&gt;&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;多个 Worker 节点运行实际应用 Pod&lt;/p&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;Master 负责调度、管理和监控&lt;/p&gt;&#10;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;&lt;strong&gt;高可用性可扩展&lt;/strong&gt;&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;可以增加 Worker 节点提升容量&lt;/p&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;Master 可做 HA（高可用）部署&lt;/p&gt;&#10;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;&lt;strong&gt;真实调度场景&lt;/strong&gt;&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;Kubernetes 会根据资源和策略，将 Pod 调度到不同节点&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;&lt;strong&gt;网络复杂&lt;/strong&gt;&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;Pod 网络跨节点，需要 CNI 插件（Flannel、Calico 等）支持&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h3 id="适用场景"&gt;适用场景&lt;/h3&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;生产环境部署微服务&lt;/p&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;测试调度策略、Pod 分布、Service 负载均衡&lt;/p&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;实战演练集群管理和高可用&lt;/p&gt;&#10;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h3 id="优点"&gt;优点&lt;/h3&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;模拟真实生产环境&lt;/p&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;可以横向扩展容器数量&lt;/p&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;Master 故障可配置高可用&lt;/p&gt;&#10;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h3 id="缺点"&gt;缺点&lt;/h3&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;配置复杂，需要多台虚拟机或服务器&lt;/p&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;网络和存储管理比单节点复杂&lt;/p&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;资源占用高&lt;/p&gt;&#10;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h2 id="二-准备环境和工具"&gt;二、 准备环境和工具&lt;/h2&gt;&#10;&lt;p&gt;这里使用centos7环境 &lt;a href="#%E4%BD%BF%E7%94%A8%E8%99%9A%E6%8B%9F%E6%9C%BA%E8%AF%B4%E6%98%8E"&gt;说明&lt;/a&gt;&lt;/p&gt;&#10;&lt;p&gt;&lt;code&gt;sudo -i&lt;/code&gt; 建议用root账号操作&lt;/p&gt;&#10;&lt;p&gt;每&lt;strong&gt;台节点都需要执行的操作&lt;/strong&gt;，包括 master 和 worker：系统初始化、安装和配置容器运行时（containerd）、镜像源替换等操作&lt;/p&gt;&#10;&lt;p&gt;这里不再赘述，参照另一篇：&lt;a href="./Kubernetes%E5%AD%A6%E4%B9%A0%E6%8C%87%E5%8C%97%E4%B9%8B%E5%8D%95%E8%8A%82%E7%82%B9%E9%9B%86%E7%BE%A4%EF%BC%88Master%EF%BC%89.md"&gt;Kubernetes学习指北之单节点集群&lt;/a&gt;&lt;/p&gt;&#10;&lt;h2 id="三节点准备"&gt;三、节点准备&lt;/h2&gt;&#10;&lt;p&gt;在&lt;strong&gt;每台节点&lt;/strong&gt;上安装：&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 1&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 安装 kubeadm、kubelet、kubectl&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 2&lt;/span&gt;&lt;span class="cl"&gt;yum install -y kubelet kubeadm kubectl&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 3&lt;/span&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 4&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 启动 kubelet&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 5&lt;/span&gt;&lt;span class="cl"&gt;systemctl &lt;span class="nb"&gt;enable&lt;/span&gt; --now kubelet&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 6&lt;/span&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 7&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 关闭 swap（K8s 要求）&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 8&lt;/span&gt;&lt;span class="cl"&gt;swapoff -a&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 9&lt;/span&gt;&lt;span class="cl"&gt;sed -i &lt;span class="s1"&gt;&amp;#39;/swap/d&amp;#39;&lt;/span&gt; /etc/fstab&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;10&lt;/span&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;11&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 配置 sysctl&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;12&lt;/span&gt;&lt;span class="cl"&gt;cat &lt;span class="s"&gt;&amp;lt;&amp;lt;EOF | sudo tee /etc/sysctl.d/k8s.conf&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;13&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;net.bridge.bridge-nf-call-ip6tables = 1&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;14&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;net.bridge.bridge-nf-call-iptables = 1&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;15&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;EOF&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;16&lt;/span&gt;&lt;span class="cl"&gt;sysctl --system&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="四初始化控制平面节点master"&gt;四、初始化控制平面节点（master）&lt;/h2&gt;&#10;&lt;p&gt;在&lt;strong&gt;master机器&lt;/strong&gt;执行：&lt;/p&gt;</description></item><item><title>Linux grep命令</title><link>https://www.leanku.com/post/devops/linux-grep%E5%91%BD%E4%BB%A4/</link><pubDate>Mon, 17 Feb 2025 22:33:45 +0800</pubDate><guid>https://www.leanku.com/post/devops/linux-grep%E5%91%BD%E4%BB%A4/</guid><description>&lt;h2 id="linux-grep命令"&gt;Linux grep命令&lt;/h2&gt;&#10;&lt;blockquote&gt;&#10;&lt;p&gt;全拼:Global search REgular expression and Print out the line.&lt;/p&gt;&#10;&lt;p&gt;作用:文本搜索工具，根据用户指定的“模式（过滤条件)”对目标文本逐行进行匹配检查，打印匹配到的行.&lt;/p&gt;&#10;&lt;p&gt;模式:由正则表达式的元字符及文本字符所编写出的过滤条件﹔&lt;/p&gt;&#10;&lt;/blockquote&gt;&#10;&lt;p&gt;&lt;strong&gt;grep的语法格式：&lt;/strong&gt;&lt;/p&gt;&#10;&lt;p&gt;grep -option（参数） ‘word’（关键词） file（文本文件）；&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;grep常用参数：&lt;/strong&gt;&#10;–color=auto 或者 –color：表示对匹配到的文本着色显示&lt;/p&gt;&#10;&lt;p&gt;-i：在搜索的时候忽略大小写&lt;/p&gt;&#10;&lt;p&gt;-n：显示结果所在行号&lt;/p&gt;&#10;&lt;p&gt;-c：统计匹配到的行数，注意，是匹配到的总行数，不是匹配到的次数&lt;/p&gt;&#10;&lt;p&gt;-o：只显示符合条件的字符串，但是不整行显示，每个符合条件的字符串单独显示一行&lt;/p&gt;&#10;&lt;p&gt;-v：输出不带关键字的行（反向查询，反向匹配）&lt;/p&gt;&#10;&lt;p&gt;-w：匹配整个单词，如果是字符串中包含这个单词，则不作匹配&lt;/p&gt;&#10;&lt;p&gt;-Ax：在输出的时候包含结果所在行之后的指定行数，这里指之后的x行，A：after&lt;/p&gt;&#10;&lt;p&gt;-Bx：在输出的时候包含结果所在行之前的指定行数，这里指之前的x行，B：before&lt;/p&gt;&#10;&lt;p&gt;-Cx：在输出的时候包含结果所在行之前和之后的指定行数，这里指之前和之后的x行，C：context&lt;/p&gt;&#10;&lt;p&gt;-e：实现多个选项的匹配，逻辑or关系&lt;/p&gt;&#10;&lt;p&gt;-q：静默模式，不输出任何信息，当我们只关心有没有匹配到，却不关心匹配到什么内容时，我们可以使用此命令，然后，使用”echo $?”查看是否匹配到，0表示匹配到，1表示没有匹配到。&lt;/p&gt;&#10;&lt;p&gt;-P：表示使用兼容perl的正则引擎。&lt;/p&gt;&#10;&lt;p&gt;-E：使用扩展正则表达式，而不是基本正则表达式，在使用”-E”选项时，相当于使用egrep。&lt;/p&gt;&#10;&lt;h2 id="示例"&gt;示例&lt;/h2&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 1&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 从test.txt文本文件中搜索包含”L”字符的行&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 2&lt;/span&gt;&lt;span class="cl"&gt;grep &lt;span class="s2"&gt;&amp;#34;L&amp;#34;&lt;/span&gt; test.txt &#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 3&lt;/span&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 4&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 输出以 I 开头的行(不区分大小写)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 5&lt;/span&gt;&lt;span class="cl"&gt;grep &lt;span class="s2"&gt;&amp;#34;^i&amp;#34;&lt;/span&gt; test.txt -i -n -o&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 6&lt;/span&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 7&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 可以使用”--color”选项，高亮显示行中的关键字&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 8&lt;/span&gt;&lt;span class="cl"&gt;grep &lt;span class="s2"&gt;&amp;#34;L&amp;#34;&lt;/span&gt; test.txt -i -n --color&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 9&lt;/span&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;10&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# -B”选项，显示符合条件的行之前的行，&amp;#34;B&amp;#34;有before之意&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;11&lt;/span&gt;&lt;span class="cl"&gt;grep &lt;span class="s2"&gt;&amp;#34;L&amp;#34;&lt;/span&gt; test.txt -i -n --color -B2&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;12&lt;/span&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;13&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# &amp;#34;-A&amp;#34;有After之意，&amp;#34;-A&amp;#34;代表显示符合条件的行的同时，还要显示之后的行，&amp;#34;-A3&amp;#34;表示同时显示符合条件的行之后的3行。&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;14&lt;/span&gt;&lt;span class="cl"&gt;grep &lt;span class="s2"&gt;&amp;#34;L&amp;#34;&lt;/span&gt; test.txt -i -n --color -A2&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;15&lt;/span&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;16&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# &amp;#34;-C&amp;#34;选项表示在显示符合条件的行的同时，也会显示其前后的行&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;17&lt;/span&gt;&lt;span class="cl"&gt;grep &lt;span class="s2"&gt;&amp;#34;L&amp;#34;&lt;/span&gt; test.txt -i -n --color -C2&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;18&lt;/span&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;19&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 利用grep判断文本中是否存在某个字符串在写脚本时，你可能只是想要利用grep判断文本中是否存在某个字符串，你只关心有没有匹配到，而不关心匹配到的内容，你只关心有，或者没有，这时，我们可以使用grep的静默模式，示例如下&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;20&lt;/span&gt;&lt;span class="cl"&gt;grep &lt;span class="s2"&gt;&amp;#34;L&amp;#34;&lt;/span&gt; test.txt -i -n --color -C2&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;21&lt;/span&gt;&lt;span class="cl"&gt;grep &lt;span class="s2"&gt;&amp;#34;L&amp;#34;&lt;/span&gt; test.txt -i -n --color -C2 -q&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;22&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="nv"&gt;$?&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;23&lt;/span&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;24&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 使用”-c”选项即可只统计符合条件的总行数，而不会打印出行。 显示出文章中有多少行有a或b或c&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;25&lt;/span&gt;&lt;span class="cl"&gt;grep &lt;span class="s2"&gt;&amp;#34;^i&amp;#34;&lt;/span&gt; test.txt -i -n -o -c&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;26&lt;/span&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;27&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 输出以.结尾的行&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;28&lt;/span&gt;&lt;span class="cl"&gt;grep &lt;span class="s2"&gt;&amp;#34;\.&lt;/span&gt;$&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt; test.txt -n -o&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;29&lt;/span&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;30&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 不不打印以.结尾的行&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;31&lt;/span&gt;&lt;span class="cl"&gt;grep &lt;span class="s2"&gt;&amp;#34;\.&lt;/span&gt;$&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt; test.txt -n -v&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;32&lt;/span&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;33&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# ^$(代表空行的意思)组合符. 如：找出文件的空行, 以及行号&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;34&lt;/span&gt;&lt;span class="cl"&gt;grep &lt;span class="s2"&gt;&amp;#34;^&lt;/span&gt;$&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt; test.txt -n&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;35&lt;/span&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;36&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# &amp;#34;.&amp;#34;点表示任意一个字符, 有且只有一个, 不包含空行&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;37&lt;/span&gt;&lt;span class="cl"&gt;grep &lt;span class="s2"&gt;&amp;#34;.&amp;#34;&lt;/span&gt; test.txt -n&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;38&lt;/span&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;39&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# &amp;#34;*&amp;#34;表示找出前一个字符0次或一次以上. 如：找出文件中i出现0次或多次的行和行号&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;40&lt;/span&gt;&lt;span class="cl"&gt;grep &lt;span class="s2"&gt;&amp;#34;i*&amp;#34;&lt;/span&gt; test.txt -n&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;41&lt;/span&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;42&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# &amp;#34;.*&amp;#34;表示所有内容, 包括空行&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;43&lt;/span&gt;&lt;span class="cl"&gt;grep &lt;span class="s2"&gt;&amp;#34;.*&amp;#34;&lt;/span&gt; test.txt -n -o&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;44&lt;/span&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;45&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# ^.*t符 (含义: 以任意内容开头, 直到t结束)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;46&lt;/span&gt;&lt;span class="cl"&gt;grep &lt;span class="s2"&gt;&amp;#34;^.*t&amp;#34;&lt;/span&gt; test.txt -n -o&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;47&lt;/span&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;48&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 中括号表达式,[abc]表示匹配中括号中任意一个字符 如：匹配abc字符中的任意一个,得到它的行数和行号&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;49&lt;/span&gt;&lt;span class="cl"&gt;grep &lt;span class="s2"&gt;&amp;#34;[abc]&amp;#34;&lt;/span&gt; test.txt -n -o&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;50&lt;/span&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;51&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# [^abc]或[^a-c]这样的命令, &amp;#34;^&amp;#34;符号在中括号中第一位表示排除, 就是排除字符a,b,c&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;52&lt;/span&gt;&lt;span class="cl"&gt;grep &lt;span class="s2"&gt;&amp;#34;[^abc]&amp;#34;&lt;/span&gt; test.txt -n&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;53&lt;/span&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;54&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# +号表示匹配前一个字符1一次或多次,必须使用grep -E扩展正则&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;55&lt;/span&gt;&lt;span class="cl"&gt;grep -E &lt;span class="s2"&gt;&amp;#34;a+&amp;#34;&lt;/span&gt; test.txt -n -o&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;56&lt;/span&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;57&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# ?符 匹配前一个字符0次或1次 如 找出文件中包含ji或者joi的行&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;58&lt;/span&gt;&lt;span class="cl"&gt;grep -E &lt;span class="s2"&gt;&amp;#34;jo?i&amp;#34;&lt;/span&gt; test.txt -n -o&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;59&lt;/span&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;60&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 竖线|在正则中是或者的意思 ，如 找出文件中包含j或者i的行, 不区分大小写(-i)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;61&lt;/span&gt;&lt;span class="cl"&gt;grep -E &lt;span class="s2"&gt;&amp;#34;j|i&amp;#34;&lt;/span&gt; test.txt -n -i&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;62&lt;/span&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;63&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# ()小括号 将一个或多个字符捆绑在一起, 当作一个整体进行处理&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;64&lt;/span&gt;&lt;span class="cl"&gt;grep -E &lt;span class="s2"&gt;&amp;#34;(ji)|(joi)&amp;#34;&lt;/span&gt; test.txt -n -i -o&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;65&lt;/span&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;66&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# {n,m}匹配次数&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;67&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# {n,m}:匹配前一个字符至少n次, 最多m次&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;68&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# {n,}: 匹配前一个字符至少n次, 没有上限&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;69&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# {,m}: 匹配前一个字符最多m次,可以没有&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;70&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 重复前一个字符各种次数, 可以通过-o参数显示明确的匹配过程&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;71&lt;/span&gt;&lt;span class="cl"&gt;grep -E &lt;span class="s2"&gt;&amp;#34;a{1,3}&amp;#34;&lt;/span&gt; test.txt -o&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description></item><item><title>Linux sed命令</title><link>https://www.leanku.com/post/devops/linux-sed%E5%91%BD%E4%BB%A4/</link><pubDate>Mon, 17 Feb 2025 22:33:45 +0800</pubDate><guid>https://www.leanku.com/post/devops/linux-sed%E5%91%BD%E4%BB%A4/</guid><description>&lt;h2 id="linux-sed命令"&gt;Linux sed命令&lt;/h2&gt;&#10;&lt;blockquote&gt;&#10;&lt;p&gt;全拼:Stream EDitor（流编辑器）&lt;/p&gt;&#10;&lt;p&gt;Linux sed 命令是利用脚本来处理文本文件，sed 可依照脚本的指令来处理、编辑文本文件。Sed 主要用来自动编辑一个或多个文件、简化对文件的反复操作、编写转换程序等。&lt;/p&gt;&#10;&lt;/blockquote&gt;&#10;&lt;h3 id="sed-的运行模式"&gt;sed 的运行模式&lt;/h3&gt;&#10;&lt;p&gt;当处理数据时，Sed 从输入源一次读入一行，并将它保存到所谓的模式空间pattern space中。所有 Sed 的变换都发生在模式空间。变换都是由命令行上或外部 Sed 脚本文件提供的单字母命令来描述的。大多数 Sed 命令都可以由一个地址或一个地址范围作为前导来限制它们的作用范围。&lt;/p&gt;&#10;&lt;h3 id="sed的相关选项"&gt;sed的相关选项&lt;/h3&gt;&#10;&lt;p&gt;-n, &amp;ndash;quiet, &amp;ndash;silent 取消自动打印模式空间&lt;/p&gt;&#10;&lt;p&gt;-e 脚本, &amp;ndash;expression=脚本 添加“脚本”到程序的运行列表&lt;/p&gt;&#10;&lt;p&gt;-f 脚本文件, &amp;ndash;file=脚本文件 添加“脚本文件”到程序的运行列表&lt;/p&gt;&#10;&lt;p&gt;&amp;ndash;follow-symlinks 直接修改文件时跟随软链接&lt;/p&gt;&#10;&lt;p&gt;-i[扩展名], &amp;ndash;in-place[=扩展名] 直接修改文件(如果指定扩展名就备份文件)&lt;/p&gt;&#10;&lt;p&gt;-l N, &amp;ndash;line-length=N 指定“l”命令的换行期望长度&lt;/p&gt;&#10;&lt;p&gt;&amp;ndash;posix 关闭所有 GNU 扩展&lt;/p&gt;&#10;&lt;p&gt;-r, &amp;ndash;regexp-extended 在脚本中使用扩展正则表达式&lt;/p&gt;&#10;&lt;p&gt;-s, &amp;ndash;separate 将输入文件视为各个独立的文件而不是一个长的连续输入&lt;/p&gt;&#10;&lt;p&gt;-u, &amp;ndash;unbuffered 从输入文件读取最少的数据，更频繁的刷新输出&lt;/p&gt;&#10;&lt;p&gt;&amp;ndash;help 打印帮助并退出&lt;/p&gt;&#10;&lt;p&gt;&amp;ndash;version 输出版本信息并退出&lt;/p&gt;&#10;&lt;p&gt;-a ∶新增， a 的后面可以接字串，而这些字串会在新的一行出现(目前的下一行)～&lt;/p&gt;&#10;&lt;p&gt;-c ∶取代， c 的后面可以接字串，这些字串可以取代 n1,n2 之间的行！&lt;/p&gt;&#10;&lt;p&gt;-d ∶删除，因为是删除啊，所以 d 后面通常不接任何咚咚；&lt;/p&gt;</description></item><item><title>Linux 进程管理命令</title><link>https://www.leanku.com/post/devops/linux-%E8%BF%9B%E7%A8%8B%E7%AE%A1%E7%90%86%E5%91%BD%E4%BB%A4/</link><pubDate>Mon, 17 Feb 2025 22:33:45 +0800</pubDate><guid>https://www.leanku.com/post/devops/linux-%E8%BF%9B%E7%A8%8B%E7%AE%A1%E7%90%86%E5%91%BD%E4%BB%A4/</guid><description>&lt;h2 id="linux-ps命令"&gt;Linux ps命令&lt;/h2&gt;&#10;&lt;blockquote&gt;&#10;&lt;p&gt;ps 命令是 Process Status 的缩写，是一个命令行实用程序，用于显示或查看与Linux系统中运行的进程相关的信息。&lt;/p&gt;&#10;&lt;p&gt;命令原理：ps 是通过读取虚拟文件：/proc 拿到进程数据的，不需要给 ps 设置任何的权限就可以运行。&lt;/p&gt;&#10;&lt;/blockquote&gt;&#10;&lt;p&gt;&lt;strong&gt;在Linux中，每个进程都有多个ID来关联它，包括：&lt;/strong&gt;&lt;/p&gt;&#10;&lt;ol&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;Process ID (PID)，即进程ID&lt;/p&gt;&#10;&lt;p&gt;这是标识进程的任意数字。每个进程都有一个唯一的ID，但是在进程退出并且父进程检索了退出状态之后，进程ID将被释放，供新进程重用。&lt;/p&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;Parent Process ID (PPID)，即父进程ID&lt;/p&gt;&#10;&lt;p&gt;如果父进程在子进程退出之前退出，则子进程的PPID将更改为另一个进程。&lt;/p&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;Process Group ID (PGID)&lt;/p&gt;&#10;&lt;p&gt;这是进程组leader的PID。如果PID == PGID，则此进程是进程组领导。&lt;/p&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;Session ID (SID)&lt;/p&gt;&#10;&lt;p&gt;这是会话领导者的PID。如果PID == SID，则此进程为会话领导进程。&lt;/p&gt;&#10;&lt;p&gt;会话和进程组只是将一些相关的进程作为一个单元来对待的方法。一个进程组的所有成员总是属于同一个会话，但是一个会话可以有多个进程组。&lt;/p&gt;&#10;&lt;p&gt;通常，shell将是会话领导者，该shell执行的每个管道将是一个进程组。这是为了在shell退出时很容易杀死它的子进程。&lt;/p&gt;&#10;&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;p&gt;grep -option（参数） ‘word’（关键词） file（文本文件）；&lt;/p&gt;&#10;&lt;h3 id="ps命令选项"&gt;ps命令选项：&lt;/h3&gt;&#10;&lt;p&gt;&lt;em&gt;&lt;strong&gt;简单筛选&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;&#10;&lt;p&gt;a ：选择所有进程（BSD-Style）。&lt;/p&gt;&#10;&lt;p&gt;-A ：选择所有进程，与 -e 等同（标准格式）。&lt;/p&gt;&#10;&lt;p&gt;-a ：选择除 session 领导者和没有与终端关联的进程之外的所有进程。&lt;/p&gt;&#10;&lt;p&gt;-d ：选择除了 session leader 的所有进程。&lt;/p&gt;&#10;&lt;p&gt;&amp;ndash;deselect ：选择除满足指定条件之外的所有进程，即反选，与 -N 等同。&lt;/p&gt;&#10;&lt;p&gt;-e ：选择所有进程，与 -A 等同。&lt;/p&gt;&#10;&lt;p&gt;-N ：与 &amp;ndash;deselect 等同。&lt;/p&gt;</description></item><item><title>NGINX负载均衡</title><link>https://www.leanku.com/post/devops/nginx%E8%B4%9F%E8%BD%BD%E5%9D%87%E8%A1%A1/</link><pubDate>Sat, 20 Apr 2024 20:46:01 +0800</pubDate><guid>https://www.leanku.com/post/devops/nginx%E8%B4%9F%E8%BD%BD%E5%9D%87%E8%A1%A1/</guid><description>&lt;h1 id="nginx负载均衡"&gt;NGINX负载均衡&lt;/h1&gt;&#10;&lt;h2 id="nginx是一个强大的开源web服务器和反向代理服务器它支持正向代理和反向代理功能"&gt;Nginx是一个强大的开源Web服务器和反向代理服务器，它支持正向代理和反向代理功能。&lt;/h2&gt;&#10;&lt;h3 id="正向代理"&gt;正向代理&lt;/h3&gt;&#10;&lt;p&gt;正向代理是客户端访问代理服务器去访问目标服务器，并且对目标服务器隐藏了客户端的真实信息（IP等信息）&lt;/p&gt;&#10;&lt;p&gt;正向代理的主要用途包括：&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;访问被限制的资源：当某些资源受到网络限制或访问限制时，可以使用正向代理绕过这些限制来获取资源。&lt;/li&gt;&#10;&lt;li&gt;提高访问速度：代理服务器可以缓存经常请求的资源，从而提高客户端访问资源的速度。&lt;/li&gt;&#10;&lt;li&gt;突破防火墙：正向代理可以帮助绕过企业或国家防火墙的限制，访问被封锁的网站或资源。&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h3 id="反向代理"&gt;反向代理&lt;/h3&gt;&#10;&lt;p&gt;反向代理是指代理服务器接收客户端的请求，然后反向代理将客户端的请求分发给一个或多个目标服务器，最后将响应返回给客户端，对于客户端隐藏了真实的服务端信息&lt;/p&gt;&#10;&lt;p&gt;反向代理的主要用途包括：&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;负载均衡：反向代理可以根据一定的算法将请求均匀地分发给后端的多台服务器，从而实现负载均衡，提高系统的并发处理能力和稳定性。&lt;/li&gt;&#10;&lt;li&gt;缓存静态资源：反向代理可以缓存经常请求的静态资源，减少后端服务器的负载，提高网站的访问速度。&lt;/li&gt;&#10;&lt;li&gt;安全性和可靠性：反向代理可以作为防火墙和安全设备，提供安全认证、访问控制、DDoS攻击防护等功能。&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h2 id="nginx配置文件"&gt;Nginx配置文件&lt;/h2&gt;&#10;&lt;pre tabindex="0"&gt;&lt;code&gt;#user nobody; 是用来指定 Nginx 进程运行的用户和用户组的配置项。 在 Linux 系统中，各个进程需要以某个用户的身份来运行，以限制权限并提高安全性&#10;worker_processes 1;&#10; &#10;events {&#10; worker_connections 1024;&#10;}&#10; &#10;http {&#10; include mime.types;&#10; default_type application/octet-stream;&#10; sendfile on;&#10; keepalive_timeout 65;&#10; &#10; server {&#10; listen 8080;&#10; server_name localhost;&#10; &#10; location / {&#10; root html;&#10; index index.html index.htm;&#10; }&#10; error_page 500 502 503 504 /50x.html;&#10; location = /50x.html {&#10; root html;&#10; }&#10; }&#10;}&#10;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;第一部分 全局块worker_processes:&lt;/p&gt;</description></item><item><title>Linux常用命令</title><link>https://www.leanku.com/post/devops/linux%E5%B8%B8%E7%94%A8%E5%91%BD%E4%BB%A4/</link><pubDate>Mon, 18 Mar 2024 20:46:01 +0800</pubDate><guid>https://www.leanku.com/post/devops/linux%E5%B8%B8%E7%94%A8%E5%91%BD%E4%BB%A4/</guid><description>&lt;h1 id="linux基本简介"&gt;Linux基本简介&lt;/h1&gt;&#10;&lt;pre&gt;&lt;code&gt;Linux 是一个基于Linux 内核的开源类Unix 操作系统，Linus Torvalds于 1991 年 9 月 17 日首次发布的操作系统内核。Linux 通常打包为Linux 发行版。&#10;&lt;/code&gt;&lt;/pre&gt;&#10;&lt;h2 id="linux文件系统"&gt;Linux文件系统&lt;/h2&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;Linux一切皆文件&lt;/li&gt;&#10;&lt;li&gt;只有一个顶级目录，不像windows分C盘、D盘、E盘&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;table&gt;&#10;&#9;&lt;thead&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th style="text-align: left"&gt;Linux&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th style="text-align: left"&gt;含义&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th style="text-align: left"&gt;windows&lt;/th&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/thead&gt;&#10;&#9;&lt;tbody&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;/bin&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;所有用户可用的基本命令存放的位置&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;windows没有固定的命令存放目录&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;/sbin&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;需要管理员权限才能使用的命令&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;/boot&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;linux系统启动的时候需要加载和使用的文件&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;/dev&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;外设连接linux后，对应的文件存放的位置&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;类似Windows中的U盘，光盘的符号文件。&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;/etc&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;存放系统或者安装的程序的配置文件,注册服务等&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;类似windows中的注册表，&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;/home&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;家目录，linux中每新建一个用户，会自动在home中为该用户分配一个文件夹&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;类似windows中的&amp;quot;我的文档&amp;quot;，每个用户有自己的目录。&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;/root&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;root账户的家目录，仅供root账户使用&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;类似windows中的Administrator账户的&amp;quot;我的文档&amp;quot;&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;/lib&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;linux的命令和系统启动，需要使用一些公共的依赖，放在lib中，类似我们开发的代码执行需要引入的jdk的jar&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;/usr&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;很多系统软件的默认安装路径&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;类似windows中的C盘下的Program Files目录。&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;/var&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;系统和程序运行产生的日志文件和缓存文件放在这里&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/tbody&gt;&#10;&lt;/table&gt;&#10;&lt;h2 id="linux常用命令"&gt;Linux常用命令&lt;/h2&gt;&#10;&lt;p&gt;命令格式 ：命令 [-选项] [参数]&lt;/p&gt;&#10;&lt;pre&gt;&lt;code&gt;例 ： ls -la /etc&#10;&lt;/code&gt;&lt;/pre&gt;&#10;&lt;h3 id="文件管理"&gt;文件管理&lt;/h3&gt;&#10;&lt;table&gt;&#10;&#9;&lt;thead&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th style="text-align: left"&gt;命令&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th style="text-align: left"&gt;解释&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th style="text-align: left"&gt;参数&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th style="text-align: left"&gt;示例&lt;/th&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/thead&gt;&#10;&#9;&lt;tbody&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;ls&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;列出目录的内容&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;-a 显示所有文件，包括隐藏文件; -l详细信息显示; -d 查看目录属性&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;ls -la&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;cd&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;切换工作目录&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;cd ..&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;pwd&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;显示当前路径&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;cd&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;切换工作目录&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;cd ..&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;mkdir&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;创建目录&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;-p 递归创建&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;mkdir -p /tmp/zhang/test&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;rmdir&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;删除目录&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;rmdir /tmp/zhang/test&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;rm&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;删除文件&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;-r 删除目录; -f 强制执行&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;rm -rf /tmp/zhang/test2&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;cp&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;拷贝文件&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;-r 复制目录; -p 保留文件属性&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;cp -r /tmp/zhang/test1 /root&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;mv&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;移动文件&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;mv 文件A 文件B&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;md5sum&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;获取文件的md5指纹&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;md5sum 文件名&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/tbody&gt;&#10;&lt;/table&gt;&#10;&lt;h3 id="文本内容查看处理命令"&gt;文本内容(查看|处理)命令&lt;/h3&gt;&#10;&lt;table&gt;&#10;&#9;&lt;thead&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th style="text-align: left"&gt;命令&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th style="text-align: left"&gt;解释&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th style="text-align: left"&gt;参数&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th style="text-align: left"&gt;示例&lt;/th&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/thead&gt;&#10;&#9;&lt;tbody&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;touch&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;创建文件&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;touch test&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;cat&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;显示文件内容&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;-n 显示行号&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;cat /etc/issue&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;more&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;分屏显示&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;(空格) 或f 翻页; (Enter) 换行; q或Q 退出&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;less&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;分屏显示&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;head&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;取首n行&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;-n 指定行数&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;head -n 20 /etc/services&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;tail&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;取尾n行&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;-n 指定行数; -f 动态显示文件末尾内容&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;tail -n 18 /etc/services&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/tbody&gt;&#10;&lt;/table&gt;&#10;&lt;h3 id="文件搜索命令"&gt;文件搜索命令&lt;/h3&gt;&#10;&lt;table&gt;&#10;&#9;&lt;thead&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th style="text-align: left"&gt;命令&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th style="text-align: left"&gt;解释&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th style="text-align: left"&gt;参数&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th style="text-align: left"&gt;示例&lt;/th&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/thead&gt;&#10;&#9;&lt;tbody&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;find&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;查找文件&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;[搜索范围] [匹配条件]&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;find / -name &amp;ldquo;passwd&amp;rdquo;&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;locate&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;文件资料库查找&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;locate inittab&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;which&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;查看命令位置&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;which ls&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;whereis&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;查看命令位置&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;grep&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;文本搜索&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;-i 不区分大小写; -v 排除指定字串&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;grep mysql /root/install.log&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/tbody&gt;&#10;&lt;/table&gt;&#10;&lt;h3 id="文件链接"&gt;文件链接&lt;/h3&gt;&#10;&lt;table&gt;&#10;&#9;&lt;thead&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th style="text-align: left"&gt;命令&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th style="text-align: left"&gt;解释&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th style="text-align: left"&gt;参数&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th style="text-align: left"&gt;示例&lt;/th&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/thead&gt;&#10;&#9;&lt;tbody&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;ln&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;文件链接&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;-s 创建软链接&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;ln /etc/issue /tmp/issue.hard&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/tbody&gt;&#10;&lt;/table&gt;&#10;&lt;h3 id="权限管理命令"&gt;权限管理命令&lt;/h3&gt;&#10;&lt;p&gt;&lt;strong&gt;用户组&lt;/strong&gt;&lt;/p&gt;</description></item><item><title>VirtualBox+Vagrant使用</title><link>https://www.leanku.com/post/devops/virtualbox-vagrant%E4%BD%BF%E7%94%A8/</link><pubDate>Tue, 01 Aug 2023 11:46:01 +0800</pubDate><guid>https://www.leanku.com/post/devops/virtualbox-vagrant%E4%BD%BF%E7%94%A8/</guid><description>&lt;h1 id="virtualboxvagrant使用"&gt;VirtualBox+Vagrant使用&lt;/h1&gt;&#10;&lt;h2 id="一-介绍"&gt;一、 介绍&lt;/h2&gt;&#10;&lt;h3 id="1-virtualbox简介"&gt;1. VirtualBox简介&lt;/h3&gt;&#10;&lt;p&gt;VirtualBox是一个开源的 虚拟机管理软件，由 Oracle 开发。它的核心功能是允许你在一台物理机上运行多个虚拟机，每个虚拟机都可以装不同的操作系统。&lt;/p&gt;&#10;&lt;h4 id="特点"&gt;特点：&lt;/h4&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;&lt;strong&gt;跨平台&lt;/strong&gt;：支持 Windows、Linux、macOS 主机上安装。&lt;/p&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;&lt;strong&gt;支持多种客操作系统&lt;/strong&gt;：常见的 Linux 发行版（CentOS、Ubuntu）、Windows Server、BSD 等。&lt;/p&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;&lt;strong&gt;虚拟化功能&lt;/strong&gt;：&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;配置虚拟 CPU、内存、磁盘、网卡等。&lt;/p&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;支持桥接网络、NAT、仅主机网络等多种网络模式。&lt;/p&gt;&#10;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;&lt;strong&gt;GUI + CLI 管理&lt;/strong&gt;：既可以用图形界面管理虚拟机，也可以用命令行 &lt;code&gt;VBoxManage&lt;/code&gt; 控制。&lt;/p&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;&lt;strong&gt;适合个人和开发使用&lt;/strong&gt;：开源免费，功能较全。&lt;/p&gt;&#10;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h3 id="2-vagrant简介"&gt;2. Vagrant简介&lt;/h3&gt;&#10;&lt;p&gt;Vagrant 是一个虚拟机 自动化管理工具，它本身不提供虚拟化功能，而是调用 VirtualBox、VMware、Hyper-V、Docker 等“虚拟化提供者”（provider）来创建和管理虚拟机。&lt;/p&gt;&#10;&lt;h4 id="特点-1"&gt;特点：&lt;/h4&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;&lt;strong&gt;开发环境自动化&lt;/strong&gt;：&lt;br&gt;&#10;通过 &lt;code&gt;Vagrantfile&lt;/code&gt; 描述一台（或多台）虚拟机的配置，比如操作系统镜像、CPU/内存、网络、共享目录等。&lt;/p&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;&lt;strong&gt;跨平台一致性&lt;/strong&gt;：&lt;br&gt;&#10;不同开发者只要用相同的 &lt;code&gt;Vagrantfile&lt;/code&gt;，就能快速得到一模一样的开发环境，避免“在我机器上没问题”。&lt;/p&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;&lt;strong&gt;支持多种 Provider&lt;/strong&gt;：&lt;br&gt;&#10;默认支持 VirtualBox，也可以配合 VMware、Hyper-V、Libvirt、Docker。&lt;/p&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;&lt;strong&gt;Provisioning（自动化配置）&lt;/strong&gt;：&lt;br&gt;&#10;可以在虚拟机启动时自动执行脚本（Shell、Ansible、Puppet、Chef）来安装软件和配置环境。&lt;/p&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;&lt;strong&gt;命令行简单&lt;/strong&gt;：&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;&lt;code&gt;vagrant init&lt;/code&gt; → 生成配置文件&lt;/p&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;&lt;code&gt;vagrant up&lt;/code&gt; → 启动虚拟机&lt;/p&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;&lt;code&gt;vagrant ssh&lt;/code&gt; → 进入虚拟机&lt;/p&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;&lt;code&gt;vagrant halt&lt;/code&gt; → 关闭虚拟机&lt;/p&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;&lt;code&gt;vagrant destroy&lt;/code&gt; → 删除虚拟机&lt;/p&gt;</description></item><item><title>docker删除none镜像</title><link>https://www.leanku.com/post/devops/docker%E5%88%A0%E9%99%A4none%E9%95%9C%E5%83%8F/</link><pubDate>Sat, 11 Mar 2023 20:46:01 +0800</pubDate><guid>https://www.leanku.com/post/devops/docker%E5%88%A0%E9%99%A4none%E9%95%9C%E5%83%8F/</guid><description>&lt;h1 id="docker删除none镜像"&gt;docker删除none镜像&lt;/h1&gt;&#10;&lt;p&gt;1、使用git bash进入到docker文件夹&lt;/p&gt;&#10;&lt;p&gt;2、查询所有的none镜像&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;1&lt;/span&gt;&lt;span class="cl"&gt;docker images &lt;span class="p"&gt;|&lt;/span&gt; grep none&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;3、查询所有的none镜像的id&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;1&lt;/span&gt;&lt;span class="cl"&gt;docker images &lt;span class="p"&gt;|&lt;/span&gt; grep none &lt;span class="p"&gt;|&lt;/span&gt; awk &lt;span class="s1"&gt;&amp;#39;{print $3}&amp;#39;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;4、删除所有的none镜像&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;1&lt;/span&gt;&lt;span class="cl"&gt;docker images &lt;span class="p"&gt;|&lt;/span&gt; grep none &lt;span class="p"&gt;|&lt;/span&gt; awk &lt;span class="s1"&gt;&amp;#39;{print $3}&amp;#39;&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt; xargs docker rmi&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="docker-none镜像说明"&gt;docker none镜像说明&lt;/h2&gt;&#10;&lt;h3 id="一有效的-none-镜像"&gt;一、有效的 none 镜像&lt;/h3&gt;&#10;&lt;p&gt;Docker文件系统的组成，docker镜像是由很多 layers组成的，每个 layer之间有父子关系，所有的docker文件系统层默认都存储在/var/lib/docker/graph目录下，docker称之为图层数据库。&lt;/p&gt;&#10;&lt;p&gt;最后做一个总结&amp;lt; none&amp;gt;:&amp;lt; none&amp;gt; 镜像是一种中间镜像，我们可以使用docker images -a来看到，他们不会造成硬盘空间占用的问题（因为这是镜像的父层，必须存在的），但是会给我们的判断带来迷惑。&lt;/p&gt;&#10;&lt;h3 id="二无效的-none-镜像"&gt;二、无效的 none 镜像&lt;/h3&gt;&#10;&lt;p&gt;另一种类型的 &amp;lt; none&amp;gt;:&amp;lt; none&amp;gt; 镜像是dangling images ，这种类型会造成磁盘空间占用问题。&lt;/p&gt;&#10;&lt;p&gt;像Java和Golang这种编程语言都有一个内存区，这个内存区不会关联任何的代码。这些语言的垃圾回收系统优先回收这块区域的空间，将他返回给堆内存，所以这块内存区对于之后的内存分配是有用的&lt;/p&gt;&#10;&lt;p&gt;docker的悬挂(dangling)文件系统与上面的原理类似，他是没有被使用到的并且不会关联任何镜像，因此我们需要一种机制去清理这些悬空镜像。&lt;/p&gt;&#10;&lt;p&gt;我们在上文已经提到了有效的&amp;lt; none&amp;gt;镜像，他们是一种中间层，那无效的&amp;lt; none&amp;gt;镜像又是怎么出现的？这些 dangling镜像主要是我们触发 docker build 和 docker pull命令产生的。&lt;/p&gt;&#10;&lt;p&gt;使用下面的命令可以清理&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;1&lt;/span&gt;&lt;span class="cl"&gt;docker rmi &lt;span class="k"&gt;$(&lt;/span&gt;docker images -f &lt;span class="s2"&gt;&amp;#34;dangling=true&amp;#34;&lt;/span&gt; -q&lt;span class="k"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description></item><item><title>Vim 常用命令</title><link>https://www.leanku.com/post/devops/vim-%E5%B8%B8%E7%94%A8%E5%91%BD%E4%BB%A4/</link><pubDate>Wed, 01 Feb 2023 00:00:00 +0000</pubDate><guid>https://www.leanku.com/post/devops/vim-%E5%B8%B8%E7%94%A8%E5%91%BD%E4%BB%A4/</guid><description>&lt;h1 id="vim介绍"&gt;Vim介绍&lt;/h1&gt;&#10;&lt;blockquote&gt;&#10;&lt;p&gt;Vim是一个类似于Vi的著名的功能强大、高度可定制的文本编辑器，在Vi的基础上改进和增加了很多特性。VIM是自由软件。Vim普遍被推崇为类Vi编辑器中最好的一个，事实上真正的劲敌来自Emacs的不同变体。1999 年Emacs被选为Linuxworld文本编辑分类的优胜者，Vim屈居第二。但在2000年2月Vim赢得了Slashdot Beanie的最佳开放源代码文本编辑器大奖，又将Emacs推至二线， 总的来看， Vim和Emacs在文本编辑方面都是非常优秀的。&lt;a href="https://baike.baidu.com/item/Vim/60410?fr=aladdin"&gt;百度百科&lt;/a&gt;&lt;/p&gt;&#10;&lt;/blockquote&gt;&#10;&lt;h2 id="使用"&gt;使用&lt;/h2&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;1&lt;/span&gt;&lt;span class="cl"&gt;vim a.php #&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="控制屏幕光标的移动字符字或行的删除移动复制某区段以其它任何模式按esc-即可进宪普通模式"&gt;控制屏幕光标的移动，字符、字或行的删除，移动复制某区段，以其它任何模式按&lt;code&gt;esc&lt;/code&gt; 即可进宪普通模式&lt;/h3&gt;&#10;&lt;p&gt;&lt;strong&gt;&lt;code&gt;i&lt;/code&gt;&lt;/strong&gt; &lt;strong&gt;在当前光标字符前插入 insert&lt;/strong&gt;&lt;/p&gt;&#10;&lt;p&gt;&lt;code&gt;a&lt;/code&gt; 在当前光标字符后插入 append&lt;/p&gt;&#10;&lt;p&gt;&lt;code&gt;I&lt;/code&gt; 在当前行首插入 Insert&lt;/p&gt;&#10;&lt;p&gt;&lt;code&gt;A&lt;/code&gt; 在当前行尾插入 Append&lt;/p&gt;&#10;&lt;p&gt;&lt;code&gt;o&lt;/code&gt; &lt;strong&gt;在下方开一新行，插入 open&lt;/strong&gt;&lt;/p&gt;&#10;&lt;p&gt;&lt;code&gt;O&lt;/code&gt; 在上方开一新行，插入 Open&lt;/p&gt;&#10;&lt;p&gt;&lt;code&gt;r&lt;/code&gt; 替代字符，将当前字符替代为紧跟着输入的字符 replace&lt;/p&gt;&#10;&lt;p&gt;&lt;code&gt;R&lt;/code&gt; 进入替代模式，将当前及之后的字符都替代为紧跟着输入的字符串，直到按 `` 返回 Normal 模式 Replace&lt;/p&gt;&#10;&lt;p&gt;&lt;code&gt;gj&lt;/code&gt; 移动到屏幕折行后的下行&lt;/p&gt;&#10;&lt;p&gt;&lt;code&gt;gk&lt;/code&gt; 移动到屏幕折行后的上行&lt;/p&gt;&#10;&lt;hr&gt;&#10;&lt;h2 id="命令模式是在普通模式下按"&gt;&lt;strong&gt;命令模式是在普通模式下按 &lt;strong&gt;&lt;code&gt;:&lt;/code&gt;&lt;/strong&gt; 进入，用于搜索、保存退出等操作。&lt;/strong&gt;&lt;/h2&gt;&#10;&lt;p&gt;&lt;code&gt;:w&lt;/code&gt; 保存&lt;/p&gt;&#10;&lt;p&gt;&lt;code&gt;:w file&lt;/code&gt; 另存为文件&lt;/p&gt;&#10;&lt;p&gt;&lt;code&gt;:q&lt;/code&gt; 退出&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;&lt;code&gt;:q!&lt;/code&gt; 放弃修改退出&lt;/strong&gt;&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;&lt;code&gt;:wq&lt;/code&gt; 保存修改并退出&lt;/strong&gt;&lt;/p&gt;&#10;&lt;hr&gt;&#10;&lt;h2 id="移动命令"&gt;移动命令&lt;/h2&gt;&#10;&lt;p&gt;Vim 的各种移动命令主要是在标准模式下&lt;/p&gt;&#10;&lt;p&gt;&lt;code&gt;h&lt;/code&gt; 光标左移&lt;/p&gt;&#10;&lt;p&gt;&lt;code&gt;j&lt;/code&gt; 光标下移&lt;/p&gt;&#10;&lt;p&gt;&lt;code&gt;k&lt;/code&gt; 光标上移&lt;/p&gt;&#10;&lt;p&gt;&lt;code&gt;l&lt;/code&gt; 光标右移&lt;/p&gt;&#10;&lt;p&gt;&lt;code&gt;0&lt;/code&gt; 跳到行首，可以理解为无穷大的&lt;/p&gt;</description></item></channel></rss>