<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
  <author>
    <name>张理坤</name>
  </author>
  <generator uri="https://hexo.io/">Hexo</generator>
  <icon>https://zahui.fan/favicon.ico</icon>
  <id>https://zahui.fan/</id>
  <link href="https://zahui.fan/" rel="alternate"/>
  <link href="https://zahui.fan/atom.xml" rel="self"/>
  <rights>All rights reserved 2026, 张理坤</rights>
  <subtitle>张理坤的博客 - 运维技术分享</subtitle>
  <title>杂烩饭</title>
  <updated>2026-08-04T14:34:48.000Z</updated>
  <entry>
    <author>
      <name>张理坤</name>
    </author>
    <category term="Macintosh" scheme="https://zahui.fan/categories/Macintosh/"/>
    <content>
      <![CDATA[<p><a href="https://github.com/ThisBoringWorld/gam4980">https://github.com/ThisBoringWorld/gam4980</a> 这个是一个 步步高 4980 的电子词典模拟器项目。</p><p>先编译出动态链接库文件，作为 RetroArch 的核心。</p><p>打开 RetroArch，找到 设置 – 文件夹<br><img src="https://s3.babudiu.com/iuxt/public/nes.svg" data-lazy-src="https://s3.babudiu.com/iuxt/2026/08/1785853243_6fc7bc341124402d8182d74a9ae2508b_clipboard.png" alt="image.png"></p><p>找到系统 BIOS，把 8.bin 和 E.bin 放到这个文件夹下的 gam4980 目录下<br><img src="https://s3.babudiu.com/iuxt/public/nes.svg" data-lazy-src="https://s3.babudiu.com/iuxt/2026/08/1785853290_d9914a209f824a59a4e55bae4a8b397c_clipboard.png" alt="image.png"></p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line">/Users/iuxt/Documents/RetroArch/system/</span><br><span class="line">└── gam4980</span><br><span class="line">    ├── 8.BIN</span><br><span class="line">    ├── E.BIN</span><br><span class="line">    └── README.md</span><br><span class="line"></span><br><span class="line">2 directories, 3 files</span><br></pre></td></tr></table></figure><p>直接启动核心，就相当于启动了一台 步步高朗文 4980 电子词典。。</p><p>看到这个小和尚，我的眼泪流了下来。</p><p><img src="https://s3.babudiu.com/iuxt/public/nes.svg" data-lazy-src="https://s3.babudiu.com/iuxt/2026/08/1785853973_bdcf1a7e02944df7a45ec211d291a116_clipboard.png" alt="image.png"></p>]]>
    </content>
    <id>https://zahui.fan/posts/tj911g/</id>
    <link href="https://zahui.fan/posts/tj911g/"/>
    <published>2026-08-04T14:17:40.000Z</published>
    <summary>
      <![CDATA[<p><a href="https://github.com/ThisBoringWorld/gam4980">https://github.com/ThisBoringWorld/gam4980</a> 这个是一个 步步高 4980 的电子词典模拟器项目。</p>
<p>先编译出动态链接库文件，作为 RetroArch 的核心。</p>
<p>打开 RetroArch，找到 设置 –]]>
    </summary>
    <title>使用RetroArch玩步步高电子词典游戏</title>
    <updated>2026-08-04T14:34:48.000Z</updated>
  </entry>
  <entry>
    <author>
      <name>张理坤</name>
    </author>
    <category term="Macintosh" scheme="https://zahui.fan/categories/Macintosh/"/>
    <content>
      <![CDATA[<p>尽量使用干净的方式来安装 Photoshop 了，但还是有个 CCLibrary 的启动项<br><img src="https://s3.babudiu.com/iuxt/public/nes.svg" data-lazy-src="https://s3.babudiu.com/iuxt/2026/07/1784911006_cc2b408d73f24dafa32d15b2c66d131b_clipboard.png" alt="image.png|514"></p><p>正常来说，启动项的删除只需要检查下这几个文件夹，把 Adobe 的 plist 删除即可：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">ls</span> ~/Library/LaunchAgents | grep -i adobe</span><br><span class="line"><span class="built_in">ls</span> /Library/LaunchAgents | grep -i adobe</span><br><span class="line"><span class="built_in">ls</span> /Library/LaunchDaemons | grep -i adobe</span><br></pre></td></tr></table></figure><p>但是这几个文件夹删干净了之后，还是有。</p><p>于是使用命令：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">sfltool dumpbtm | grep -i cclibrary</span><br></pre></td></tr></table></figure><p><img src="https://s3.babudiu.com/iuxt/public/nes.svg" data-lazy-src="https://s3.babudiu.com/iuxt/2026/07/1784911160_2304fd86ebb54623895a4d2cdc43ae25_clipboard.png" alt="image.png"></p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">pkill -f CCLibrary</span><br><span class="line">ps aux | grep -i cclibrary</span><br><span class="line"><span class="built_in">sudo</span> <span class="built_in">rm</span> -rf <span class="string">&quot;/Library/Application Support/Adobe/Creative Cloud Libraries/CCLibrary.app&quot;</span></span><br><span class="line">launchctl list | grep -i adobe</span><br></pre></td></tr></table></figure><p><img src="https://s3.babudiu.com/iuxt/public/nes.svg" data-lazy-src="https://s3.babudiu.com/iuxt/2026/07/1784911679_8ec44e6e499242e1ab875c34f9be36b4_clipboard.png" alt="image.png"></p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">launchctl remove application.com.adobe.AdobeCRDaemon.13556605.13556611</span><br></pre></td></tr></table></figure><p>刷新缓存</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">sfltool resetbtm</span><br></pre></td></tr></table></figure>]]>
    </content>
    <id>https://zahui.fan/posts/tiou4x/</id>
    <link href="https://zahui.fan/posts/tiou4x/"/>
    <published>2026-07-24T16:36:33.000Z</published>
    <summary>
      <![CDATA[<p>尽量使用干净的方式来安装 Photoshop 了，但还是有个 CCLibrary 的启动项<br><img src="https://s3.babudiu.com/iuxt/public/nes.svg"]]>
    </summary>
    <title>彻底删除CCLibrary</title>
    <updated>2026-07-25T15:02:09.000Z</updated>
  </entry>
  <entry>
    <author>
      <name>张理坤</name>
    </author>
    <category term="基础运维" scheme="https://zahui.fan/categories/%E5%9F%BA%E7%A1%80%E8%BF%90%E7%BB%B4/"/>
    <category term="Nginx" scheme="https://zahui.fan/tags/Nginx/"/>
    <category term="安全" scheme="https://zahui.fan/tags/%E5%AE%89%E5%85%A8/"/>
    <category term="漏洞扫描" scheme="https://zahui.fan/tags/%E6%BC%8F%E6%B4%9E%E6%89%AB%E6%8F%8F/"/>
    <content>
      <![CDATA[<h2 id="说明"><a href="#说明" class="headerlink" title="说明"></a>说明</h2><p>比如漏洞扫描工具会扫描出这种漏洞（直接访问 <a href="https://1.1.1.1/">https://1.1.1.1</a> ）：<br><code>SSL Certificate Is About To Expire</code><br><code>SSL Certificate Name Hostname Mismatch</code><br>只是 Nginx 开放到公网，也并不会直接通过 IP 地址来访问，为了消除这个漏洞影响。</p><h2 id="不返回数据"><a href="#不返回数据" class="headerlink" title="不返回数据"></a>不返回数据</h2><p>可以修改 nginx 的默认站点配置，直接返回 444（444 状态码是 Nginx 特有的，即直接关闭链接）</p><figure class="highlight nginx"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br></pre></td><td class="code"><pre><span class="line"><span class="section">server</span> &#123;</span><br><span class="line">    <span class="attribute">listen</span> <span class="number">80</span> default_server;</span><br><span class="line">    <span class="attribute">listen</span> <span class="number">443</span> ssl default_server;</span><br><span class="line"></span><br><span class="line">    <span class="attribute">ssl_certificate</span>     /etc/nginx/ssl/xxxx.com.crt;</span><br><span class="line">    <span class="attribute">ssl_certificate_key</span> /etc/nginx/ssl/xxxx.com.key;</span><br><span class="line"></span><br><span class="line">    <span class="attribute">server_name</span> _;</span><br><span class="line">    <span class="attribute">return</span> <span class="number">444</span>;</span><br><span class="line">&#125;</span><br><span class="line"></span><br></pre></td></tr></table></figure><p>这是一个最简单的配置，配置完成后，浏览器访问效果：<br><img src="https://s3.babudiu.com/iuxt/public/nes.svg" data-lazy-src="https://s3.babudiu.com/iuxt/2026/07/1784656944_7b64bb21f95940c8912300291dec610c_clipboard.webp" alt="image.png"></p><p>虽然不返回数据了，但是还是会泄露证书信息。</p><h2 id="禁止发送证书"><a href="#禁止发送证书" class="headerlink" title="禁止发送证书"></a>禁止发送证书</h2><p>加上配置：<code>ssl_reject_handshake on</code></p><figure class="highlight nginx"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br></pre></td><td class="code"><pre><span class="line"><span class="section">server</span> &#123;</span><br><span class="line">    <span class="attribute">listen</span> <span class="number">80</span> default_server;</span><br><span class="line">    <span class="attribute">listen</span> <span class="number">443</span> ssl default_server;</span><br><span class="line"></span><br><span class="line">    <span class="attribute">ssl_certificate</span>     /etc/nginx/ssl/xxxx.com.crt;</span><br><span class="line">    <span class="attribute">ssl_certificate_key</span> /etc/nginx/ssl/xxxx.com.key;</span><br><span class="line"></span><br><span class="line">    <span class="attribute">server_name</span> _;</span><br><span class="line">    <span class="attribute">ssl_reject_handshake</span> <span class="literal">on</span>;</span><br><span class="line">    <span class="attribute">return</span> <span class="number">444</span>;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="section">server</span> &#123;</span><br><span class="line">    <span class="attribute">listen</span> <span class="number">80</span> ;</span><br><span class="line">    <span class="attribute">listen</span> <span class="number">443</span> ssl ;</span><br><span class="line"></span><br><span class="line">    <span class="attribute">ssl_certificate</span>     /etc/nginx/ssl/xxxx.com.crt;</span><br><span class="line">    <span class="attribute">ssl_certificate_key</span> /etc/nginx/ssl/xxxx.com.key;</span><br><span class="line"></span><br><span class="line">    <span class="attribute">server_name</span> a.xxxx.com;</span><br><span class="line"></span><br><span class="line">    <span class="attribute">default_type</span> text/html;</span><br><span class="line">    <span class="attribute">return</span> <span class="number">200</span> <span class="string">&quot;hello&quot;</span>;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>IP 地址直接访问的效果，不但被禁止打开。而且浏览器里看不到证书信息。</p><p><img src="https://s3.babudiu.com/iuxt/public/nes.svg" data-lazy-src="https://s3.babudiu.com/iuxt/2026/07/1784656154_72f39dbda73c4574b53622a2f9b87be2_clipboard.webp" alt="image.png"></p><p>访问正常的域名正常：<br><img src="https://s3.babudiu.com/iuxt/public/nes.svg" data-lazy-src="https://s3.babudiu.com/iuxt/2026/07/1784656159_975bc63476854bacbe1eace339d6e40d_clipboard.webp" alt="image.png"></p>]]>
    </content>
    <id>https://zahui.fan/posts/tijdbt/</id>
    <link href="https://zahui.fan/posts/tijdbt/"/>
    <published>2026-07-21T17:45:29.000Z</published>
    <summary>
      <![CDATA[<h2 id="说明"><a href="#说明" class="headerlink" title="说明"></a>说明</h2><p>比如漏洞扫描工具会扫描出这种漏洞（直接访问 <a href="https://1.1.1.1/">https://1.1.1.1</a> ）：<br><code>SSL Certificate Is About To]]>
    </summary>
    <title>在 Nginx 中禁止 IP 直连与域名暴露</title>
    <updated>2026-07-25T15:04:01.000Z</updated>
  </entry>
  <entry>
    <author>
      <name>张理坤</name>
    </author>
    <category term="工具" scheme="https://zahui.fan/categories/%E5%B7%A5%E5%85%B7/"/>
    <content>
      <![CDATA[<h2 id="使用-Docker-部署"><a href="#使用-Docker-部署" class="headerlink" title="使用 Docker 部署"></a>使用 Docker 部署</h2><p>准备配置 <code>.env</code></p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">RUSTFS_ACCESS_KEY=rustfsadmin</span><br><span class="line">RUSTFS_SECRET_KEY=rustfsadmin</span><br><span class="line">RUSTFS_CONSOLE_ENABLE=true</span><br><span class="line">RUSTFS_SERVER_DOMAINS=s3.example.com</span><br></pre></td></tr></table></figure><p>准备 Docker 启动脚本</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 创建数据库和日志目录</span></span><br><span class="line"><span class="built_in">mkdir</span> data logs</span><br><span class="line"></span><br><span class="line"><span class="comment"># 确保目录和容器内进程的用户id一致。</span></span><br><span class="line"><span class="built_in">sudo</span> <span class="built_in">chown</span> -R 10001:10001 data logs</span><br><span class="line"></span><br><span class="line">docker run -d \</span><br><span class="line">  --name rustfs \</span><br><span class="line">  -p 127.0.0.1:9000:9000 \  </span><br><span class="line">  -p 127.0.0.1:9001:9001 \</span><br><span class="line">  -v ./data:/data \</span><br><span class="line">  -v ./logs:/logs \</span><br><span class="line">  --env-file .<span class="built_in">env</span> \</span><br><span class="line">  rustfs/rustfs:latest \</span><br><span class="line">  /data</span><br></pre></td></tr></table></figure><h2 id="nginx-配置"><a href="#nginx-配置" class="headerlink" title="nginx 配置"></a>nginx 配置</h2><h3 id="API-接口"><a href="#API-接口" class="headerlink" title="API 接口"></a>API 接口</h3><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br></pre></td><td class="code"><pre><span class="line"># rustfs Api endpoint</span><br><span class="line">server &#123;</span><br><span class="line">    listen 80;</span><br><span class="line">    listen 443 ssl;</span><br><span class="line">    server_name s3.example.com;</span><br><span class="line"></span><br><span class="line">    ssl_certificate         ssl/example.com.crt;</span><br><span class="line">    ssl_certificate_key     ssl/example.com.key;</span><br><span class="line">    ssl_protocols TLSv1.1 TLSv1.2 TLSv1.3;</span><br><span class="line">    ssl_ciphers EECDH+CHACHA20:EECDH+CHACHA20-draft:EECDH+AES128:RSA+AES128:EECDH+AES256:RSA+AES256:EECDH+3DES:RSA+3DES:!MD5;</span><br><span class="line">    ssl_prefer_server_ciphers on;</span><br><span class="line">    ssl_session_cache shared:SSL:10m;</span><br><span class="line">    ssl_session_timeout 10m;</span><br><span class="line">    error_page 497  https://$host$request_uri;</span><br><span class="line"></span><br><span class="line">   ignore_invalid_headers off;</span><br><span class="line">   client_max_body_size 0;</span><br><span class="line">   proxy_buffering off;</span><br><span class="line">   proxy_request_buffering off;</span><br><span class="line"></span><br><span class="line">    location / &#123;</span><br><span class="line">      proxy_set_header Host $http_host;</span><br><span class="line">      proxy_set_header X-Real-IP $remote_addr;</span><br><span class="line">      proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;</span><br><span class="line">      proxy_set_header X-Forwarded-Proto $scheme;</span><br><span class="line"></span><br><span class="line">      proxy_cache_convert_head off;</span><br><span class="line"></span><br><span class="line">      proxy_connect_timeout 300;</span><br><span class="line">      proxy_http_version 1.1;</span><br><span class="line">      proxy_set_header Connection &quot;&quot;;</span><br><span class="line">      chunked_transfer_encoding off;</span><br><span class="line"></span><br><span class="line">      proxy_set_header Upgrade $http_upgrade;</span><br><span class="line">      proxy_set_header Connection &quot;upgrade&quot;;</span><br><span class="line"></span><br><span class="line">      proxy_pass http://127.0.0.1:9000;</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h3 id="控制台页面"><a href="#控制台页面" class="headerlink" title="控制台页面"></a>控制台页面</h3><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br></pre></td><td class="code"><pre><span class="line"># rustfs Admin endpoint</span><br><span class="line">server &#123;</span><br><span class="line">    listen 80;</span><br><span class="line">    listen 443 ssl;</span><br><span class="line">    server_name s3-admin.example.com;</span><br><span class="line">    client_max_body_size 0;</span><br><span class="line"></span><br><span class="line">    ssl_certificate         ssl/example.com.crt;</span><br><span class="line">    ssl_certificate_key     ssl/example.com.key;</span><br><span class="line">    ssl_protocols TLSv1.1 TLSv1.2 TLSv1.3;</span><br><span class="line">    ssl_ciphers EECDH+CHACHA20:EECDH+CHACHA20-draft:EECDH+AES128:RSA+AES128:EECDH+AES256:RSA+AES256:EECDH+3DES:RSA+3DES:!MD5;</span><br><span class="line">    ssl_prefer_server_ciphers on;</span><br><span class="line">    ssl_session_cache shared:SSL:10m;</span><br><span class="line">    ssl_session_timeout 10m;</span><br><span class="line">    add_header Strict-Transport-Security &quot;max-age=31536000&quot;;</span><br><span class="line">    error_page 497  https://$host$request_uri;</span><br><span class="line"></span><br><span class="line">    # 双向认证配置，按需开启</span><br><span class="line">    # ssl_client_certificate ssl/ca.crt;       # 配置 CA 证书，用于验证客户端证书的签发者</span><br><span class="line">    # ssl_verify_client on;                    # 启用客户端证书验证</span><br><span class="line">    # ssl_crl ssl/crl.pem;                     # 配置 CRL 文件路径，用于检查吊销的证书</span><br><span class="line"></span><br><span class="line">    location / &#123;</span><br><span class="line">        proxy_set_header Host $http_host;</span><br><span class="line">        proxy_set_header X-Real-IP $remote_addr;</span><br><span class="line">        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;</span><br><span class="line">        proxy_set_header X-Forwarded-Proto $scheme;</span><br><span class="line">        proxy_pass http://127.0.0.1:9001;</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br><span class="line"></span><br></pre></td></tr></table></figure><h2 id="配置存储桶权限"><a href="#配置存储桶权限" class="headerlink" title="配置存储桶权限"></a>配置存储桶权限</h2><p>默认权限为私有，需要用 apikey 才可以上传与下载。</p><p>先到访问密钥里面创建一个 APIKey<br><img src="https://s3.babudiu.com/iuxt/public/nes.svg" data-lazy-src="https://s3.babudiu.com/iuxt/2026/07/1784040575_2e71cdad19e8453a9c7fc8c778f3bf29_clipboard.png" alt="image.png"></p><p>进入 存储桶 -&gt; 设置 点击访问策略 旁边的编辑</p><p><img src="https://s3.babudiu.com/iuxt/public/nes.svg" data-lazy-src="https://s3.babudiu.com/iuxt/2026/07/1784040851_ee24207ee7094b569a123b4fef24119f_clipboard.png" alt="image.png"></p><p>选择自定义策略，<code>私有写公有读</code> 的 策略内容为：</p><figure class="highlight json"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br></pre></td><td class="code"><pre><span class="line"><span class="punctuation">&#123;</span></span><br><span class="line">    <span class="attr">&quot;Version&quot;</span><span class="punctuation">:</span> <span class="string">&quot;2012-10-17&quot;</span><span class="punctuation">,</span></span><br><span class="line">    <span class="attr">&quot;Statement&quot;</span><span class="punctuation">:</span> <span class="punctuation">[</span></span><br><span class="line">        <span class="punctuation">&#123;</span></span><br><span class="line">            <span class="attr">&quot;Effect&quot;</span><span class="punctuation">:</span> <span class="string">&quot;Allow&quot;</span><span class="punctuation">,</span></span><br><span class="line">            <span class="attr">&quot;Principal&quot;</span><span class="punctuation">:</span> <span class="punctuation">&#123;</span></span><br><span class="line">                <span class="attr">&quot;AWS&quot;</span><span class="punctuation">:</span> <span class="punctuation">[</span></span><br><span class="line">                    <span class="string">&quot;*&quot;</span></span><br><span class="line">                <span class="punctuation">]</span></span><br><span class="line">            <span class="punctuation">&#125;</span><span class="punctuation">,</span></span><br><span class="line">            <span class="attr">&quot;Action&quot;</span><span class="punctuation">:</span> <span class="punctuation">[</span></span><br><span class="line">                <span class="string">&quot;s3:GetBucketLocation&quot;</span><span class="punctuation">,</span></span><br><span class="line">                <span class="string">&quot;s3:ListBucket&quot;</span></span><br><span class="line">            <span class="punctuation">]</span><span class="punctuation">,</span></span><br><span class="line">            <span class="attr">&quot;Resource&quot;</span><span class="punctuation">:</span> <span class="punctuation">[</span></span><br><span class="line">                <span class="string">&quot;arn:aws:s3:::mybucket&quot;</span></span><br><span class="line">            <span class="punctuation">]</span></span><br><span class="line">        <span class="punctuation">&#125;</span><span class="punctuation">,</span></span><br><span class="line">        <span class="punctuation">&#123;</span></span><br><span class="line">            <span class="attr">&quot;Effect&quot;</span><span class="punctuation">:</span> <span class="string">&quot;Allow&quot;</span><span class="punctuation">,</span></span><br><span class="line">            <span class="attr">&quot;Principal&quot;</span><span class="punctuation">:</span> <span class="punctuation">&#123;</span></span><br><span class="line">                <span class="attr">&quot;AWS&quot;</span><span class="punctuation">:</span> <span class="punctuation">[</span></span><br><span class="line">                    <span class="string">&quot;*&quot;</span></span><br><span class="line">                <span class="punctuation">]</span></span><br><span class="line">            <span class="punctuation">&#125;</span><span class="punctuation">,</span></span><br><span class="line">            <span class="attr">&quot;Action&quot;</span><span class="punctuation">:</span> <span class="punctuation">[</span></span><br><span class="line">                <span class="string">&quot;s3:GetObject&quot;</span></span><br><span class="line">            <span class="punctuation">]</span><span class="punctuation">,</span></span><br><span class="line">            <span class="attr">&quot;Resource&quot;</span><span class="punctuation">:</span> <span class="punctuation">[</span></span><br><span class="line">                <span class="string">&quot;arn:aws:s3:::mybucket/*&quot;</span></span><br><span class="line">            <span class="punctuation">]</span></span><br><span class="line">        <span class="punctuation">&#125;</span></span><br><span class="line">    <span class="punctuation">]</span></span><br><span class="line"><span class="punctuation">&#125;</span></span><br></pre></td></tr></table></figure><h2 id="使用-CURL-操作对象存储"><a href="#使用-CURL-操作对象存储" class="headerlink" title="使用 CURL 操作对象存储"></a>使用 CURL 操作对象存储</h2><p>curl 操作对象存储，或者测试对象存储权限等。可以参考<br><a href="/posts/ti62bh/">使用cURL命令管理对象存储(s3)</a></p>]]>
    </content>
    <id>https://zahui.fan/posts/ti662j/</id>
    <link href="https://zahui.fan/posts/ti662j/"/>
    <published>2026-07-14T14:39:55.000Z</published>
    <summary>
      <![CDATA[<h2 id="使用-Docker-部署"><a href="#使用-Docker-部署" class="headerlink" title="使用 Docker 部署"></a>使用 Docker 部署</h2><p>准备配置 <code>.env</code></p>
<figure class="highlight plaintext"><table><tr><td]]>
    </summary>
    <title>使用 RustFS 自建对象存储</title>
    <updated>2026-07-16T07:52:54.000Z</updated>
  </entry>
  <entry>
    <author>
      <name>张理坤</name>
    </author>
    <category term="工具" scheme="https://zahui.fan/categories/%E5%B7%A5%E5%85%B7/"/>
    <category term="对象存储" scheme="https://zahui.fan/tags/%E5%AF%B9%E8%B1%A1%E5%AD%98%E5%82%A8/"/>
    <category term="s3" scheme="https://zahui.fan/tags/s3/"/>
    <content>
      <![CDATA[<h2 id="公共存储桶（无须认证）"><a href="#公共存储桶（无须认证）" class="headerlink" title="公共存储桶（无须认证）"></a>公共存储桶（无须认证）</h2><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 上传文件</span></span><br><span class="line"><span class="comment"># test 为 bucket 名字</span></span><br><span class="line">curl -T <span class="string">&quot;./1.txt&quot;</span> https://s3.example.com/test/</span><br><span class="line"></span><br><span class="line"><span class="comment"># 下载文件</span></span><br><span class="line">curl -OL https://s3.example.com/test/1.txt</span><br></pre></td></tr></table></figure><h2 id="私有存储桶（需要认证）"><a href="#私有存储桶（需要认证）" class="headerlink" title="私有存储桶（需要认证）"></a>私有存储桶（需要认证）</h2><h3 id="上传文件"><a href="#上传文件" class="headerlink" title="上传文件"></a>上传文件</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#!/bin/bash</span></span><br><span class="line">ACCESS_KEY=<span class="string">&quot;minio_ACCESS_KEY&quot;</span></span><br><span class="line">SECRET_KEY=<span class="string">&quot;minio_SECRET_KEY&quot;</span></span><br><span class="line">BUCKET_NAME=<span class="string">&quot;test&quot;</span></span><br><span class="line">FILE_NAME=<span class="string">&quot;./1.txt&quot;</span></span><br><span class="line">OBJECT_NAME=<span class="string">&quot;1.txt&quot;</span></span><br><span class="line">MINIO_URL=<span class="string">&quot;s3.example.com&quot;</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># 生成签名</span></span><br><span class="line">DATE_VALUE=<span class="string">&quot;<span class="subst">$(date -R)</span>&quot;</span></span><br><span class="line">SIGNATURE=<span class="string">&quot;<span class="subst">$(echo -en <span class="string">&quot;PUT\n\n\n<span class="variable">$&#123;DATE_VALUE&#125;</span>\n/<span class="variable">$&#123;BUCKET_NAME&#125;</span>/<span class="variable">$&#123;OBJECT_NAME&#125;</span>&quot;</span> | openssl sha1 -hmac <span class="string">&quot;<span class="variable">$&#123;SECRET_KEY&#125;</span>&quot;</span> -binary | base64)</span>&quot;</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># 上传文件</span></span><br><span class="line">curl -X PUT --upload-file <span class="string">&quot;<span class="variable">$&#123;FILE_NAME&#125;</span>&quot;</span> \</span><br><span class="line">   --header <span class="string">&quot;Date: <span class="variable">$&#123;DATE_VALUE&#125;</span>&quot;</span> \</span><br><span class="line">   --header <span class="string">&quot;Authorization: AWS <span class="variable">$&#123;ACCESS_KEY&#125;</span>:<span class="variable">$&#123;SIGNATURE&#125;</span>&quot;</span> \</span><br><span class="line">   <span class="string">&quot;<span class="variable">$&#123;MINIO_URL&#125;</span>/<span class="variable">$&#123;BUCKET_NAME&#125;</span>/<span class="variable">$&#123;OBJECT_NAME&#125;</span>&quot;</span></span><br></pre></td></tr></table></figure><h3 id="下载文件"><a href="#下载文件" class="headerlink" title="下载文件"></a>下载文件</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#!/bin/bash</span></span><br><span class="line">ACCESS_KEY=<span class="string">&quot;minio_ACCESS_KEY&quot;</span></span><br><span class="line">SECRET_KEY=<span class="string">&quot;minio_SECRET_KEY&quot;</span></span><br><span class="line">BUCKET_NAME=<span class="string">&quot;test&quot;</span></span><br><span class="line">FILE_NAME=<span class="string">&quot;./1.txt&quot;</span></span><br><span class="line">OBJECT_NAME=<span class="string">&quot;1.txt&quot;</span></span><br><span class="line">MINIO_URL=<span class="string">&quot;s3.example.com&quot;</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># 生成签名</span></span><br><span class="line">DATE_VALUE=<span class="string">&quot;<span class="subst">$(date -R)</span>&quot;</span></span><br><span class="line">SIGNATURE=<span class="string">&quot;<span class="subst">$(echo -en <span class="string">&quot;GET\n\n\n<span class="variable">$&#123;DATE_VALUE&#125;</span>\n/<span class="variable">$&#123;BUCKET_NAME&#125;</span>/<span class="variable">$&#123;OBJECT_NAME&#125;</span>&quot;</span> | openssl sha1 -hmac <span class="string">&quot;<span class="variable">$&#123;SECRET_KEY&#125;</span>&quot;</span> -binary | base64)</span>&quot;</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># 上传文件</span></span><br><span class="line">curl -X GET -OL \</span><br><span class="line">   --header <span class="string">&quot;Date: <span class="variable">$&#123;DATE_VALUE&#125;</span>&quot;</span> \</span><br><span class="line">   --header <span class="string">&quot;Authorization: AWS <span class="variable">$&#123;ACCESS_KEY&#125;</span>:<span class="variable">$&#123;SIGNATURE&#125;</span>&quot;</span> \</span><br><span class="line">   <span class="string">&quot;<span class="variable">$&#123;MINIO_URL&#125;</span>/<span class="variable">$&#123;BUCKET_NAME&#125;</span>/<span class="variable">$&#123;OBJECT_NAME&#125;</span>&quot;</span></span><br></pre></td></tr></table></figure>]]>
    </content>
    <id>https://zahui.fan/posts/ti62bh/</id>
    <link href="https://zahui.fan/posts/ti62bh/"/>
    <published>2026-07-14T13:18:53.000Z</published>
    <summary>
      <![CDATA[<h2 id="公共存储桶（无须认证）"><a href="#公共存储桶（无须认证）" class="headerlink" title="公共存储桶（无须认证）"></a>公共存储桶（无须认证）</h2><figure class="highlight bash"><table><tr><td class="gutter"><pre><span]]>
    </summary>
    <title>使用cURL命令管理对象存储(s3)</title>
    <updated>2026-07-25T15:05:21.000Z</updated>
  </entry>
  <entry>
    <author>
      <name>张理坤</name>
    </author>
    <category term="AI" scheme="https://zahui.fan/categories/AI/"/>
    <content>
      <![CDATA[<p>这个文件可以让 AI 自己生成，所有 AI Agent 都会读取。<br>claude.md 只有 claude code 这个 agent 可以读取。</p>]]>
    </content>
    <id>https://zahui.fan/posts/ti5kjj/</id>
    <link href="https://zahui.fan/posts/ti5kjj/"/>
    <published>2026-07-14T06:54:55.000Z</published>
    <summary>
      <![CDATA[<p>这个文件可以让 AI 自己生成，所有 AI Agent 都会读取。<br>claude.md 只有 claude code 这个 agent]]>
    </summary>
    <title>AGENTS.md</title>
    <updated>2026-07-14T07:21:25.000Z</updated>
  </entry>
  <entry>
    <author>
      <name>张理坤</name>
    </author>
    <category term="监控" scheme="https://zahui.fan/categories/%E7%9B%91%E6%8E%A7/"/>
    <content>
      <![CDATA[<p>之前的写法：把 pod ip 写入配置文件。如：</p><figure class="highlight yml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br></pre></td><td class="code"><pre><span class="line"></span><br><span class="line"><span class="bullet">-</span> <span class="attr">job_name:</span> <span class="string">&#x27;service-endpoints-metrics&#x27;</span></span><br><span class="line">  <span class="attr">kubernetes_sd_configs:</span></span><br><span class="line">  <span class="bullet">-</span> <span class="attr">role:</span> <span class="string">endpoints</span></span><br><span class="line">  <span class="attr">metrics_path:</span> <span class="string">/actuator/prometheus</span></span><br><span class="line">  <span class="attr">static_configs:</span></span><br><span class="line">  <span class="bullet">-</span> <span class="attr">targets:</span> [<span class="string">&#x27;172.20.87.93:8088&#x27;</span>]</span><br><span class="line">    <span class="attr">labels:</span> </span><br><span class="line">      <span class="attr">app:</span> <span class="string">idk-sdk</span></span><br><span class="line">  <span class="bullet">-</span> <span class="attr">targets:</span> [<span class="string">&#x27;172.20.232.20:8088&#x27;</span>]</span><br><span class="line">    <span class="attr">labels:</span> </span><br><span class="line">      <span class="attr">app:</span> <span class="string">idk-sdk</span></span><br><span class="line">  <span class="bullet">-</span> <span class="attr">targets:</span> [<span class="string">&#x27;172.20.87.192:8088&#x27;</span>]</span><br><span class="line">    <span class="attr">labels:</span> </span><br><span class="line">      <span class="attr">app:</span> <span class="string">idk-sdk</span></span><br><span class="line">  <span class="bullet">-</span> <span class="attr">targets:</span> [<span class="string">&#x27;172.20.86.26:8088&#x27;</span>]</span><br><span class="line">    <span class="attr">labels:</span> </span><br><span class="line">      <span class="attr">app:</span> <span class="string">idk-sdk</span></span><br><span class="line">  <span class="bullet">-</span> <span class="attr">targets:</span> [<span class="string">&#x27;172.20.60.87:8088&#x27;</span>]</span><br><span class="line">    <span class="attr">labels:</span> </span><br><span class="line">      <span class="attr">app:</span> <span class="string">idk-sdk</span></span><br><span class="line">  <span class="bullet">-</span> <span class="attr">targets:</span> [<span class="string">&#x27;172.20.22.247:8088&#x27;</span>]</span><br><span class="line">    <span class="attr">labels:</span> </span><br><span class="line">      <span class="attr">app:</span> <span class="string">idk-sdk</span></span><br><span class="line">  <span class="bullet">-</span> <span class="attr">targets:</span> [<span class="string">&#x27;172.20.83.23:8088&#x27;</span>]</span><br><span class="line">    <span class="attr">labels:</span> </span><br><span class="line">      <span class="attr">app:</span> <span class="string">idk-tsp</span></span><br><span class="line">  <span class="bullet">-</span> <span class="attr">targets:</span> [<span class="string">&#x27;172.20.22.165:8088&#x27;</span>]</span><br><span class="line">    <span class="attr">labels:</span> </span><br><span class="line">      <span class="attr">app:</span> <span class="string">idk-tsp</span></span><br><span class="line">  <span class="bullet">-</span> <span class="attr">targets:</span> [<span class="string">&#x27;172.20.63.105:8088&#x27;</span>]</span><br><span class="line">    <span class="attr">labels:</span> </span><br><span class="line">      <span class="attr">app:</span> <span class="string">idk-tsp</span></span><br><span class="line">  <span class="bullet">-</span> <span class="attr">targets:</span> [<span class="string">&#x27;idk-mob-app:8088&#x27;</span>]</span><br><span class="line">    <span class="attr">labels:</span> </span><br><span class="line">      <span class="attr">app:</span> <span class="string">idk-app</span></span><br></pre></td></tr></table></figure><p>痛点分析：</p><p>在 Kubernetes 中，直接使用 Pod IP 进行监控存在明显的局限性：一旦 Pod 发生重新部署或被节点驱逐，Pod IP 就会发生漂移，导致监控端必须频繁手动更新目标 IP。</p><p>如果转而使用 Service 地址进行监控，在单副本（Single Pod）情况下尚可正常工作；但若处于多副本（Multiple Pods）场景下，Service 自带的负载均衡（轮询机制）会导致每次监控指标抓取（Scrape）流量被随机分发到不同的 Pod 上。这不仅会导致时序数据出现剧烈的指标跳变（Data Fluctuation），还会引发 Counter（计数器）等类型的数据因无法正确累加而产生成倍的统计偏差（而正常的业务预期应当是获取所有 Pod 的数据总和）。</p><p>如果你的 kubeconfig 只有某个命名空间的权限，则需要指定命名空间，不然会因为权限被拒绝无法继续执行下去。</p><figure class="highlight yml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br></pre></td><td class="code"><pre><span class="line"><span class="bullet">-</span> <span class="attr">job_name:</span> <span class="string">&#x27;vos-metrics&#x27;</span></span><br><span class="line">  <span class="attr">metrics_path:</span> <span class="string">&#x27;/actuator/prometheus&#x27;</span></span><br><span class="line">  <span class="attr">kubernetes_sd_configs:</span></span><br><span class="line">  <span class="bullet">-</span> <span class="attr">role:</span> <span class="string">endpoints</span></span><br><span class="line">    <span class="attr">kubeconfig_file:</span> <span class="string">/app/kube-config</span></span><br><span class="line">    <span class="attr">namespaces:</span></span><br><span class="line">      <span class="attr">names:</span></span><br><span class="line">        <span class="bullet">-</span> <span class="string">llll</span></span><br><span class="line">  <span class="attr">relabel_configs:</span></span><br><span class="line">  <span class="comment"># - source_labels: [__meta_kubernetes_service_name]</span></span><br><span class="line">  <span class="comment">#   regex: &#x27;idk-mob-sdk-svc|idk-tsp-svc|idk-mob-app&#x27;</span></span><br><span class="line">  <span class="comment">#   action: keep</span></span><br><span class="line">  <span class="comment"># 添加自定义标签</span></span><br><span class="line">  <span class="bullet">-</span> <span class="attr">source_labels:</span> [<span class="string">__meta_kubernetes_service_name</span>]</span><br><span class="line">    <span class="attr">target_label:</span> <span class="string">app111</span></span><br><span class="line">  <span class="bullet">-</span> <span class="attr">source_labels:</span> [<span class="string">__meta_kubernetes_pod_ip</span>]</span><br><span class="line">    <span class="attr">target_label:</span> <span class="string">instance</span></span><br><span class="line"></span><br></pre></td></tr></table></figure><p>这样就算没有所有权限也可以进行抓取到 service endpoint metrics 了</p>]]>
    </content>
    <id>https://zahui.fan/posts/thutro/</id>
    <link href="https://zahui.fan/posts/thutro/"/>
    <published>2026-07-08T11:40:36.000Z</published>
    <summary>
      <![CDATA[<p>之前的写法：把 pod ip 写入配置文件。如：</p>
<figure class="highlight yml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span]]>
    </summary>
    <title>Prometheus使用kubeconfig做k8s的service 自动发现监控</title>
    <updated>2026-07-14T10:54:45.000Z</updated>
  </entry>
  <entry>
    <author>
      <name>张理坤</name>
    </author>
    <category term="Windows" scheme="https://zahui.fan/categories/Windows/"/>
    <category term="镜像" scheme="https://zahui.fan/tags/%E9%95%9C%E5%83%8F/"/>
    <content>
      <![CDATA[<ol><li>从 iso 文件中提取出 install.wim 文件</li><li>dism 解压 wim 文件到一个干净的 ntfs 分区或文件夹里</li></ol><p>查看 wim 的 index id</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">dism /Get-ImageInfo /ImageFile:&quot;C:\Users\iuxt\Desktop\install.wim&quot;</span><br></pre></td></tr></table></figure><p>挂载镜像到一个空目录</p><figure class="highlight bat"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line">dism /Mount-Wim /WimFile:&quot;C:\Users\iuxt\Desktop\install.wim&quot; /Index:<span class="number">1</span> /MountDir:&quot;F:\tmp&quot;</span><br><span class="line"></span><br><span class="line"># 保存并应用更新</span><br><span class="line">dism /Unmount-Wim /MountDir:&quot;F:\tmp&quot; /Commit</span><br><span class="line"></span><br><span class="line"># 不保存，并放弃，主要是为了删除 F:\tmp 里面的文件。</span><br><span class="line">dism /Unmount-Wim /MountDir:&quot;F:\tmp&quot; /Discard</span><br></pre></td></tr></table></figure><p>安装 Windows 更新补丁</p><figure class="highlight bat"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"># 有ssu的可能需要安装多次。</span><br><span class="line">dism /Image:&quot;F:\tmp&quot; /Add-Package /PackagePath:&quot;F:\build_ltsc\LTSC 更新包\windows10.<span class="number">0</span>-kb5017308-x64_2027053968a06948b45d139d95475ab4feee5654.msu&quot;</span><br><span class="line"></span><br><span class="line">dism /Image:&quot;F:\tmp&quot; /Get-Packages</span><br><span class="line"></span><br></pre></td></tr></table></figure><p>⚠️ 如果忘记执行 &#x2F;Commit，所有更改都会丢失。如果只想丢弃更改并卸载，则使用 &#x2F;Discard 替代 &#x2F;Commit。</p><p>清理冗余更新</p><figure class="highlight bat"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"># 分析空间</span><br><span class="line">Dism /Image:&quot;F:\tmp&quot; /Cleanup-Image /AnalyzeComponentStore</span><br><span class="line"></span><br><span class="line"># 清理冗余更新的核心是使用 DISM /Cleanup-Image 命令。这个操作主要针对 WinSxS 文件夹，它会移除那些被新补丁替换掉的旧版本文件，从而为镜像“减负</span><br><span class="line">Dism /Image:&quot;F:\tmp&quot; /Cleanup-Image /StartComponentCleanup /ResetBase</span><br></pre></td></tr></table></figure><p>安装 winappx 软件包</p><figure class="highlight bat"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line"># 带许可证</span><br><span class="line">Dism /Image:&quot;F:\tmp&quot; /Add-ProvisionedAppxPackage /PackagePath:&quot;C:\Appx\MyApp.appx&quot; /DependencyPackagePath:&quot;C:\Appx\Microsoft.VCLibs.x64.<span class="number">14</span>.<span class="number">00</span>.appx&quot; /LicensePath:&quot;C:\Appx\License.xml&quot; /Region:all</span><br><span class="line"></span><br><span class="line"># 不带许可证</span><br><span class="line">Dism /Image:&quot;F:\tmp&quot; /Add-ProvisionedAppxPackage /PackagePath:&quot;F:\build_ltsc\Microsoft.HEVCVideoExtension_2.<span class="number">4</span>.<span class="number">45</span>.<span class="number">0</span>_neutral_~_8wekyb3d8bbwe.AppxBundle&quot; /SkipLicense /Region:all</span><br><span class="line"></span><br><span class="line"># 查看安装了哪些appx</span><br><span class="line">Dism /Image:&quot;F:\tmp&quot; /Get-ProvisionedAppxPackages</span><br><span class="line"></span><br></pre></td></tr></table></figure><p>其他常用命令</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br></pre></td><td class="code"><pre><span class="line">dism /Get-MountedWimInfo</span><br><span class="line"></span><br><span class="line">里面还显示有挂载项。</span><br><span class="line"></span><br><span class="line">这时候通常要修复清理：</span><br><span class="line"></span><br><span class="line">dism /Cleanup-Wim</span><br><span class="line"></span><br><span class="line">或者先看挂载状态：</span><br><span class="line"></span><br><span class="line">dism /Get-MountedWimInfo</span><br><span class="line"></span><br><span class="line">正确流程一般是：</span><br><span class="line"></span><br><span class="line">dism /Get-MountedWimInfo</span><br><span class="line"></span><br><span class="line">如果确认 F:\tmp 是挂载目录，并且不想保留修改：</span><br><span class="line"></span><br><span class="line">dism /Unmount-Wim /MountDir:&quot;F:\tmp&quot; /Discard</span><br><span class="line"></span><br><span class="line">卸载成功后，再删除空目录：</span><br><span class="line"></span><br><span class="line">rmdir &quot;F:\tmp&quot;</span><br></pre></td></tr></table></figure><p>制作成 iso 镜像</p><figure class="highlight bat"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line">robocopy.exe &quot;D:&quot; &quot;F:\iso_tmp&quot; /MIR /<span class="built_in">COPY</span>:DAT /DCOPY:DAT /R:<span class="number">2</span> /W:<span class="number">2</span></span><br><span class="line"></span><br><span class="line"><span class="built_in">del</span> /f /q &quot;F:\iso_tmp\sources\install.wim&quot;</span><br><span class="line"></span><br><span class="line"><span class="built_in">copy</span> /y &quot;C:\Users\iuxt\Desktop\install.wim&quot; &quot;F:\iso_tmp\sources\install.wim&quot;</span><br><span class="line"></span><br><span class="line">&quot;C:\Program Files (x86)\Windows Kits\<span class="number">10</span>\Assessment and Deployment Kit\Deployment Tools\amd64\Oscdimg\oscdimg.exe&quot; -m -o -u2 -udfver102 -lLTSC_CUSTOM -bootdata:<span class="number">2</span>#p0,e,b&quot;F:\iso_tmp\boot\etfsboot.com&quot;#pEF,e,b&quot;F:\iso_tmp\efi\microsoft\boot\efisys.bin&quot; &quot;F:\iso_tmp&quot; &quot;F:\LTSC_X64_final_media.iso&quot;</span><br><span class="line"></span><br></pre></td></tr></table></figure>]]>
    </content>
    <id>https://zahui.fan/posts/thsf58/</id>
    <link href="https://zahui.fan/posts/thsf58/"/>
    <published>2026-07-07T04:29:31.000Z</published>
    <summary>
      <![CDATA[<ol>
<li>从 iso 文件中提取出 install.wim 文件</li>
<li>dism 解压 wim 文件到一个干净的 ntfs 分区或文件夹里</li>
</ol>
<p>查看 wim 的 index id</p>
<figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span]]>
    </summary>
    <title>定制Windows系统镜像iso</title>
    <updated>2026-07-25T15:08:33.000Z</updated>
  </entry>
  <entry>
    <author>
      <name>张理坤</name>
    </author>
    <category term="Macintosh" scheme="https://zahui.fan/categories/Macintosh/"/>
    <content>
      <![CDATA[<h2 id="简介"><a href="#简介" class="headerlink" title="简介"></a>简介</h2><p><a href="https://github.com/create-dmg/create-dmg">create-dmg</a> 是一个用来创建磁盘镜像文件（dmg）的 shell 脚本命令行工具。本文将介绍如何使用 <code>create-dmg</code> 来创建一个 dmg 磁盘镜像文件，即 macOS 系统的安装包。</p><h2 id="准备工作"><a href="#准备工作" class="headerlink" title="准备工作"></a>准备工作</h2><p><strong>create-dmg</strong> 可以通过 <code>Homebrew</code> 来安装，使用以下命令安装 <code>create-dmg</code> ：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">brew install create-dmg</span><br></pre></td></tr></table></figure><h2 id="创建-DMG-文件"><a href="#创建-DMG-文件" class="headerlink" title="创建 DMG 文件"></a>创建 DMG 文件</h2><p>在创建 dmg 文件之前，确保你的应用程序已经打包好，并且所有的资源文件都已经放置在正确的位置。通常为 <code>xxx.app</code> 的 bundle 形式文件。</p><p>创建一个文件夹，将你的应用程序拖放进去。这个文件夹将作为 dmg 文件的根目录。这里以 <code>dmg-demo</code> 作为目录为例：</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">dmg-demo</span><br><span class="line">├── QtProjectDemo.app</span><br><span class="line">├── bg.svg</span><br></pre></td></tr></table></figure><p>只需要额外提供一张背景图即可。当然也可再提供一个 <code>icns</code> 图标文件作为磁盘镜像文件的图标（双击 dmg 后，桌面显示的磁盘镜像图标）</p><p>如图，上面为默认的磁盘镜像图标，下图为自行替换的图标：</p><p><img src="https://s3.babudiu.com/iuxt/public/nes.svg" data-lazy-src="https://s3.babudiu.com/iuxt/2026/07/1783389423_0ef5172541c9469e9e2a12ebaf31e237_clipboard.png" alt="image.png|142"></p><p>在应用程序文件夹所在的目录打开终端。然后运行以下命令：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br></pre></td><td class="code"><pre><span class="line">create-dmg \</span><br><span class="line">  --volname <span class="string">&quot;Application Installer&quot;</span> \</span><br><span class="line">  --background <span class="string">&quot;bg.svg&quot;</span> \</span><br><span class="line">  --window-pos 400 200 \</span><br><span class="line">  --window-size 660 400 \</span><br><span class="line">  --icon-size 100 \</span><br><span class="line">  --icon <span class="string">&quot;QtProjectDemo.app&quot;</span> 160 185 \</span><br><span class="line">  --hide-extension <span class="string">&quot;QtProjectDemo.app&quot;</span> \</span><br><span class="line">  --app-drop-link 500 185 \</span><br><span class="line">  <span class="string">&quot;Installer.dmg&quot;</span> \</span><br><span class="line">  <span class="string">&quot;QtProjectDemo.app/&quot;</span></span><br></pre></td></tr></table></figure><p>这个命令中包含了多个参数：</p><ul><li><code>--volname</code> ：设置卷的名称。</li><li><code>--background</code> ：设置窗口的背景图。</li><li><code>--window-pos</code> ：设置双击 dmg，打开窗口的位置坐标。</li><li><code>--window-size</code> ：设置窗口的大小。</li><li><code>--icon-size</code> ：设置应用程序图标的大小。</li><li><code>--icon</code> ：设置应用程序的图标和位置坐标。</li><li><code>--hide-extension</code> ：隐藏应用程序文件的扩展名。</li><li>最后两个参数分别是输出的 dmg 文件名和包含应用程序的文件夹名称。</li></ul><p>输出信息：</p><p>bash 复制代码</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br></pre></td><td class="code"><pre><span class="line">Creating disk image...</span><br><span class="line">..................................................................................................</span><br><span class="line">created: /Users/leo/Downloads/dmg-demo/rw.74691.Installer.dmg</span><br><span class="line">Mounting disk image...</span><br><span class="line">Device name:     /dev/disk5</span><br><span class="line">Searching <span class="keyword">for</span> mounted interstitial disk image using /dev/disk5s...</span><br><span class="line">Mount <span class="built_in">dir</span>:       /Volumes/dmg.kaLqeq</span><br><span class="line">Copying background file <span class="string">&#x27;bg.svg&#x27;</span>...</span><br><span class="line">Making <span class="built_in">link</span> to Applications <span class="built_in">dir</span>...</span><br><span class="line">/Volumes/dmg.kaLqeq</span><br><span class="line">Running AppleScript to make Finder stuff pretty: /usr/bin/osascript <span class="string">&quot;/var/folders/mn/vvr3gxpn7b38rlkyfl_j5m2h0000gn/T/createdmg.tmp.XXXXXXXXXX.SfFuKvgIMf&quot;</span> <span class="string">&quot;dmg.kaLqeq&quot;</span></span><br><span class="line">waited 1 seconds <span class="keyword">for</span> .DS_STORE to be created.</span><br><span class="line">Done running the AppleScript...</span><br><span class="line">Fixing permissions...</span><br><span class="line">Done fixing permissions</span><br><span class="line">Skipping blessing on sandbox</span><br><span class="line">Deleting .fseventsd</span><br><span class="line">Unmounting disk image...</span><br><span class="line"><span class="string">&quot;disk5&quot;</span> ejected.</span><br><span class="line">Compressing disk image...</span><br><span class="line">正在准备映像引擎...</span><br><span class="line">正在读取Protective Master Boot Record（MBR：0）...</span><br><span class="line">   (CRC32 <span class="variable">$0821720F</span>：Protective Master Boot Record（MBR：0）)</span><br><span class="line">正在读取GPT Header（Primary GPT Header：1）...</span><br><span class="line">   (CRC32 <span class="variable">$2718773B</span>：GPT Header（Primary GPT Header：1）)</span><br><span class="line">正在读取GPT Partition Data（Primary GPT Table：2）...</span><br><span class="line">   (CRC32 <span class="variable">$D08A2D56</span>：GPT Partition Data（Primary GPT Table：2）)</span><br><span class="line">正在读取（Apple_Free：3）...</span><br><span class="line">   (CRC32 <span class="variable">$00000000</span>：（Apple_Free：3）)</span><br><span class="line">正在读取disk image（Apple_HFS：4）...</span><br><span class="line">.........................................................................................................................</span><br><span class="line">   (CRC32 <span class="variable">$FC0F7A84</span>：disk image（Apple_HFS：4）)</span><br><span class="line">正在读取（Apple_Free：5）...</span><br><span class="line">.........................................................................................................................</span><br><span class="line">   (CRC32 <span class="variable">$00000000</span>：（Apple_Free：5）)</span><br><span class="line">正在读取GPT Partition Data（Backup GPT Table：6）...</span><br><span class="line">.........................................................................................................................</span><br><span class="line">   (CRC32 <span class="variable">$D08A2D56</span>：GPT Partition Data（Backup GPT Table：6）)</span><br><span class="line">正在读取GPT Header（Backup GPT Header：7）...</span><br><span class="line">.........................................................................................................................</span><br><span class="line">   (CRC32 <span class="variable">$E02061DB</span>：GPT Header（Backup GPT Header：7）)</span><br><span class="line">正在添加资源...</span><br><span class="line">.........................................................................................................................</span><br><span class="line">已耗时： 3.355s</span><br><span class="line">文件大小：31846419字节，校验和：CRC32 <span class="variable">$7457A18C</span></span><br><span class="line">已处理扇区：213072，已压缩158148</span><br><span class="line">速度：23.0MB/秒</span><br><span class="line">节省：70.8%</span><br><span class="line">created: /Users/leo/Downloads/dmg-demo/Installer.dmg</span><br><span class="line">hdiutil does not support internet-enable. Note it was removed <span class="keyword">in</span> macOS 10.15.</span><br><span class="line">Disk image <span class="keyword">done</span></span><br></pre></td></tr></table></figure><p>创建完成后，双击 dmg 文件，检查它是否按照预期显示和工作。</p><p><img src="https://s3.babudiu.com/iuxt/public/nes.svg" data-lazy-src="https://s3.babudiu.com/iuxt/2026/07/1783043128_4b1b5699192a4af382ffd6bb996b2f24_clipboard.png" alt="image.png|607"></p><p>这里指定了宽度 660 px 和高度 400 px 的窗口大小，是整个窗口（包含标题栏），而标题栏本身会占有 30 px 的高度，也就是实际上的区域只有 (660，370)，这就导致，如果你要想要图标都居中，那么图标的的中心坐标位置将是 (x, 370&#x2F;2)。</p><p>背景图的制作也是，中间的▶️图标如果要中心居中，那么实际上需要向上偏移 30 px 高度，才会居中。</p><p>另外，虽然 create-dmg 文档说支持 png、gif、jpg，但实测还支持 SVG、tiff 格式。</p><h2 id="总结"><a href="#总结" class="headerlink" title="总结"></a>总结</h2><p>通过使用 <code>create-dmg</code> ，你可以为你的 Mac 应用程序创建 DMG 磁盘镜像文件，同时也能方便地集成到 CI&#x2F;CD 流程中。</p><h2 id="附录"><a href="#附录" class="headerlink" title="附录"></a>附录</h2><p><code>create-dmg</code> 用法：</p><p>xml 复制代码</p><figure class="highlight xml"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">create-dmg [options ...] <span class="tag">&lt;<span class="name">output_name.dmg</span>&gt;</span> <span class="tag">&lt;<span class="name">source_folder</span>&gt;</span></span><br></pre></td></tr></table></figure><p>参数选项：</p><ul><li><code>--volname &lt;name&gt;</code> ：设置卷标名称（在 Finder 侧边栏和窗口标题中显示）</li><li><code>--volicon &lt;icon.icns&gt;</code> ：设置卷标图标</li><li><code>--background &lt;pic.png&gt;</code> ：设置文件夹背景图像（提供 png、gif、jpg 格式）</li><li><code>--window-pos &lt;x&gt; &lt;y&gt;</code> ：设置文件夹窗口的位置</li><li><code>--window-size &lt;width&gt; &lt;height&gt;</code> ：设置文件夹窗口的大小</li><li><code>--text-size &lt;text_size&gt;</code> ：设置窗口文本大小（10-16）</li><li><code>--icon-size &lt;icon_size&gt;</code> ：设置窗口图标大小（最大 128）</li><li><code>--icon &lt;file_name&gt; &lt;x&gt; &lt;y&gt;</code> ：设置文件图标的位置</li><li><code>--hide-extension &lt;file_name&gt;</code> ：隐藏文件的扩展名</li><li><code>--app-drop-link &lt;x&gt; &lt;y&gt;</code> ：在位置 x, y 创建一个指向应用程序的快捷链接</li><li><code>--ql-drop-link &lt;x&gt; &lt;y&gt;</code> ：在位置 x, y 创建一个指向 <code>/Library/QuickLook</code> 的快捷链接</li><li><code>--eula &lt;eula_file&gt;</code> ：附加一个许可协议文件到 dmg</li><li><code>--rez &lt;rez_path&gt;</code> ：指定包含许可协议文件的 Rez 工具的自定义路径</li><li><code>--no-internet-enable</code> ：禁用自动挂载和复制</li><li><code>--format</code> ：指定最终图像格式（UDZO|UDBZ|ULFO|ULMO）（默认为 UDZO）</li><li><code>--filesystem</code> ：指定图像文件系统（HFS+|APFS）（默认为 HFS+，APFS 支持 macOS 10.13 或更新版本）</li><li><code>--encrypt</code> ：启用结果磁盘镜像的加密（AES-256 - 将提示输入密码）</li><li><code>--encrypt-aes128</code> ：启用结果磁盘镜像的加密（AES-128 - 将提示输入密码）</li><li><code>--add-file &lt;target_name&gt; &lt;file|folder&gt; &lt;x&gt; &lt;y&gt;</code> ：添加额外的文件或文件夹（可多次使用）</li><li><code>--disk-image-size &lt;x&gt;</code> ：手动设置磁盘镜像大小为 x MB</li><li><code>--hdiutil-verbose</code> ：以详细模式执行 hdiutil</li><li><code>--hdiutil-quiet</code> ：以安静模式执行 hdiutil</li><li><code>--codesign &lt;signature&gt;</code> ：使用指定的签名对磁盘镜像进行代码签名</li><li><code>--notarize &lt;credentials&gt;</code> ：使用存储在钥匙串中的凭据对磁盘镜像进行签名（等待并装订）。更多信息请查看 <a href="https://link.juejin.cn/?target=https://developer.apple.com/documentation/security/notarizing_macos_software_before_distribution/customizing_the_notarization_workflow" title="https:&#x2F;&#x2F;developer.apple.com&#x2F;documentation&#x2F;security&#x2F;notarizing_macos_software_before_distribution&#x2F;customizing_the_notarization_workflow">Apple的文档</a></li><li><code>--skip-jenkins</code> ：跳过 Finder 美化 AppleScript，适用于沙盒和非 GUI 环境</li><li><code>--sandbox-safe</code> ：与沙盒兼容的 hdiutil，不祝福也不执行 AppleScript（不支持 APFS 磁盘镜像）</li><li><code>--version</code> ：显示工具版本号</li><li><code>-h, --help</code> ：显示帮助</li></ul>]]>
    </content>
    <id>https://zahui.fan/posts/ths8mr/</id>
    <link href="https://zahui.fan/posts/ths8mr/"/>
    <published>2026-07-07T02:08:51.000Z</published>
    <summary>
      <![CDATA[<h2 id="简介"><a href="#简介" class="headerlink" title="简介"></a>简介</h2><p><a href="https://github.com/create-dmg/create-dmg">create-dmg</a> 是一个用来创建磁盘镜像文件（dmg）的 shell 脚本命令行工具。本文将介绍如何使用]]>
    </summary>
    <title>使用create-dmg工具制作dmg安装包</title>
    <updated>2026-07-07T02:08:52.000Z</updated>
  </entry>
  <entry>
    <author>
      <name>张理坤</name>
    </author>
    <category term="AI" scheme="https://zahui.fan/categories/AI/"/>
    <content>
      <![CDATA[<h2 id="安装"><a href="#安装" class="headerlink" title="安装"></a>安装</h2><p><a href="https://github.com/obra/superpowers">https://github.com/obra/superpowers</a></p><p>按照教程安装</p><h2 id="使用"><a href="#使用" class="headerlink" title="使用"></a>使用</h2><p><code>/brainstorming</code><br>进行头脑风暴</p><p>回答问题后，会生成 md 文件的设计文档，然后它会根据这个设计文档来写实现步骤，最后根据步骤来一一实现。</p>]]>
    </content>
    <id>https://zahui.fan/posts/tgipzz/</id>
    <link href="https://zahui.fan/posts/tgipzz/"/>
    <published>2026-06-12T12:14:23.000Z</published>
    <summary>
      <![CDATA[<h2 id="安装"><a href="#安装" class="headerlink" title="安装"></a>安装</h2><p><a href="https://github.com/obra/superpowers">https://github.com/obra/superpowers</a></p>
<p>按照教程安装</p>
<h2 id="使用"><a href="#使用"]]>
    </summary>
    <title>superpowers</title>
    <updated>2026-06-17T14:07:32.000Z</updated>
  </entry>
  <entry>
    <author>
      <name>张理坤</name>
    </author>
    <category term="基础运维" scheme="https://zahui.fan/categories/%E5%9F%BA%E7%A1%80%E8%BF%90%E7%BB%B4/"/>
    <category term="镜像" scheme="https://zahui.fan/tags/%E9%95%9C%E5%83%8F/"/>
    <category term="开源软件" scheme="https://zahui.fan/tags/%E5%BC%80%E6%BA%90%E8%BD%AF%E4%BB%B6/"/>
    <category term="仓库" scheme="https://zahui.fan/tags/%E4%BB%93%E5%BA%93/"/>
    <content>
      <![CDATA[<p><a href="https://www.sonatype.com/products/nexus-community-edition-download">https://www.sonatype.com/products/nexus-community-edition-download</a></p><p><img src="https://s3.babudiu.com/iuxt/public/nes.svg" data-lazy-src="https://s3.babudiu.com/iuxt/2026/06/1781004701_571c763237ba4119bbdf035ebf3f67a9_clipboard.png" alt="image.png"></p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 在服务器上解压</span></span><br><span class="line">tar xf nexus-3.90.1-01-linux-x86_64.tar.gz</span><br><span class="line"></span><br><span class="line"><span class="comment"># 修改默认的jvm参数</span></span><br><span class="line">vim bin/nexus.vmoptions</span><br><span class="line"></span><br><span class="line"><span class="comment"># 启动</span></span><br><span class="line">./bin/nexus start</span><br><span class="line"></span><br><span class="line"><span class="comment"># 停止</span></span><br><span class="line">./bin/nexus stop</span><br><span class="line"></span><br><span class="line">打开 ip:8081 端口</span><br></pre></td></tr></table></figure><p><img src="https://s3.babudiu.com/iuxt/public/nes.svg" data-lazy-src="https://s3.babudiu.com/iuxt/2026/06/1781004672_0bfbafe08b004920aad441533a7f05c9_clipboard.png" alt="image.png"></p><p>配置域名与 SSL 证书， 我用的是 Kubernetes 的 ingress 做的反代（为了统一维护 ssl 证书），也可以使用 nginx 来做反代。</p><figure class="highlight yaml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br></pre></td><td class="code"><pre><span class="line"><span class="attr">kind:</span> <span class="string">Endpoints</span></span><br><span class="line"><span class="attr">apiVersion:</span> <span class="string">v1</span></span><br><span class="line"><span class="attr">metadata:</span></span><br><span class="line">  <span class="attr">name:</span> <span class="string">npm-ai</span></span><br><span class="line">  <span class="attr">namespace:</span> <span class="string">ops</span></span><br><span class="line"><span class="attr">subsets:</span></span><br><span class="line">  <span class="bullet">-</span> <span class="attr">addresses:</span></span><br><span class="line">      <span class="bullet">-</span> <span class="attr">ip:</span> <span class="number">10.219</span><span class="number">.20</span><span class="number">.113</span></span><br><span class="line">    <span class="attr">ports:</span></span><br><span class="line">      <span class="bullet">-</span> <span class="attr">name:</span> <span class="string">npm-ai</span></span><br><span class="line">        <span class="attr">port:</span> <span class="number">8081</span></span><br><span class="line">        <span class="attr">protocol:</span> <span class="string">TCP</span></span><br><span class="line"></span><br><span class="line"><span class="meta">---</span></span><br><span class="line"><span class="meta"></span></span><br><span class="line"><span class="attr">kind:</span> <span class="string">Service</span></span><br><span class="line"><span class="attr">apiVersion:</span> <span class="string">v1</span></span><br><span class="line"><span class="attr">metadata:</span></span><br><span class="line">  <span class="attr">name:</span> <span class="string">npm-ai</span></span><br><span class="line">  <span class="attr">namespace:</span> <span class="string">ops</span></span><br><span class="line"><span class="attr">spec:</span></span><br><span class="line">  <span class="attr">ports:</span></span><br><span class="line">    <span class="bullet">-</span> <span class="attr">name:</span> <span class="string">npm-ai</span></span><br><span class="line">      <span class="attr">protocol:</span> <span class="string">TCP</span></span><br><span class="line">      <span class="attr">port:</span> <span class="number">80</span></span><br><span class="line">      <span class="attr">targetPort:</span> <span class="number">8081</span></span><br><span class="line">  <span class="attr">type:</span> <span class="string">ClusterIP</span></span><br><span class="line">  <span class="attr">sessionAffinity:</span> <span class="string">None</span></span><br><span class="line">  <span class="attr">ipFamilies:</span></span><br><span class="line">    <span class="bullet">-</span> <span class="string">IPv4</span></span><br><span class="line">  <span class="attr">ipFamilyPolicy:</span> <span class="string">SingleStack</span></span><br><span class="line">  <span class="attr">internalTrafficPolicy:</span> <span class="string">Cluster</span></span><br><span class="line"></span><br><span class="line"><span class="meta">---</span></span><br><span class="line"><span class="meta"></span></span><br><span class="line"><span class="attr">kind:</span> <span class="string">Ingress</span></span><br><span class="line"><span class="attr">apiVersion:</span> <span class="string">networking.k8s.io/v1</span></span><br><span class="line"><span class="attr">metadata:</span></span><br><span class="line">  <span class="attr">name:</span> <span class="string">npm-ai</span></span><br><span class="line">  <span class="attr">namespace:</span> <span class="string">ops</span></span><br><span class="line"><span class="attr">spec:</span></span><br><span class="line">  <span class="attr">ingressClassName:</span> <span class="string">private-nginx</span></span><br><span class="line">  <span class="attr">tls:</span></span><br><span class="line">    <span class="bullet">-</span> <span class="attr">hosts:</span></span><br><span class="line">        <span class="bullet">-</span> <span class="string">npm-ai.a.com</span></span><br><span class="line">      <span class="attr">secretName:</span> <span class="string">a-com</span></span><br><span class="line">  <span class="attr">rules:</span></span><br><span class="line">    <span class="bullet">-</span> <span class="attr">host:</span> <span class="string">npm-ai.a.com</span></span><br><span class="line">      <span class="attr">http:</span></span><br><span class="line">        <span class="attr">paths:</span></span><br><span class="line">          <span class="bullet">-</span> <span class="attr">path:</span> <span class="string">/</span></span><br><span class="line">            <span class="attr">pathType:</span> <span class="string">ImplementationSpecific</span></span><br><span class="line">            <span class="attr">backend:</span></span><br><span class="line">              <span class="attr">service:</span></span><br><span class="line">                <span class="attr">name:</span> <span class="string">npm-ai</span></span><br><span class="line">                <span class="attr">port:</span></span><br><span class="line">                  <span class="attr">number:</span> <span class="number">80</span></span><br><span class="line"></span><br><span class="line"></span><br></pre></td></tr></table></figure><p>Default Secret Encryption Key 警告问题：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br></pre></td><td class="code"><pre><span class="line">Nexus was not configured with an encryption key and is using the Default key</span><br><span class="line"></span><br><span class="line">/sonatype-work/nexus3/etc/nexus-default.properties</span><br><span class="line"></span><br><span class="line">增加一个配置</span><br><span class="line"></span><br><span class="line">nexus.secrets.file=/full/path/to/your/secrets/content.json</span><br><span class="line">content.json内容为：</span><br><span class="line"></span><br><span class="line">&#123;</span><br><span class="line">  <span class="string">&quot;active&quot;</span>: <span class="string">&quot;my-key&quot;</span>,</span><br><span class="line">  <span class="string">&quot;keys&quot;</span>: [</span><br><span class="line">    &#123;</span><br><span class="line">      <span class="string">&quot;id&quot;</span>: <span class="string">&quot;my-key&quot;</span>,</span><br><span class="line">      <span class="string">&quot;key&quot;</span>: <span class="string">&quot;任意的字符串&quot;</span></span><br><span class="line">    &#125;</span><br><span class="line">  ]</span><br><span class="line">&#125;</span><br><span class="line"></span><br></pre></td></tr></table></figure>]]>
    </content>
    <id>https://zahui.fan/posts/tgdcir/</id>
    <link href="https://zahui.fan/posts/tgdcir/"/>
    <published>2026-06-09T14:35:15.000Z</published>
    <summary>
      <![CDATA[<p><a href="https://www.sonatype.com/products/nexus-community-edition-download">https://www.sonatype.com/products/nexus-community-edition-download</a></p>
<p><img]]>
    </summary>
    <title>Nexus仓库搭建记录</title>
    <updated>2026-06-09T14:40:55.000Z</updated>
  </entry>
  <entry>
    <author>
      <name>张理坤</name>
    </author>
    <category term="开发" scheme="https://zahui.fan/categories/%E5%BC%80%E5%8F%91/"/>
    <category term="Git" scheme="https://zahui.fan/tags/Git/"/>
    <content>
      <![CDATA[<p>我在自己的分支开发，我在 dev 分支开发，想提交 Merge Request 合并到 main 分支，但是代码冲突，无法合并，需要先处理冲突，常用的解法有两种，一种是 merge 的方式合并代码，另一种是 rebase</p><h2 id="merge-方式合并"><a href="#merge-方式合并" class="headerlink" title="merge 方式合并"></a>merge 方式合并</h2><p>这种方式需要有 push 主分支代码的权限</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 先切换到main分支</span></span><br><span class="line">git checkout main</span><br><span class="line"></span><br><span class="line"><span class="comment"># 确保main分支更新到最新了</span></span><br><span class="line">git pull</span><br><span class="line"></span><br><span class="line"><span class="comment"># 合并dev分支到main分支</span></span><br><span class="line">git merge dev</span><br></pre></td></tr></table></figure><p>这个时候可能会出现代码冲突，建议使用 vscode 之类的软件进行合并，使用 VSCode 合并方式如下：</p><p><img src="https://s3.babudiu.com/iuxt/public/nes.svg" data-lazy-src="https://s3.babudiu.com/iuxt/2026/05/1780067904_b2806a829f024ffd8bee1fb9048fbc8b_clipboard.png" alt="image.png|531"></p><p>冲突解决完成，建议搜索一下关键词 <code>&gt;&gt;&gt;&gt;&gt;&gt;&gt;</code>,能搜到，说明你的冲突还没解决完。<br><img src="https://s3.babudiu.com/iuxt/public/nes.svg" data-lazy-src="https://s3.babudiu.com/iuxt/2026/05/1780068286_c13b3030e6b04a76a7c3d42b99d89066_clipboard.png" alt="image.png|180"></p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 合并完成后，将代码再次提交</span></span><br><span class="line"><span class="comment"># 这一步一般都是管理员完成，需要有推送main分支的权限。</span></span><br><span class="line">git add .</span><br><span class="line">git commit -m <span class="string">&#x27;merge dev to main&#x27;</span></span><br><span class="line">git push</span><br></pre></td></tr></table></figure><h2 id="rebase-方式合并"><a href="#rebase-方式合并" class="headerlink" title="rebase 方式合并"></a>rebase 方式合并</h2><p>rebase 的方式就是改变代码的分支起点，类似于把 dev 分支的起点转变到 main 的最新</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">          main</span><br><span class="line">            |</span><br><span class="line">A---B---C---D</span><br><span class="line">     \</span><br><span class="line">      E---F  (dev)</span><br></pre></td></tr></table></figure><p>变成</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">A---B---C---D  (main)</span><br><span class="line">              \</span><br><span class="line">               E<span class="string">&#x27;---F&#x27;</span>  (dev)</span><br></pre></td></tr></table></figure><p>其中 E’ 和 F’ 是 E、F 在 D 基础上重放的副本。</p><p>这样的好处是合并后的代码历史更简洁，是一条直线，且合并的时候可以不用管理员来处理代码冲突的情况（由自己处理掉），坏处是比较麻烦，可能会多次处理冲突。</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 保证main分支是最新的</span></span><br><span class="line">git checkout main</span><br><span class="line">git pull origin main</span><br><span class="line"></span><br><span class="line"><span class="comment"># rebase 到 main分支最新的commit</span></span><br><span class="line">git checkout dev</span><br><span class="line">git rebase main</span><br></pre></td></tr></table></figure><p>如果这个界面直接 <code>:wq</code> 保存退出<br><img src="https://s3.babudiu.com/iuxt/public/nes.svg" data-lazy-src="https://s3.babudiu.com/iuxt/2026/05/1780067544_8cd11cbbe177479ebdeb9382a8092c88_clipboard.png" alt="image.png|474"></p><p>这个时候如果有冲突，rebase 会停止，这个时候你需要手动解决冲突<br><img src="https://s3.babudiu.com/iuxt/public/nes.svg" data-lazy-src="https://s3.babudiu.com/iuxt/2026/05/1780067695_52170ada7a9648119c94290bb445a346_clipboard.png" alt="image.png|485"></p><p>建议使用 vscode 之类的软件解决冲突，使用 VSCode 合并方式如下：</p><p><img src="https://s3.babudiu.com/iuxt/public/nes.svg" data-lazy-src="https://s3.babudiu.com/iuxt/2026/05/1780067904_b2806a829f024ffd8bee1fb9048fbc8b_clipboard.png" alt="image.png|531"></p><p>冲突解决完成，建议搜索一下关键词 <code>&gt;&gt;&gt;&gt;&gt;&gt;&gt;</code>,能搜到，说明你的冲突还没解决完。<br><img src="https://s3.babudiu.com/iuxt/public/nes.svg" data-lazy-src="https://s3.babudiu.com/iuxt/2026/05/1780068286_c13b3030e6b04a76a7c3d42b99d89066_clipboard.png" alt="image.png|180"></p><p>解决完成后，执行</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">git add .</span><br><span class="line">git status</span><br></pre></td></tr></table></figure><p>确保没有<code>both modified:</code></p><p>然后继续执行 rebase：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">git rebase --<span class="built_in">continue</span></span><br></pre></td></tr></table></figure><p>如果有冲突，再次手动解决冲突，直到 rebase 操作结束。结束后你应该能看到：</p><p><img src="https://s3.babudiu.com/iuxt/public/nes.svg" data-lazy-src="https://s3.babudiu.com/iuxt/2026/05/1780068581_8f53d69176e54c5ab8a0e04ef30fda2e_clipboard.png" alt="image.png|455"></p><p>因为分支历史被改写了，所以会出现 当前状态同时领先远程和落后远程的情况，这个时候需要强制推送到</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">git push --force-with-lease origin dev</span><br></pre></td></tr></table></figure><p>然后你就可以正常的 merge 代码了。<br><img src="https://s3.babudiu.com/iuxt/public/nes.svg" data-lazy-src="https://s3.babudiu.com/iuxt/2026/05/1780069052_40a963de7fae4c659f11728b1201e83c_clipboard.png" alt="image.png|549"></p>]]>
    </content>
    <id>https://zahui.fan/posts/tfszv2/</id>
    <link href="https://zahui.fan/posts/tfszv2/"/>
    <published>2026-05-29T14:49:50.000Z</published>
    <summary>
      <![CDATA[<p>我在自己的分支开发，我在 dev 分支开发，想提交 Merge Request 合并到 main 分支，但是代码冲突，无法合并，需要先处理冲突，常用的解法有两种，一种是 merge 的方式合并代码，另一种是 rebase</p>
<h2 id="merge-方式合并"><a href="#merge-方式合并" class="headerlink" title="merge]]>
    </summary>
    <title>Git Merge代码冲突的解决方式</title>
    <updated>2026-05-29T15:37:17.000Z</updated>
  </entry>
  <entry>
    <author>
      <name>张理坤</name>
    </author>
    <category term="工具" scheme="https://zahui.fan/categories/%E5%B7%A5%E5%85%B7/"/>
    <category term="网络" scheme="https://zahui.fan/tags/%E7%BD%91%E7%BB%9C/"/>
    <content>
      <![CDATA[<p>普通的使用方式之前写过一篇文章：<a href="/posts/sq6bmc/">开源组网工具-easytier</a></p><p>但是试想一下如果你有 100 个 easytier 节点，现在想批量修改一个配置，那是比较痛苦的事情。easytier-web 就是个管理控制台，可以统一在控制台管理所有节点的配置。</p><h2 id="搭建-easytier-web-服务"><a href="#搭建-easytier-web-服务" class="headerlink" title="搭建 easytier-web 服务"></a>搭建 easytier-web 服务</h2><p>官方提供的有两种服务，官方文档在：<a href="https://easytier.cn/guide/network/web-console.html">https://easytier.cn/guide/network/web-console.html</a></p><p>EasyTier 的 web 控制台有 2 个版本：</p><ul><li>easytier-web（仅 web api 后端）</li><li>easytier-web-embed（web 前端 + web api 后端）</li></ul><p>如果你只搭建 web api 后端的话，需要登录官方的前端，api 配置你的后端地址，不过都选择自建了，那就前后端一起部署吧。</p><p>我是用 docker 搭建的，但是官方的 docker 镜像写死了 entrypoint 是 easytier-core ，不能启动 easytier-web 服务，所以自己构建镜像。</p><h3 id="dockerfile"><a href="#dockerfile" class="headerlink" title="dockerfile"></a>dockerfile</h3><p>避免镜像变大，我使用多阶段构建。</p><figure class="highlight dockerfile"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">FROM</span> alpine:latest AS downloader</span><br><span class="line"><span class="keyword">ADD</span><span class="language-bash"> https://github.com/EasyTier/EasyTier/releases/download/v2.6.1/easytier-linux-x86_64-v2.6.1.zip /</span></span><br><span class="line"><span class="keyword">RUN</span><span class="language-bash"> unzip /easytier-linux-x86_64-v2.6.1.zip &amp;&amp; \</span></span><br><span class="line"><span class="language-bash">    <span class="built_in">mv</span> /easytier-linux-x86_64 /easytier</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">FROM</span> alpine:latest</span><br><span class="line"><span class="keyword">COPY</span><span class="language-bash"> --from=downloader /easytier /easytier</span></span><br><span class="line"><span class="keyword">WORKDIR</span><span class="language-bash"> /easytier</span></span><br></pre></td></tr></table></figure><h3 id="启动服务"><a href="#启动服务" class="headerlink" title="启动服务"></a>启动服务</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br></pre></td><td class="code"><pre><span class="line">docker run --name easytier-web -d \</span><br><span class="line">    -e TZ=Asia/Shanghai \</span><br><span class="line">    --network iuxt \</span><br><span class="line">    -p 22020:22020/udp \</span><br><span class="line">    -v ./data:/easytier/data \</span><br><span class="line">    --restart=always \</span><br><span class="line">    iuxt/easytier:2.6.1 \</span><br><span class="line">    /easytier/easytier-web-embed \</span><br><span class="line">    --db /easytier/data/et.db \</span><br><span class="line">    --api-server-port 11211 \</span><br><span class="line">    --api-host https://et.example.com \</span><br><span class="line">    --config-server-port 22020 \</span><br><span class="line">    --config-server-protocol udp</span><br></pre></td></tr></table></figure><p>说明</p><ol><li>我指定了 docker network ，是为了和 nginx 镜像放在同一个网络下，入口统一是 nginx，配置 tls 证书和 mtls 双向认证。</li><li>udp 22020 端口是分发配置的端口，映射到公网。</li><li>data 目录存储的是数据库，记录的是控制台账号密码以及机器的配置信息。</li><li><code>--api-server-port 11211</code> 这个是指定的 web 控制台界面的端口。</li><li><code>--api-host https://et.example.com</code> 这个是对外的控制台地址。</li></ol><h3 id="配置-nginx-入口"><a href="#配置-nginx-入口" class="headerlink" title="配置 nginx 入口"></a>配置 nginx 入口</h3><p>控制台我用了 nginx 反向代理，有两个好处：</p><ol><li>可以配置 tls 证书，https 安全访问。</li><li>配置 mtls 双向认证，只有携带客户端证书才可以访问。</li></ol><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br></pre></td><td class="code"><pre><span class="line">server &#123;</span><br><span class="line">    listen 443 ssl;</span><br><span class="line">    server_name et.example.com;</span><br><span class="line">    client_max_body_size 0;</span><br><span class="line"></span><br><span class="line">    ssl_certificate         ssl/example.com.crt;</span><br><span class="line">    ssl_certificate_key     ssl/example.com.key;</span><br><span class="line">    ssl_protocols TLSv1.1 TLSv1.2 TLSv1.3;</span><br><span class="line">    ssl_ciphers EECDH+CHACHA20:EECDH+CHACHA20-draft:EECDH+AES128:RSA+AES128:EECDH+AES256:RSA+AES256:EECDH+3DES:RSA+3DES:!MD5;</span><br><span class="line">    ssl_prefer_server_ciphers on;</span><br><span class="line">    ssl_session_cache shared:SSL:10m;</span><br><span class="line">    ssl_session_timeout 10m;</span><br><span class="line">    add_header Strict-Transport-Security &quot;max-age=31536000&quot;;</span><br><span class="line">    error_page 497  https://$host$request_uri;</span><br><span class="line"></span><br><span class="line">    ssl_client_certificate ssl/ca.crt;       # 配置 CA 证书，用于验证客户端证书的签发者</span><br><span class="line">    ssl_verify_client on;                    # 启用客户端证书验证</span><br><span class="line">    ssl_crl ssl/crl.pem;                     # 配置 CRL 文件路径，用于检查吊销的证书</span><br><span class="line"></span><br><span class="line">    location / &#123;</span><br><span class="line">      proxy_set_header Host $http_host;</span><br><span class="line">      proxy_set_header X-Real-IP $remote_addr;</span><br><span class="line">      proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;</span><br><span class="line">      proxy_set_header X-Forwarded-Proto $scheme;</span><br><span class="line"></span><br><span class="line">      proxy_cache_convert_head off;</span><br><span class="line"></span><br><span class="line">      proxy_connect_timeout 300;</span><br><span class="line">      proxy_http_version 1.1;</span><br><span class="line">      proxy_set_header Connection &quot;&quot;;</span><br><span class="line">      chunked_transfer_encoding off;</span><br><span class="line"></span><br><span class="line">      proxy_set_header Upgrade $http_upgrade;</span><br><span class="line">      proxy_set_header Connection &quot;upgrade&quot;;</span><br><span class="line"></span><br><span class="line">      proxy_pass http://easytier-web:11211;</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h2 id="客户端接入"><a href="#客户端接入" class="headerlink" title="客户端接入"></a>客户端接入</h2><p>客户端启动的时候，只需要指定参数即可接入。</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line">docker run --name easytier-core -d \</span><br><span class="line">    --network host \</span><br><span class="line">    -e TZ=Asia/Shanghai \</span><br><span class="line">    -v /etc/machine-id:/etc/machine-id \</span><br><span class="line">    --privileged \</span><br><span class="line">    --restart=always \</span><br><span class="line">    easytier/easytier:v2.6.1 \</span><br><span class="line">    -w udp://et.example.com:22020/yourusername</span><br></pre></td></tr></table></figure><p>说明：</p><ol><li>挂载了&#x2F;etc&#x2F;machine-id，控制台上的 machine id 是根据这个生成的，为了避免容器重新创建的时候 id 发生变化，所以挂载此文件，或者手动指定 machine id ，增加参数：<code>--machine-id</code> 。</li><li><code>-w udp://et.example.com:22020/yourusername</code> 这里是控制台的配置下发地址，和你的控制台上注册的用户名。</li></ol><h2 id="控制台设置"><a href="#控制台设置" class="headerlink" title="控制台设置"></a>控制台设置</h2><p>第一步先注册、登录控制台。<br>接入了节点后，在控制台可以看到节点的信息：<br><img src="https://s3.babudiu.com/iuxt/public/nes.svg" data-lazy-src="https://s3.babudiu.com/iuxt/2026/04/1776904375_b722390e792f497aa670591b31e9c6cc_clipboard.png" alt="image.png"></p><p>点击设置按钮，create network，配置好后点击保存即可。后续可以在控制台修改配置，无须更新节点。<br><img src="https://s3.babudiu.com/iuxt/public/nes.svg" data-lazy-src="https://s3.babudiu.com/iuxt/2026/04/1776904430_e22853595f8c4523a30bc0da2f253b59_clipboard.png" alt="image.png"></p>]]>
    </content>
    <id>https://zahui.fan/posts/tdx76u/</id>
    <link href="https://zahui.fan/posts/tdx76u/"/>
    <published>2026-04-23T00:11:18.000Z</published>
    <summary>
      <![CDATA[<p>普通的使用方式之前写过一篇文章：<a href="/posts/sq6bmc/">开源组网工具-easytier</a></p>
<p>但是试想一下如果你有 100 个 easytier 节点，现在想批量修改一个配置，那是比较痛苦的事情。easytier-web 就是个管理控制台，可以统一在控制台管理所有节点的配置。</p>
<h2 id="搭建-easytier-web-服务"><a]]>
    </summary>
    <title>使用 Easytier-web 管理 easytier 节点</title>
    <updated>2026-07-14T10:42:47.000Z</updated>
  </entry>
  <entry>
    <author>
      <name>张理坤</name>
    </author>
    <category term="容器" scheme="https://zahui.fan/categories/%E5%AE%B9%E5%99%A8/"/>
    <category term="ingress" scheme="https://zahui.fan/tags/ingress/"/>
    <category term="Nginx" scheme="https://zahui.fan/tags/Nginx/"/>
    <content>
      <![CDATA[<p>比如我想去掉 url 中的 <code>/a</code></p><figure class="highlight yaml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line"><span class="string">curl</span> <span class="string">test.example.com/a/b/xxx/xxx</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># 实际请求到后端的路径：</span></span><br><span class="line"><span class="string">/b/xxx/xxx</span></span><br></pre></td></tr></table></figure><h2 id="方法一、使用-Nginx-配置片段"><a href="#方法一、使用-Nginx-配置片段" class="headerlink" title="方法一、使用 Nginx 配置片段"></a>方法一、使用 Nginx 配置片段</h2><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">location /a/b/ &#123;</span><br><span class="line">  proxy_pass http://a.default/b/;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>但是这种方式需要修改 ingress nginx 开启支持 nginx 配置的功能，详情见 <a href="/posts/sygayi/">ingress-nginx 使用自定义的nginx配置</a></p><h2 id="方法二、使用-ingress-nginx-原生配置"><a href="#方法二、使用-ingress-nginx-原生配置" class="headerlink" title="方法二、使用 ingress nginx 原生配置"></a>方法二、使用 ingress nginx 原生配置</h2><p>需要去除 context path 的路径，创建专门的 ingress，比如：</p><figure class="highlight yaml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br></pre></td><td class="code"><pre><span class="line"><span class="attr">kind:</span> <span class="string">Ingress</span></span><br><span class="line"><span class="attr">apiVersion:</span> <span class="string">networking.k8s.io/v1</span></span><br><span class="line"><span class="attr">metadata:</span></span><br><span class="line">  <span class="attr">name:</span> <span class="string">a</span></span><br><span class="line">  <span class="attr">namespace:</span> <span class="string">default</span></span><br><span class="line">  <span class="attr">annotations:</span></span><br><span class="line">    <span class="attr">nginx.ingress.kubernetes.io/ssl-redirect:</span> <span class="string">&#x27;true&#x27;</span></span><br><span class="line"><span class="attr">spec:</span></span><br><span class="line">  <span class="attr">ingressClassName:</span> <span class="string">private-nginx</span></span><br><span class="line">  <span class="attr">rules:</span></span><br><span class="line">    <span class="bullet">-</span> <span class="attr">host:</span> <span class="string">test.example.com</span></span><br><span class="line">      <span class="attr">http:</span></span><br><span class="line">        <span class="attr">paths:</span></span><br><span class="line">          <span class="bullet">-</span> <span class="attr">path:</span> <span class="string">/</span></span><br><span class="line">            <span class="attr">pathType:</span> <span class="string">ImplementationSpecific</span></span><br><span class="line">            <span class="attr">backend:</span></span><br><span class="line">              <span class="attr">service:</span></span><br><span class="line">                <span class="attr">name:</span> <span class="string">a</span></span><br><span class="line">                <span class="attr">port:</span></span><br><span class="line">                  <span class="attr">number:</span> <span class="number">80</span></span><br><span class="line"></span><br><span class="line"><span class="meta">---</span></span><br><span class="line"><span class="attr">kind:</span> <span class="string">Ingress</span></span><br><span class="line"><span class="attr">apiVersion:</span> <span class="string">networking.k8s.io/v1</span></span><br><span class="line"><span class="attr">metadata:</span></span><br><span class="line">  <span class="attr">name:</span> <span class="string">b</span></span><br><span class="line">  <span class="attr">namespace:</span> <span class="string">default</span></span><br><span class="line">  <span class="attr">annotations:</span></span><br><span class="line">    <span class="attr">nginx.ingress.kubernetes.io/ssl-redirect:</span> <span class="string">&#x27;true&#x27;</span></span><br><span class="line">    <span class="attr">nginx.ingress.kubernetes.io/rewrite-target:</span> <span class="string">/b/$2</span></span><br><span class="line"><span class="attr">spec:</span></span><br><span class="line">  <span class="attr">ingressClassName:</span> <span class="string">private-nginx</span></span><br><span class="line">  <span class="attr">rules:</span></span><br><span class="line">    <span class="bullet">-</span> <span class="attr">host:</span> <span class="string">test.example.com</span></span><br><span class="line">      <span class="attr">http:</span></span><br><span class="line">        <span class="attr">paths:</span></span><br><span class="line">          <span class="bullet">-</span> <span class="attr">path:</span> <span class="string">/a/b(/|$)(.*)</span></span><br><span class="line">            <span class="attr">pathType:</span> <span class="string">ImplementationSpecific</span></span><br><span class="line">            <span class="attr">backend:</span></span><br><span class="line">              <span class="attr">service:</span></span><br><span class="line">                <span class="attr">name:</span> <span class="string">b</span></span><br><span class="line">                <span class="attr">port:</span> </span><br><span class="line">                  <span class="attr">number:</span> <span class="number">80</span></span><br></pre></td></tr></table></figure>]]>
    </content>
    <id>https://zahui.fan/posts/tatajf/</id>
    <link href="https://zahui.fan/posts/tatajf/"/>
    <published>2026-02-21T13:52:27.000Z</published>
    <summary>
      <![CDATA[<p>比如我想去掉 url 中的 <code>/a</code></p>
<figure class="highlight yaml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span]]>
    </summary>
    <title>ingress-nginx 去除指定context path</title>
    <updated>2026-02-21T13:52:44.000Z</updated>
  </entry>
  <entry>
    <author>
      <name>张理坤</name>
    </author>
    <category term="Macintosh" scheme="https://zahui.fan/categories/Macintosh/"/>
    <category term="macOS" scheme="https://zahui.fan/tags/macOS/"/>
    <category term="wine" scheme="https://zahui.fan/tags/wine/"/>
    <content>
      <![CDATA[<p>我的环境：<br>OS：macOS Tahoe &amp; macOS Sequoia<br>CrossOver 版本：26.0<br>MusicPlayer2 版本：2.78</p><p>在 macOS 上没有找到我想要的本地音乐播放软件，倒是 Windows 上有个开源的播放器很不错: <a href="https://github.com/zhongyang219/MusicPlayer2">MusicPlayer2官方地址</a>，由于是 Windows 应用程序，想要在 macOS 上使用，我用的是 CrossOver 来运行，凑合使用，就是 CPU 使用率有亿点高。</p><h2 id="配置软件"><a href="#配置软件" class="headerlink" title="配置软件"></a>配置软件</h2><p>MusicPlayer2 文件我放在了 iCloud Drive 里，这样多个 Mac 电脑可以同步配置、播放记录等。</p><h3 id="创建容器"><a href="#创建容器" class="headerlink" title="创建容器"></a>创建容器</h3><p>我创建的是 Windows 11 容器。</p><h3 id="安装运行库"><a href="#安装运行库" class="headerlink" title="安装运行库"></a>安装运行库</h3><p>按照 MusicPlayer2 的要求，需要安装 Microsoft Visual C++ 运行库到 CrossOver 的容器里，当然也可以将需要的 dll 文件放在软件目录下。</p><h3 id="创建图标"><a href="#创建图标" class="headerlink" title="创建图标"></a>创建图标</h3><p><img src="https://s3.babudiu.com/iuxt/public/nes.svg" data-lazy-src="https://s3.babudiu.com/iuxt/2026/02/1364fead78c5772ad6a70221e2951430.png" alt="image.png|374"></p><p>在这里选择程序路径，然后将指令保存到面板</p><h3 id="备注：删除图标"><a href="#备注：删除图标" class="headerlink" title="备注：删除图标"></a>备注：删除图标</h3><p>CrossOver 设计的有问题，创建图标没给删除的方式，经过研究，删除图标需要到：<code>~/Applications/CrossOver/</code> 把对应的文件删除即可。</p><p><img src="https://s3.babudiu.com/iuxt/public/nes.svg" data-lazy-src="https://s3.babudiu.com/iuxt/2026/02/bb24b722c94e4fdd17fd98da8cc833f3.png" alt="image.png|548"></p><h2 id="CrossOver-配置"><a href="#CrossOver-配置" class="headerlink" title="CrossOver 配置"></a>CrossOver 配置</h2><p>为了显示最佳化，我做了如下改动：<br>图形：D3DMetal<br>开启高分辨率模式</p><h2 id="窗口大小调整问题"><a href="#窗口大小调整问题" class="headerlink" title="窗口大小调整问题"></a>窗口大小调整问题</h2><p>默认情况下不能调整窗口大小，只能最大化和最小化，需要修改 Wine 配置 Graphics ，取消勾选 允许窗口管理器装饰窗口。<br><img src="https://s3.babudiu.com/iuxt/public/nes.svg" data-lazy-src="https://s3.babudiu.com/iuxt/2026/02/649aabe17badfc40dbf3ff83940aeb9f.png" alt="image.png|482"></p><h2 id="MusicPlayer2-配置"><a href="#MusicPlayer2-配置" class="headerlink" title="MusicPlayer2 配置"></a>MusicPlayer2 配置</h2><p>歌词字体设置 霞鹜文楷 常规<br>标题栏 自绘标题栏（wine 自带标题栏太难看了）<br>界面设置为界面 12（这个界面不带系统默认的列表，默认列表搜索有 bug）</p><p>最终展示界面<br><img src="https://s3.babudiu.com/iuxt/public/nes.svg" data-lazy-src="https://s3.babudiu.com/iuxt/2026/02/dfa52ab45129b871004f06ac37752129.png" alt="image.png|564"></p>]]>
    </content>
    <id>https://zahui.fan/posts/tat9z4/</id>
    <link href="https://zahui.fan/posts/tat9z4/"/>
    <published>2026-02-21T13:40:15.000Z</published>
    <summary>
      <![CDATA[<p>我的环境：<br>OS：macOS Tahoe &amp; macOS Sequoia<br>CrossOver 版本：26.0<br>MusicPlayer2 版本：2.78</p>
<p>在 macOS 上没有找到我想要的本地音乐播放软件，倒是 Windows 上有个开源的播放器很不错: <a]]>
    </summary>
    <title>在macOS上使用MusicPlayer2听本地音乐</title>
    <updated>2026-02-22T01:29:41.000Z</updated>
  </entry>
  <entry>
    <author>
      <name>张理坤</name>
    </author>
    <category term="容器" scheme="https://zahui.fan/categories/%E5%AE%B9%E5%99%A8/"/>
    <category term="部署" scheme="https://zahui.fan/tags/%E9%83%A8%E7%BD%B2/"/>
    <content>
      <![CDATA[<blockquote><p>适用场景：</p><ul><li>裸机 &#x2F; 虚拟机环境</li><li>无云厂商 LB</li><li>追求 eBPF + 原生路由的高性能网络</li></ul></blockquote><h2 id="环境介绍"><a href="#环境介绍" class="headerlink" title="环境介绍"></a>环境介绍</h2><table><thead><tr><th>主机名</th><th>IP</th><th>安装组件</th></tr></thead><tbody><tr><td>master1</td><td>10.0.0.11</td><td>etcd、apiserver、controller-manager、scheduler、kubelet、containerd、kubeadm、kube-vip</td></tr><tr><td>master2</td><td>10.0.0.12</td><td>etcd、apiserver、controller-manager、scheduler、kubelet、containerd、kubeadm、kube-vip</td></tr><tr><td>master3</td><td>10.0.0.13</td><td>etcd、apiserver、controller-manager、scheduler、kubelet、containerd、kubeadm、kube-vip</td></tr></tbody></table><p><strong>基础环境</strong></p><ul><li>操作系统：CentOS Stream 10</li><li>Kubernetes：v1.34.5</li><li>容器运行时：containerd</li><li>CNI：Cilium</li><li>高可用方式：kube-vip（ARP 模式）</li></ul><h2 id="准备工作（所有节点）"><a href="#准备工作（所有节点）" class="headerlink" title="准备工作（所有节点）"></a>准备工作（所有节点）</h2><h3 id="关闭防火墙与-SELinux"><a href="#关闭防火墙与-SELinux" class="headerlink" title="关闭防火墙与 SELinux"></a>关闭防火墙与 SELinux</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">sudo</span> systemctl <span class="built_in">disable</span> --now firewalld</span><br><span class="line">setenforce 0</span><br><span class="line">sed -i <span class="string">&quot;s/^SELINUX=.*/SELINUX=disabled/g&quot;</span> /etc/selinux/config</span><br><span class="line"></span><br><span class="line"><span class="comment"># 验证，结果为0</span></span><br><span class="line">getenforce</span><br></pre></td></tr></table></figure><h3 id="配置主机名"><a href="#配置主机名" class="headerlink" title="配置主机名"></a>配置主机名</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">hostnamectl set-hostname master1</span><br></pre></td></tr></table></figure><h3 id="配置-hosts"><a href="#配置-hosts" class="headerlink" title="配置 hosts"></a>配置 hosts</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">cat</span> &gt;&gt; /etc/hosts &lt;&lt;<span class="string">EOF</span></span><br><span class="line"><span class="string">10.0.0.11 master1</span></span><br><span class="line"><span class="string">10.0.0.12 master2</span></span><br><span class="line"><span class="string">10.0.0.13 master3</span></span><br><span class="line"><span class="string">EOF</span></span><br></pre></td></tr></table></figure><h3 id="关闭-Swap"><a href="#关闭-Swap" class="headerlink" title="关闭 Swap"></a>关闭 Swap</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">swapoff -a</span><br><span class="line">sed -ri <span class="string">&#x27;s/.*swap.*/#&amp;/&#x27;</span> /etc/fstab</span><br><span class="line"></span><br><span class="line"><span class="comment"># 验证, swap为0</span></span><br><span class="line">free -h</span><br></pre></td></tr></table></figure><h3 id="时间同步"><a href="#时间同步" class="headerlink" title="时间同步"></a>时间同步</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">dnf install -y chrony</span><br><span class="line">systemctl <span class="built_in">enable</span> --now chronyd</span><br><span class="line"></span><br><span class="line"><span class="comment"># 验证，查看时间状态</span></span><br><span class="line">timedatectl status</span><br></pre></td></tr></table></figure><h3 id="内核参数与模块"><a href="#内核参数与模块" class="headerlink" title="内核参数与模块"></a>内核参数与模块</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br></pre></td><td class="code"><pre><span class="line">yum install -y kernel-modules-extra</span><br><span class="line"></span><br><span class="line"><span class="built_in">cat</span> &gt; /etc/modules-load.d/k8s.conf &lt;&lt;<span class="string">EOF</span></span><br><span class="line"><span class="string">overlay</span></span><br><span class="line"><span class="string">br_netfilter</span></span><br><span class="line"><span class="string">EOF</span></span><br><span class="line"></span><br><span class="line">modprobe overlay</span><br><span class="line">modprobe br_netfilter</span><br><span class="line"></span><br><span class="line"><span class="built_in">cat</span> &gt; /etc/sysctl.d/99-kubernetes-cri.conf &lt;&lt;<span class="string">EOF</span></span><br><span class="line"><span class="string">net.bridge.bridge-nf-call-iptables  = 1</span></span><br><span class="line"><span class="string">net.ipv4.ip_forward                 = 1</span></span><br><span class="line"><span class="string">net.bridge.bridge-nf-call-ip6tables = 1</span></span><br><span class="line"><span class="string">EOF</span></span><br><span class="line"></span><br><span class="line">sysctl -p</span><br><span class="line"></span><br><span class="line"><span class="comment"># RHEL 10 测试要重启 net.ipv4.ip_forward 才能生效, 或者临时修改一下</span></span><br><span class="line"><span class="built_in">echo</span> 1 &gt; /proc/sys/net/ipv4/ip_forward</span><br></pre></td></tr></table></figure><h3 id="启用-cgroup-v2"><a href="#启用-cgroup-v2" class="headerlink" title="启用 cgroup v2"></a>启用 cgroup v2</h3><p>CentOS Stream 10 &#x2F; RHEL 10 &#x2F; Rocky Linux 10 &#x2F; AlmaLinux 10 默认已经启用了 cgroup v2</p><h2 id="安装-Containerd（所有节点）"><a href="#安装-Containerd（所有节点）" class="headerlink" title="安装 Containerd（所有节点）"></a>安装 Containerd（所有节点）</h2><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 卸载旧版本Docker</span></span><br><span class="line"><span class="built_in">sudo</span> yum remove docker \</span><br><span class="line">        docker-client \</span><br><span class="line">        docker-client-latest \</span><br><span class="line">        docker-common \</span><br><span class="line">        docker-latest \</span><br><span class="line">        docker-latest-logrotate \</span><br><span class="line">        docker-logrotate \</span><br><span class="line">        docker-engine</span><br><span class="line"></span><br><span class="line"><span class="comment"># 安装docker仓库</span></span><br><span class="line"><span class="built_in">sudo</span> yum install -y yum-utils</span><br><span class="line"><span class="built_in">sudo</span> yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo</span><br><span class="line"></span><br><span class="line"><span class="comment"># 安装containerd</span></span><br><span class="line"><span class="built_in">sudo</span> yum install containerd.io -y</span><br></pre></td></tr></table></figure><h3 id="启用-SystemdCgroup"><a href="#启用-SystemdCgroup" class="headerlink" title="启用 SystemdCgroup"></a>启用 SystemdCgroup</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line">systemctl stop containerd</span><br><span class="line"></span><br><span class="line"><span class="built_in">mkdir</span> -p /etc/containerd</span><br><span class="line">containerd config default &gt; /etc/containerd/config.toml</span><br><span class="line">sed -i <span class="string">&#x27;s/SystemdCgroup = false/SystemdCgroup = true/&#x27;</span> /etc/containerd/config.toml</span><br><span class="line">systemctl <span class="built_in">enable</span> --now containerd</span><br><span class="line"></span><br><span class="line"><span class="comment"># 验证</span></span><br><span class="line"><span class="built_in">sudo</span> ctr version</span><br></pre></td></tr></table></figure><h2 id="安装-Kubernetes-组件（所有节点）"><a href="#安装-Kubernetes-组件（所有节点）" class="headerlink" title="安装 Kubernetes 组件（所有节点）"></a>安装 Kubernetes 组件（所有节点）</h2><h3 id="配置-yum-源"><a href="#配置-yum-源" class="headerlink" title="配置 yum 源"></a>配置 yum 源</h3><div class="tabs"><div class="nav-tabs"><button type="button" class="tab active">国内源</button><button type="button" class="tab">官方源</button></div><div class="tab-contents"><div class="tab-item-content active"><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">cat</span> &lt;&lt;<span class="string">EOF &gt; /etc/yum.repos.d/kubernetes.repo</span></span><br><span class="line"><span class="string">[kubernetes]</span></span><br><span class="line"><span class="string">name=Kubernetes</span></span><br><span class="line"><span class="string">baseurl=https://mirrors.aliyun.com/kubernetes-new/core/stable/v1.34/rpm/</span></span><br><span class="line"><span class="string">enabled=1</span></span><br><span class="line"><span class="string">gpgcheck=1</span></span><br><span class="line"><span class="string">gpgkey=https://mirrors.aliyun.com/kubernetes-new/core/stable/v1.34/rpm/repodata/repomd.xml.key</span></span><br><span class="line"><span class="string">exclude=kubelet kubeadm kubectl cri-tools kubernetes-cni</span></span><br><span class="line"><span class="string">EOF</span></span><br></pre></td></tr></table></figure></div><div class="tab-item-content"><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">cat</span> &lt;&lt;<span class="string">EOF | sudo tee /etc/yum.repos.d/kubernetes.repo</span></span><br><span class="line"><span class="string">[kubernetes]</span></span><br><span class="line"><span class="string">name=Kubernetes</span></span><br><span class="line"><span class="string">baseurl=https://pkgs.k8s.io/core:/stable:/v1.34/rpm/</span></span><br><span class="line"><span class="string">enabled=1</span></span><br><span class="line"><span class="string">gpgcheck=1</span></span><br><span class="line"><span class="string">gpgkey=https://pkgs.k8s.io/core:/stable:/v1.34/rpm/repodata/repomd.xml.key</span></span><br><span class="line"><span class="string">exclude=kubelet kubeadm kubectl cri-tools kubernetes-cni</span></span><br><span class="line"><span class="string">EOF</span></span><br></pre></td></tr></table></figure></div></div><div class="tab-to-top"><button type="button" aria-label="scroll to top"><i class="fas fa-arrow-up"></i></button></div></div><h3 id="安装"><a href="#安装" class="headerlink" title="安装"></a>安装</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 查看可用的版本</span></span><br><span class="line">yum list kubelet kubeadm kubectl --showduplicates --disableexcludes=kubernetes</span><br><span class="line"></span><br><span class="line">yum install -y kubelet-1.34.5 kubeadm-1.34.5 kubectl-1.34.5 --disableexcludes=kubernetes</span><br><span class="line"></span><br><span class="line">systemctl <span class="built_in">enable</span> --now kubelet</span><br></pre></td></tr></table></figure><h3 id="配置-crictl"><a href="#配置-crictl" class="headerlink" title="配置 crictl"></a>配置 crictl</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">crictl config --<span class="built_in">set</span> runtime-endpoint=unix:///run/containerd/containerd.sock</span><br></pre></td></tr></table></figure><h2 id="初始化-Kubernetes（首个-Master）"><a href="#初始化-Kubernetes（首个-Master）" class="headerlink" title="初始化 Kubernetes（首个 Master）"></a>初始化 Kubernetes（首个 Master）</h2><h3 id="创建集群"><a href="#创建集群" class="headerlink" title="创建集群"></a>创建集群</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 也可以先拉取镜像</span></span><br><span class="line"><span class="comment"># kubeadm config images pull --kubernetes-version 1.34.5</span></span><br><span class="line"><span class="comment"># --skip-phases=addon/kube-proxy 是为了 Cilium 网络插件，如果用flannel，不用加这个参数</span></span><br><span class="line"></span><br><span class="line">ip addr add 10.0.0.10/24 dev ens160</span><br><span class="line"></span><br><span class="line"><span class="built_in">sudo</span> kubeadm init \</span><br><span class="line">  --control-plane-endpoint <span class="string">&quot;10.0.0.10:6443&quot;</span> \</span><br><span class="line">  --kubernetes-version 1.34.5 \</span><br><span class="line">  --upload-certs \</span><br><span class="line">  --service-cidr=10.96.0.0/12 \</span><br><span class="line">  --pod-network-cidr=10.244.0.0/16 \</span><br><span class="line">  --skip-phases=addon/kube-proxy</span><br></pre></td></tr></table></figure><h3 id="配置-kubectl"><a href="#配置-kubectl" class="headerlink" title="配置 kubectl"></a>配置 kubectl</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">mkdir</span> -p <span class="variable">$HOME</span>/.kube</span><br><span class="line"><span class="built_in">sudo</span> <span class="built_in">cp</span> -i /etc/kubernetes/admin.conf <span class="variable">$HOME</span>/.kube/config</span><br><span class="line"><span class="built_in">sudo</span> <span class="built_in">chown</span> $(<span class="built_in">id</span> -u):$(<span class="built_in">id</span> -g) <span class="variable">$HOME</span>/.kube/config</span><br></pre></td></tr></table></figure><h2 id="安装-Cilium（首个-master）"><a href="#安装-Cilium（首个-master）" class="headerlink" title="安装 Cilium（首个 master）"></a>安装 Cilium（首个 master）</h2><h3 id="安装-cilium-cli"><a href="#安装-cilium-cli" class="headerlink" title="安装 cilium-cli"></a>安装 cilium-cli</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><span class="line">dnf install tar -y</span><br><span class="line"></span><br><span class="line">CILIUM_CLI_VERSION=$(curl -s https://raw.githubusercontent.com/cilium/cilium-cli/main/stable.txt)</span><br><span class="line">CLI_ARCH=amd64</span><br><span class="line"></span><br><span class="line"><span class="keyword">if</span> [ <span class="string">&quot;<span class="subst">$(uname -m)</span>&quot;</span> = <span class="string">&quot;aarch64&quot;</span> ]; <span class="keyword">then</span> CLI_ARCH=arm64; <span class="keyword">fi</span></span><br><span class="line">curl -L --fail --remote-name-all https://github.com/cilium/cilium-cli/releases/download/<span class="variable">$&#123;CILIUM_CLI_VERSION&#125;</span>/cilium-linux-<span class="variable">$&#123;CLI_ARCH&#125;</span>.tar.gz&#123;,.<span class="built_in">sha256sum</span>&#125;</span><br><span class="line"><span class="built_in">sha256sum</span> --check cilium-linux-<span class="variable">$&#123;CLI_ARCH&#125;</span>.tar.gz.sha256sum</span><br><span class="line"><span class="built_in">sudo</span> tar xzvfC cilium-linux-<span class="variable">$&#123;CLI_ARCH&#125;</span>.tar.gz /usr/local/bin</span><br><span class="line"><span class="built_in">rm</span> cilium-linux-<span class="variable">$&#123;CLI_ARCH&#125;</span>.tar.gz&#123;,.<span class="built_in">sha256sum</span>&#125;</span><br></pre></td></tr></table></figure><div class="tabs"><div class="nav-tabs"><button type="button" class="tab active">原生路由模式（适合自建机房）</button><button type="button" class="tab">VXLAN 模式（云环境）</button></div><div class="tab-contents"><div class="tab-item-content active"><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line">cilium install \</span><br><span class="line">  --<span class="built_in">set</span> kubeProxyReplacement=<span class="literal">true</span> \</span><br><span class="line">  --<span class="built_in">set</span> ipam.mode=cluster-pool \</span><br><span class="line">  --<span class="built_in">set</span> routingMode=native \</span><br><span class="line">  --<span class="built_in">set</span> ipam.operator.clusterPoolIPv4PodCIDRList=10.244.0.0/16 \</span><br><span class="line">  --<span class="built_in">set</span> ipam.operator.clusterPoolIPv4MaskSize=24 \</span><br><span class="line">  --<span class="built_in">set</span> ipv4NativeRoutingCIDR=10.244.0.0/16 \</span><br><span class="line">  --<span class="built_in">set</span> autoDirectNodeRoutes=<span class="literal">true</span> \</span><br><span class="line">  --<span class="built_in">set</span> bpf.masquerade=<span class="literal">true</span></span><br></pre></td></tr></table></figure></div><div class="tab-item-content"><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line">cilium install \</span><br><span class="line">  --<span class="built_in">set</span> kubeProxyReplacement=<span class="literal">true</span> \</span><br><span class="line">  --<span class="built_in">set</span> tunnel=vxlan \</span><br><span class="line">  --<span class="built_in">set</span> ipam.mode=cluster-pool \</span><br><span class="line">  --<span class="built_in">set</span> ipam.operator.clusterPoolIPv4PodCIDRList=10.244.0.0/16 \</span><br><span class="line">  --<span class="built_in">set</span> ipam.operator.clusterPoolIPv4MaskSize=24 \</span><br><span class="line">  --<span class="built_in">set</span> bpf.masquerade=<span class="literal">true</span></span><br></pre></td></tr></table></figure></div></div><div class="tab-to-top"><button type="button" aria-label="scroll to top"><i class="fas fa-arrow-up"></i></button></div></div><h3 id="检查状态"><a href="#检查状态" class="headerlink" title="检查状态"></a>检查状态</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br></pre></td><td class="code"><pre><span class="line">cilium status --<span class="built_in">wait</span></span><br><span class="line"></span><br><span class="line"></span><br><span class="line">    /¯¯\</span><br><span class="line"> /¯¯\__/¯¯\    Cilium:             OK</span><br><span class="line"> \__/¯¯\__/    Operator:           OK</span><br><span class="line"> /¯¯\__/¯¯\    Envoy DaemonSet:    OK</span><br><span class="line"> \__/¯¯\__/    Hubble Relay:       disabled</span><br><span class="line">    \__/       ClusterMesh:        disabled</span><br><span class="line"></span><br><span class="line">DaemonSet              cilium                   Desired: 1, Ready: 1/1, Available: 1/1</span><br><span class="line">DaemonSet              cilium-envoy             Desired: 1, Ready: 1/1, Available: 1/1</span><br><span class="line">Deployment             cilium-operator          Desired: 1, Ready: 1/1, Available: 1/1</span><br><span class="line">Containers:            cilium                   Running: 1</span><br><span class="line">                       cilium-envoy             Running: 1</span><br><span class="line">                       cilium-operator          Running: 1</span><br><span class="line">                       clustermesh-apiserver    </span><br><span class="line">                       hubble-relay             </span><br><span class="line">Cluster Pods:          2/2 managed by Cilium</span><br><span class="line">Helm chart version:    1.18.3</span><br><span class="line">Image versions         cilium             quay.io/cilium/cilium:v1.18.3@sha256:5649db451c88d928ea585514746d50d91e6210801b300c897283ea319d68de15: 1</span><br><span class="line">                       cilium-envoy       quay.io/cilium/cilium-envoy:v1.34.10-1761014632-c360e8557eb41011dfb5210f8fb53fed6c0b3222@sha256:ca76eb4e9812d114c7f43215a742c00b8bf41200992af0d21b5561d46156fd15: 1</span><br><span class="line">                       cilium-operator    quay.io/cilium/operator-generic:v1.18.3@sha256:b5a0138e1a38e4437c5215257ff4e35373619501f4877dbaf92c89ecfad81797: 1</span><br></pre></td></tr></table></figure><h2 id="部署-kube-vip（首个-master）"><a href="#部署-kube-vip（首个-master）" class="headerlink" title="部署 kube-vip（首个 master）"></a>部署 kube-vip（首个 master）</h2><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">export</span> VIP=10.0.0.10</span><br><span class="line"><span class="built_in">export</span> INTERFACE=ens160</span><br><span class="line">kubectl apply -f https://kube-vip.io/manifests/rbac.yaml</span><br><span class="line"></span><br><span class="line">ip addr del 10.0.0.10/24 dev ens160</span><br><span class="line"></span><br><span class="line">ctr image pull docker.io/plndr/kube-vip:v1.0.3</span><br><span class="line">ctr run --<span class="built_in">rm</span> --net-host docker.io/plndr/kube-vip:v1.0.3 kube-vip /kube-vip manifest pod \</span><br><span class="line">  --interface <span class="variable">$INTERFACE</span> \</span><br><span class="line">  --address <span class="variable">$VIP</span> \</span><br><span class="line">  --controlplane \</span><br><span class="line">  --services \</span><br><span class="line">  --arp \</span><br><span class="line">  --leaderElection \</span><br><span class="line">  | <span class="built_in">tee</span> /etc/kubernetes/manifests/kube-vip.yaml</span><br><span class="line">  </span><br><span class="line"><span class="comment"># 验证，如果有 kube-vip-master1 就说明成功了</span></span><br><span class="line">kubectl get pod -n kube-system</span><br></pre></td></tr></table></figure><h2 id="其余节点加入集群"><a href="#其余节点加入集群" class="headerlink" title="其余节点加入集群"></a>其余节点加入集群</h2><h3 id="生成-token"><a href="#生成-token" class="headerlink" title="生成 token"></a>生成 token</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 这条命令生成加入命令</span></span><br><span class="line">kubeadm token create --print-join-command --ttl 30m</span><br><span class="line"></span><br><span class="line"><span class="comment"># 这条命令会生成一个key</span></span><br><span class="line">kubeadm init phase upload-certs --upload-certs</span><br></pre></td></tr></table></figure><h3 id="增加-Master-节点"><a href="#增加-Master-节点" class="headerlink" title="增加 Master 节点"></a>增加 Master 节点</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 发送 kube-vip 配置文件到其他 Master 节点</span></span><br><span class="line"><span class="built_in">cd</span> /etc/kubernetes/manifests</span><br><span class="line">scp kube-vip.yaml 10.0.0.12:<span class="variable">$PWD</span></span><br><span class="line">scp kube-vip.yaml 10.0.0.13:<span class="variable">$PWD</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># 参考上一步的生成token的结果</span></span><br><span class="line">kubeadm <span class="built_in">join</span> 10.0.0.10:6443 --token &lt;token&gt; --discovery-token-ca-cert-hash sha256:&lt;<span class="built_in">hash</span>&gt; --control-plane --certificate-key &lt;key&gt;</span><br><span class="line"></span><br><span class="line"><span class="comment"># 验证 ETCD 状态</span></span><br><span class="line">kubectl <span class="built_in">exec</span> -it -n kube-system etcd-master1 -- etcdctl --endpoints 127.0.0.1:2379 --cacert /etc/kubernetes/pki/etcd/ca.crt --cert /etc/kubernetes/pki/etcd/server.crt --key /etc/kubernetes/pki/etcd/server.key member list</span><br></pre></td></tr></table></figure><h3 id="增加-Node-节点"><a href="#增加-Node-节点" class="headerlink" title="增加 Node 节点"></a>增加 Node 节点</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 参考上面生成token步骤的输出结果</span></span><br><span class="line">kubeadm <span class="built_in">join</span> 10.0.0.10:6443 --token &lt;token&gt; --discovery-token-ca-cert-hash sha256:&lt;<span class="built_in">hash</span>&gt;</span><br></pre></td></tr></table></figure><h2 id="验证部署"><a href="#验证部署" class="headerlink" title="验证部署"></a>验证部署</h2><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">kubectl create deployment testdp --image=nginx:1.23.2</span><br><span class="line">kubectl expose deployment testdp --port=80 --<span class="built_in">type</span>=NodePort</span><br><span class="line">kubectl get pods,svc</span><br></pre></td></tr></table></figure><p>浏览器访问：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">http://10.0.0.11:NodePort</span><br><span class="line">http://10.0.0.12:NodePort</span><br><span class="line">http://10.0.0.13:NodePort</span><br></pre></td></tr></table></figure>]]>
    </content>
    <id>https://zahui.fan/posts/786c9442/</id>
    <link href="https://zahui.fan/posts/786c9442/"/>
    <published>2026-01-10T15:19:23.000Z</published>
    <summary>
      <![CDATA[<blockquote>
<p>适用场景：</p>
<ul>
<li>裸机 &#x2F; 虚拟机环境</li>
<li>无云厂商 LB</li>
<li>追求 eBPF + 原生路由的高性能网络</li>
</ul>
</blockquote>
<h2 id="环境介绍"><a href="#环境介绍" class="headerlink"]]>
    </summary>
    <title>Kubernetes 1.34 + RHEL10 + Cilium + kube-vip 高可用集群部署</title>
    <updated>2026-01-11T03:54:01.000Z</updated>
  </entry>
  <entry>
    <author>
      <name>张理坤</name>
    </author>
    <category term="日志" scheme="https://zahui.fan/categories/%E6%97%A5%E5%BF%97/"/>
    <category term="腾讯云" scheme="https://zahui.fan/tags/%E8%85%BE%E8%AE%AF%E4%BA%91/"/>
    <category term="正则表达式" scheme="https://zahui.fan/tags/%E6%AD%A3%E5%88%99%E8%A1%A8%E8%BE%BE%E5%BC%8F/"/>
    <content>
      <![CDATA[<p>使用 CLS 来采集业务日志的好处有</p><ol><li>运维方便，不用费劲搭建 ELK 系统，传统的 <code>filebeat</code> -&gt; <code>kafka</code> -&gt; <code>logstash</code> -&gt; <code>ElasticSearch</code> 架构复杂</li><li>费用便宜（和 ES、kafka 这一套相比）</li><li>不用担心告警等（如 ES 磁盘使用率等）</li></ol><h2 id="开启采集"><a href="#开启采集" class="headerlink" title="开启采集"></a>开启采集</h2><p>在集群管理界面，点击 日志 新增采集配置：</p><p><img src="https://s3.babudiu.com/iuxt/public/nes.svg" data-lazy-src="https://s3.babudiu.com/iuxt/2026/01/9ee2c751e344af1e5287829328d20561.png" alt="PixPin_2026-01-07_21-38-41.png"></p><p>然后选择日志源、元数据等，点击下一步，配置日志解析方式。</p><p>如果是纯 json 日志，就配置成 json 格式解析。业务日志是 Spring Boot，并且包含多行日志，所以选择 多行 - 完全正则 模式来匹配。</p><p><img src="https://s3.babudiu.com/iuxt/public/nes.svg" data-lazy-src="https://s3.babudiu.com/iuxt/2026/01/317795f30f1c660c5a822356b73bbdcb.png" alt="PixPin_2026-01-07_21-30-40.png"></p><p>点击完成后就完成了日志采集。</p><h2 id="多行正则模式匹配"><a href="#多行正则模式匹配" class="headerlink" title="多行正则模式匹配"></a>多行正则模式匹配</h2><p>假设业务日志格式为：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line">2026-01-07 20:58:29.335  INFO [tsp-agent,517f1bd4b38282b2,e66be3ada6f121cf,<span class="literal">true</span>] [XNIO-1 task-7] c.example.nub.webmvc.filter.PrintFilter   [145]: 响应</span><br><span class="line"> ResponseHeader: </span><br><span class="line">    Transfer-Encoding: chunked</span><br><span class="line">    Connection: keep-alive</span><br><span class="line">    Date: Wed, 07 Jan 2026 12:58:29 GMT</span><br><span class="line">    Content-Type: application/json</span><br><span class="line"> Body: </span><br><span class="line">    &#123;<span class="string">&quot;code&quot;</span>:0,<span class="string">&quot;message&quot;</span>:<span class="string">&quot;成功&quot;</span>,<span class="string">&quot;data&quot;</span>:&#123;<span class="string">&quot;nkUserId&quot;</span>:<span class="string">&quot;158c440b431d482a8a738f82caf2f638&quot;</span>,<span class="string">&quot;nkUserTicket&quot;</span>:<span class="string">&quot;2bb5003769864887a90f615a7381d253&quot;</span>,<span class="string">&quot;expiresAt&quot;</span>:1767790769&#125;&#125;</span><br></pre></td></tr></table></figure><p>那么我们需要的日志字段有（按日志顺序）：</p><ol><li><code>2026-01-07 20:58:29.335</code> 日志时间</li><li><code>INFO</code> 日志级别</li><li><code>[服务名，TraceId， SpanId, 不知道是什么字段]</code></li><li><code>[XNIO-1 task-7]</code> XNIO：是 XNIO 框架的线程池 task-7：线程池中的第 7 个工作线程</li><li><code>c.example.nub.webmvc.filter.PrintFilter</code> 哪个类打印出来的</li><li><code>[145]</code> 上面的 java 类的第 145 行打印的日志</li><li>冒号 <code>:</code> 后面的是日志原文了，多行的</li></ol><p>根据这个，写一个正则，然后点击提取验证。</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">(\d&#123;4&#125;-\d&#123;2&#125;-\d&#123;2&#125; \d&#123;2&#125;:\d&#123;2&#125;:\d&#123;2&#125;\.\d&#123;3&#125;)\s+(\w+)\s+\[([^,\]]*),([^,\]]*),([^,\]]*),[^,\]]*\]\s+\[[^\]]+\]\s+([^\s[]+)\s*\[\d+\]:\s*(.*)</span><br></pre></td></tr></table></figure><p>需要的字段，用括号 <code>()</code> 包起来，点击提取验证，下面就会有示例：</p><p><img src="https://s3.babudiu.com/iuxt/public/nes.svg" data-lazy-src="https://s3.babudiu.com/iuxt/2026/01/08cd7c5ffcec078c5c5498885d07530a.png" alt="PixPin_2026-01-07_21-35-01.png"></p><p>给提取到的日志起个 Key 名</p><p><img src="https://s3.babudiu.com/iuxt/public/nes.svg" data-lazy-src="https://s3.babudiu.com/iuxt/2026/01/c2dd553bab374319845662843ecad4ab.png" alt="PixPin_2026-01-07_21-36-00.png"></p><p>然后到 CLS 日志 -&gt; 检索分析里面，可以看到日志字段都成功解析了。</p><p><img src="https://s3.babudiu.com/iuxt/public/nes.svg" data-lazy-src="https://s3.babudiu.com/iuxt/2026/01/67333f1c3c108711fc63b8ae9c8e6087.png" alt="PixPin_2026-01-07_21-37-40.png"></p><h2 id="Ingress-Nginx-访问日志采集"><a href="#Ingress-Nginx-访问日志采集" class="headerlink" title="Ingress Nginx 访问日志采集"></a>Ingress Nginx 访问日志采集</h2><p>比如想采集 <code>ingress-nginx</code> 的访问日志，需要先配置 ingress controller 的日志输出格式（Nginx 同理）。然后再进行采集，日志解析格式为 json 即可。</p>]]>
    </content>
    <id>https://zahui.fan/posts/t8hx7x/</id>
    <link href="https://zahui.fan/posts/t8hx7x/"/>
    <published>2026-01-07T13:23:56.000Z</published>
    <summary>
      <![CDATA[<p>使用 CLS 来采集业务日志的好处有</p>
<ol>
<li>运维方便，不用费劲搭建 ELK 系统，传统的 <code>filebeat</code> -&gt; <code>kafka</code> -&gt; <code>logstash</code> -&gt; <code>ElasticSearch</code> 架构复杂</li>
<li>费用便宜（和 ES、kafka]]>
    </summary>
    <title>使用腾讯云CLS收集TKE（k8s）业务日志</title>
    <updated>2026-01-07T13:55:27.000Z</updated>
  </entry>
  <entry>
    <author>
      <name>张理坤</name>
    </author>
    <category term="容器" scheme="https://zahui.fan/categories/%E5%AE%B9%E5%99%A8/"/>
    <category term="记录" scheme="https://zahui.fan/tags/%E8%AE%B0%E5%BD%95/"/>
    <category term="容器" scheme="https://zahui.fan/tags/%E5%AE%B9%E5%99%A8/"/>
    <category term="busybox" scheme="https://zahui.fan/tags/busybox/"/>
    <content>
      <![CDATA[<p>很早之前我在上学的时候给安卓手机刷机，root 后还可以安装了个号称 Linux 瑞士军刀的 App，不过没搞懂有什么用，不过记住了这个特别的名字 – BusyBox</p><h2 id="BusyBox-是什么"><a href="#BusyBox-是什么" class="headerlink" title="BusyBox 是什么"></a>BusyBox 是什么</h2><p>BusyBox 是一款超轻量级的 Linux 工具集，也被称为 “Linux 瑞士军刀”—— 它把数百个常用的 Linux 命令（如 ls、cat、ps、telnet、unzip 等）打包进一个单一的可执行文件，体积仅 1-2MB，且支持静态编译，是嵌入式 Linux、精简系统、应急运维场景的 “神器”。</p><h3 id="下载地址"><a href="#下载地址" class="headerlink" title="下载地址"></a>下载地址</h3><p>官方编译好的可执行文件：<a href="https://busybox.net/downloads/binaries/1.35.0-x86_64-linux-musl/">https://busybox.net/downloads/binaries/1.35.0-x86_64-linux-musl/</a>， 可以下载主文件 <code>busybox</code>，也可以下载单个命令使用。</p><h2 id="BusyBox-使用方法"><a href="#BusyBox-使用方法" class="headerlink" title="BusyBox 使用方法"></a>BusyBox 使用方法</h2><h3 id="包含的命令"><a href="#包含的命令" class="headerlink" title="包含的命令"></a>包含的命令</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br></pre></td><td class="code"><pre><span class="line">BusyBox v1.35.0 (2022-01-17 19:57:02 CET) multi-call binary.</span><br><span class="line">BusyBox is copyrighted by many authors between 1998-2015.</span><br><span class="line">Licensed under GPLv2. See <span class="built_in">source</span> distribution <span class="keyword">for</span> detailed</span><br><span class="line">copyright notices.</span><br><span class="line"></span><br><span class="line">Usage: busybox [<span class="keyword">function</span> [arguments]...]</span><br><span class="line">   or: busybox --list[-full]</span><br><span class="line">   or: busybox --show SCRIPT</span><br><span class="line">   or: busybox --install [-s] [DIR]</span><br><span class="line">   or: <span class="keyword">function</span> [arguments]...</span><br><span class="line"></span><br><span class="line">BusyBox is a multi-call binary that combines many common Unix</span><br><span class="line">utilities into a single executable.  Most people will create a</span><br><span class="line"><span class="built_in">link</span> to busybox <span class="keyword">for</span> each <span class="keyword">function</span> they wish to use and BusyBox</span><br><span class="line">will act like whatever it was invoked as.</span><br><span class="line"></span><br><span class="line">Currently defined <span class="built_in">functions</span>:</span><br><span class="line">[, [[, acpid, add-shell, addgroup, adduser, adjtimex, ar, <span class="built_in">arch</span>, arp, arping, ascii, ash, awk, <span class="built_in">base32</span>, <span class="built_in">base64</span>, <span class="built_in">basename</span>, bc, blkdiscard, blkid, blockdev, bootchartd,</span><br><span class="line">brctl, bunzip2, bzcat, bzip2, cal, <span class="built_in">cat</span>, chat, chattr, <span class="built_in">chgrp</span>, <span class="built_in">chmod</span>, <span class="built_in">chown</span>, chpasswd, chpst, <span class="built_in">chroot</span>, chrt, chvt, <span class="built_in">cksum</span>, clear, cmp, <span class="built_in">comm</span>, conspy, <span class="built_in">cp</span>, cpio, crc32, crond,</span><br><span class="line">crontab, cryptpw, cttyhack, <span class="built_in">cut</span>, <span class="built_in">date</span>, dc, <span class="built_in">dd</span>, deallocvt, delgroup, deluser, depmod, devmem, <span class="built_in">df</span>, dhcprelay, diff, <span class="built_in">dirname</span>, dmesg, dnsd, dnsdomainname, dos2unix, dpkg,</span><br><span class="line">dpkg-deb, <span class="built_in">du</span>, dumpkmap, dumpleases, <span class="built_in">echo</span>, ed, egrep, eject, <span class="built_in">env</span>, envdir, envuidgid, <span class="built_in">expand</span>, <span class="built_in">expr</span>, <span class="built_in">factor</span>, fakeidentd, fallocate, <span class="literal">false</span>, fatattr, fbset, fbsplash,</span><br><span class="line">fdflush, fdformat, fdisk, fgconsole, fgrep, find, findfs, flash_eraseall, flash_lock, flash_unlock, flashcp, flock, <span class="built_in">fold</span>, free, freeramdisk, fsck, fsck.minix, fsfreeze,</span><br><span class="line">fstrim, fsync, ftpd, ftpget, ftpput, fuser, getopt, getty, grep, <span class="built_in">groups</span>, gunzip, gzip, halt, hd, hdparm, <span class="built_in">head</span>, hexdump, hexedit, <span class="built_in">hostid</span>, hostname, httpd, hush, hwclock,</span><br><span class="line">i2cdump, i2cget, i2cset, i2ctransfer, <span class="built_in">id</span>, ifconfig, ifenslave, ifplugd, inetd, init, inotifyd, insmod, install, ionice, iostat, ip, ipaddr, ipcalc, ipcrm, ipcs, iplink,</span><br><span class="line">ipneigh, iproute, iprule, iptunnel, kbd_mode, <span class="built_in">kill</span>, killall, killall5, klogd, last, less, <span class="built_in">link</span>, linux32, linux64, linuxrc, <span class="built_in">ln</span>, loadfont, loadkmap, logger, login,</span><br><span class="line"><span class="built_in">logname</span>, losetup, lpd, lpq, lpr, <span class="built_in">ls</span>, lsattr, lsmod, lsof, lspci, lsscsi, lsusb, lzcat, lzma, lzop, lzopcat, makedevs, makemime, man, <span class="built_in">md5sum</span>, mdev, mesg, microcom, mim,</span><br><span class="line"><span class="built_in">mkdir</span>, mkdosfs, mke2fs, <span class="built_in">mkfifo</span>, mkfs.ext2, mkfs.minix, mkfs.reiser, mkfs.vfat, <span class="built_in">mknod</span>, mkpasswd, mkswap, <span class="built_in">mktemp</span>, modinfo, modprobe, more, mount, mountpoint, mpstat, mt,</span><br><span class="line"><span class="built_in">mv</span>, nameif, nbd-client, nc, netstat, <span class="built_in">nice</span>, <span class="built_in">nl</span>, nmeter, <span class="built_in">nohup</span>, nologin, <span class="built_in">nproc</span>, nsenter, nslookup, ntpd, nuke, <span class="built_in">od</span>, openvt, partprobe, passwd, <span class="built_in">paste</span>, patch, pgrep, pidof,</span><br><span class="line">ping, ping6, pipe_progress, pivot_root, pkill, pmap, popmaildir, poweroff, powertop, <span class="built_in">printenv</span>, <span class="built_in">printf</span>, ps, pscan, pstree, <span class="built_in">pwd</span>, pwdx, raidautorun, rdate, rdev, <span class="built_in">readlink</span>,</span><br><span class="line">readprofile, <span class="built_in">realpath</span>, reboot, reformime, remove-shell, renice, reset, resize, resume, rev, <span class="built_in">rm</span>, <span class="built_in">rmdir</span>, rmmod, route, rpm, rpm2cpio, rtcwake, run-init, run-parts,</span><br><span class="line">runlevel, runsv, runsvdir, rx, script, scriptreplay, sed, sendmail, <span class="built_in">seq</span>, setarch, setconsole, setfattr, setfont, setkeycodes, setlogcons, setpriv, setserial, setsid,</span><br><span class="line">setuidgid, sh, <span class="built_in">sha1sum</span>, <span class="built_in">sha256sum</span>, sha3sum, <span class="built_in">sha512sum</span>, showkey, <span class="built_in">shred</span>, <span class="built_in">shuf</span>, slattach, <span class="built_in">sleep</span>, smemcap, softlimit, <span class="built_in">sort</span>, <span class="built_in">split</span>, ssl_client, start-stop-daemon, <span class="built_in">stat</span>,</span><br><span class="line">strings, <span class="built_in">stty</span>, su, sulogin, <span class="built_in">sum</span>, sv, svc, svlogd, svok, swapoff, swapon, switch_root, <span class="built_in">sync</span>, sysctl, syslogd, <span class="built_in">tac</span>, <span class="built_in">tail</span>, tar, taskset, tc, tcpsvd, <span class="built_in">tee</span>, telnet, telnetd,</span><br><span class="line"><span class="built_in">test</span>, tftp, tftpd, <span class="keyword">time</span>, <span class="built_in">timeout</span>, top, <span class="built_in">touch</span>, <span class="built_in">tr</span>, traceroute, traceroute6, <span class="literal">true</span>, <span class="built_in">truncate</span>, ts, <span class="built_in">tty</span>, ttysize, tunctl, tune2fs, ubiattach, ubidetach, ubimkvol, ubirename,</span><br><span class="line">ubirmvol, ubirsvol, ubiupdatevol, udhcpc, udhcpc6, udhcpd, udpsvd, uevent, umount, <span class="built_in">uname</span>, uncompress, <span class="built_in">unexpand</span>, <span class="built_in">uniq</span>, unix2dos, <span class="built_in">unlink</span>, unlzma, unlzop, unshare, unxz,</span><br><span class="line">unzip, <span class="built_in">uptime</span>, <span class="built_in">users</span>, usleep, uudecode, uuencode, vconfig, vi, vlock, volname, w, wall, watch, watchdog, <span class="built_in">wc</span>, wget, <span class="built_in">which</span>, <span class="built_in">who</span>, <span class="built_in">whoami</span>, whois, xargs, xxd, xz, xzcat, <span class="built_in">yes</span>,</span><br><span class="line">zcat, zcip</span><br></pre></td></tr></table></figure><h3 id="如何使用"><a href="#如何使用" class="headerlink" title="如何使用"></a>如何使用</h3><h4 id="直接使用"><a href="#直接使用" class="headerlink" title="直接使用"></a>直接使用</h4><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 从我的镜像仓库下载</span></span><br><span class="line">curl -OL https://s3.babudiu.com/src/linux/bin/busybox &amp;&amp; <span class="built_in">chmod</span> +x busybox</span><br><span class="line"></span><br><span class="line"><span class="comment"># zip 解压 jar 包</span></span><br><span class="line">./busybox unzip app.jar</span><br><span class="line"></span><br><span class="line"><span class="comment"># ps查看进程</span></span><br><span class="line">./busybox ps aux</span><br><span class="line"></span><br><span class="line"><span class="comment"># df查看磁盘</span></span><br><span class="line">./busybox <span class="built_in">df</span> -h</span><br><span class="line"></span><br><span class="line"><span class="comment"># ping测试网络</span></span><br><span class="line">./busybox ping -c 4 baidu.com</span><br></pre></td></tr></table></figure><h4 id="简化使用"><a href="#简化使用" class="headerlink" title="简化使用"></a>简化使用</h4><p>如果想像原生命令一样直接用 busybox 自带的命令，可创建软链接：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">ln</span> -s busybox ps</span><br><span class="line"><span class="built_in">ln</span> -s busybox <span class="built_in">df</span></span><br><span class="line"><span class="built_in">ln</span> -s busybox /usr/local/bin/ping</span><br><span class="line"></span><br><span class="line"><span class="comment"># 之后直接调用</span></span><br><span class="line">./ps aux</span><br><span class="line">./df -h</span><br><span class="line">ping baidu.com</span><br></pre></td></tr></table></figure><h2 id="为什么适合在容器环境下使用"><a href="#为什么适合在容器环境下使用" class="headerlink" title="为什么适合在容器环境下使用"></a>为什么适合在容器环境下使用</h2><ol><li>镜像安全问题，容易被各种安全团队扫描到漏洞进行整改，需要尽量少安装各种包。</li><li>镜像体积大小问题。</li><li>有些容器的基础镜像停止维护（比如老掉牙的 jdk8,基础的操作系统镜像也比较老，想要安装个包很折腾）</li></ol>]]>
    </content>
    <id>https://zahui.fan/posts/t79irt/</id>
    <link href="https://zahui.fan/posts/t79irt/"/>
    <published>2025-12-14T13:57:28.000Z</published>
    <summary>
      <![CDATA[<p>很早之前我在上学的时候给安卓手机刷机，root 后还可以安装了个号称 Linux 瑞士军刀的 App，不过没搞懂有什么用，不过记住了这个特别的名字 – BusyBox</p>
<h2 id="BusyBox-是什么"><a href="#BusyBox-是什么" class="headerlink" title="BusyBox 是什么"></a>BusyBox]]>
    </summary>
    <title>容器调试工具之BusyBox</title>
    <updated>2025-12-14T14:47:12.000Z</updated>
  </entry>
  <entry>
    <author>
      <name>张理坤</name>
    </author>
    <category term="容器" scheme="https://zahui.fan/categories/%E5%AE%B9%E5%99%A8/"/>
    <category term="镜像" scheme="https://zahui.fan/tags/%E9%95%9C%E5%83%8F/"/>
    <category term="容器" scheme="https://zahui.fan/tags/%E5%AE%B9%E5%99%A8/"/>
    <content>
      <![CDATA[<p>找了有两个开源项目比较不错，都可以完成镜像的迁移。</p><h2 id="crpy-的使用"><a href="#crpy-的使用" class="headerlink" title="crpy 的使用"></a>crpy 的使用</h2><p>crpy 使用 python 开发，有本地缓存，拉取和推送镜像速度比较快。使用体验比较接近 docker。<br>开源地址： <a href="https://github.com/bvanelli/crpy">https://github.com/bvanelli/crpy</a></p><h3 id="安装"><a href="#安装" class="headerlink" title="安装"></a>安装</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 也可以安装到虚拟环境</span></span><br><span class="line">pip install crpy</span><br></pre></td></tr></table></figure><h3 id="认证"><a href="#认证" class="headerlink" title="认证"></a>认证</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">crpy login registry.cn-hangzhou.aliyuncs.com -u &lt;username&gt; -p &lt;password&gt;</span><br></pre></td></tr></table></figure><p>认证信息存储在：<code>~/.crpy/config.json</code></p><h3 id="拉取镜像"><a href="#拉取镜像" class="headerlink" title="拉取镜像"></a>拉取镜像</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">crpy pull nginx:1.29 nginx_1.29.tar</span><br></pre></td></tr></table></figure><p>缓存数据存储在：<code>~/.crpy/blobs</code></p><h3 id="推送镜像"><a href="#推送镜像" class="headerlink" title="推送镜像"></a>推送镜像</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">crpy push nginx_1.29.tar registry.cn-hangzhou.aliyuncs.com/iuxt/nginx:1.29</span><br></pre></td></tr></table></figure><h2 id="crane-的使用"><a href="#crane-的使用" class="headerlink" title="crane 的使用"></a>crane 的使用</h2><p>这个工具是 Golang 写的，支持 Windows，单文件直接运行，比较方便，支持指定架构。</p><p><a href="https://github.com/google/go-containerregistry/blob/main/cmd/crane/README.md">https://github.com/google/go-containerregistry/blob/main/cmd/crane/README.md</a></p><h3 id="安装-1"><a href="#安装-1" class="headerlink" title="安装"></a>安装</h3><p>在：<a href="https://github.com/google/go-containerregistry/releases">https://github.com/google/go-containerregistry/releases</a> 下载二进制文件即可。</p><h3 id="认证-1"><a href="#认证-1" class="headerlink" title="认证"></a>认证</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">crane auth login registry.cn-hangzhou.aliyuncs.com -u &lt;username&gt; -p &lt;password&gt;</span><br></pre></td></tr></table></figure><p>认证信息存储在：<code>~/.docker/config.json</code></p><h3 id="拉取镜像-1"><a href="#拉取镜像-1" class="headerlink" title="拉取镜像"></a>拉取镜像</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># --platform linux/arm64 可以指定拉取特定架构的镜像</span></span><br><span class="line">crane pull --platform linux/arm64 nginx:1.27 nginx_1.27.tar</span><br></pre></td></tr></table></figure><h3 id="推送镜像-1"><a href="#推送镜像-1" class="headerlink" title="推送镜像"></a>推送镜像</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">crane push ./nginx_1.27.tar registry.cn-hangzhou.aliyuncs.com/iuxt/nginx:1.27</span><br></pre></td></tr></table></figure><h3 id="同步镜像"><a href="#同步镜像" class="headerlink" title="同步镜像"></a>同步镜像</h3><p>同步镜像会根据两个仓库的镜像摘要来确定是否同步对应的层，如果指定的层目标已存在是不会进行同步的，同步会更高效。</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">crane copy --platform linux/amd64 nginx:1.27 registry.cn-hangzhou.aliyuncs.com/iuxt/nginx:1.27</span><br></pre></td></tr></table></figure><p>查看仓库里有哪些 tag</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">crane <span class="built_in">ls</span> registry.cn-hangzhou.aliyuncs.com/iuxt/nginx</span><br></pre></td></tr></table></figure>]]>
    </content>
    <id>https://zahui.fan/posts/t5tiax/</id>
    <link href="https://zahui.fan/posts/t5tiax/"/>
    <published>2025-11-16T11:52:09.000Z</published>
    <summary>
      <![CDATA[<p>找了有两个开源项目比较不错，都可以完成镜像的迁移。</p>
<h2 id="crpy-的使用"><a href="#crpy-的使用" class="headerlink" title="crpy 的使用"></a>crpy 的使用</h2><p>crpy 使用 python 开发，有本地缓存，拉取和推送镜像速度比较快。使用体验比较接近 docker。<br>开源地址： <a]]>
    </summary>
    <title>无Docker环境进行容器镜像操作</title>
    <updated>2026-02-09T10:48:37.000Z</updated>
  </entry>
  <entry>
    <author>
      <name>张理坤</name>
    </author>
    <category term="容器" scheme="https://zahui.fan/categories/%E5%AE%B9%E5%99%A8/"/>
    <category term="配置记录" scheme="https://zahui.fan/tags/%E9%85%8D%E7%BD%AE%E8%AE%B0%E5%BD%95/"/>
    <category term="Linux" scheme="https://zahui.fan/tags/Linux/"/>
    <category term="Docker" scheme="https://zahui.fan/tags/Docker/"/>
    <category term="Container" scheme="https://zahui.fan/tags/Container/"/>
    <category term="Kubernetes" scheme="https://zahui.fan/tags/Kubernetes/"/>
    <category term="keepalived" scheme="https://zahui.fan/tags/keepalived/"/>
    <category term="kubeadm" scheme="https://zahui.fan/tags/kubeadm/"/>
    <content>
      <![CDATA[<blockquote><p>基于 ubuntu 使用 kubeadm 搭建集群， <a href="/posts/b86d9e9f/">centos部署文档</a>, 有疑问的地方可以看 <a href="https://kubernetes.io/zh/docs/setup/production-environment/tools/kubeadm/">官方文档</a></p></blockquote><h2 id="准备机器"><a href="#准备机器" class="headerlink" title="准备机器"></a>准备机器</h2><blockquote><p>我的机器详情如下, 配置至少为 4C4G</p></blockquote><table><thead><tr><th>hostname</th><th>IP</th><th>作用</th></tr></thead><tbody><tr><td>master1</td><td>10.0.0.11</td><td>k8s master 节点</td></tr><tr><td>master2</td><td>10.0.0.12</td><td>k8s master 节点</td></tr><tr><td>master3</td><td>10.0.0.13</td><td>k8s master 节点</td></tr><tr><td>worker1</td><td>10.0.0.21</td><td>k8s worker 节点</td></tr><tr><td>worker2</td><td>10.0.0.22</td><td>k8s worker 节点</td></tr></tbody></table><p>每台机器都做域名解析，或者绑定 hosts(可选但建议)</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">vim /etc/hosts</span><br><span class="line"></span><br><span class="line">10.0.0.11 master1</span><br><span class="line">10.0.0.12 master2</span><br><span class="line">10.0.0.13 master3</span><br></pre></td></tr></table></figure><h2 id="基础环境配置"><a href="#基础环境配置" class="headerlink" title="基础环境配置"></a>基础环境配置</h2><blockquote><p>基础环境是不管 master 还是 worker 都需要的环境</p></blockquote><ol><li>禁用 swap</li><li>确保每个节点上 MAC 地址和 product_uuid 的唯一性 <code>sudo cat /sys/class/dmi/id/product_uuid</code></li><li>修改 hostname</li><li>允许 iptables 检查桥接流量</li><li>关闭防火墙</li></ol><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">sudo</span> systemctl <span class="built_in">disable</span> --now ufw</span><br></pre></td></tr></table></figure><h3 id="安装-runtime"><a href="#安装-runtime" class="headerlink" title="安装 runtime"></a>安装 runtime</h3><div class="tabs"><div class="nav-tabs"><button type="button" class="tab active">Containerd</button><button type="button" class="tab">Docker</button></div><div class="tab-contents"><div class="tab-item-content active"><h4 id="先决条件"><a href="#先决条件" class="headerlink" title="先决条件"></a>先决条件</h4><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">cat</span> &lt;&lt;<span class="string">EOF | sudo tee /etc/modules-load.d/containerd.conf</span></span><br><span class="line"><span class="string">overlay</span></span><br><span class="line"><span class="string">br_netfilter</span></span><br><span class="line"><span class="string">EOF</span></span><br><span class="line"></span><br><span class="line"><span class="built_in">sudo</span> modprobe overlay</span><br><span class="line"><span class="built_in">sudo</span> modprobe br_netfilter</span><br><span class="line"></span><br><span class="line"><span class="comment"># 设置必需的 sysctl 参数，这些参数在重新启动后仍然存在。</span></span><br><span class="line"><span class="built_in">cat</span> &lt;&lt;<span class="string">EOF | sudo tee /etc/sysctl.d/99-kubernetes-cri.conf</span></span><br><span class="line"><span class="string">net.bridge.bridge-nf-call-iptables  = 1</span></span><br><span class="line"><span class="string">net.ipv4.ip_forward                 = 1</span></span><br><span class="line"><span class="string">net.bridge.bridge-nf-call-ip6tables = 1</span></span><br><span class="line"><span class="string">EOF</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># 应用 sysctl 参数而无需重新启动</span></span><br><span class="line"><span class="built_in">sudo</span> sysctl --system</span><br></pre></td></tr></table></figure><h4 id="安装"><a href="#安装" class="headerlink" title="安装"></a>安装</h4><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 安装依赖</span></span><br><span class="line"><span class="built_in">sudo</span> apt-get update</span><br><span class="line"><span class="built_in">sudo</span> apt-get install -y ca-certificates curl gnupg lsb-release</span><br><span class="line"></span><br><span class="line"><span class="comment"># 信任密钥</span></span><br><span class="line">curl -fsSL https://download.docker.com/linux/ubuntu/gpg | <span class="built_in">sudo</span> gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg</span><br><span class="line"></span><br><span class="line"><span class="comment"># 添加仓库</span></span><br><span class="line"><span class="built_in">echo</span> \</span><br><span class="line"><span class="string">&quot;deb [arch=<span class="subst">$(dpkg --print-architecture)</span> signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu \</span></span><br><span class="line"><span class="string"><span class="subst">$(lsb_release -cs)</span> stable&quot;</span> | <span class="built_in">sudo</span> <span class="built_in">tee</span> /etc/apt/sources.list.d/docker.list &gt; /dev/null</span><br><span class="line"></span><br><span class="line"><span class="comment"># 安装containerd</span></span><br><span class="line"><span class="built_in">sudo</span> apt update</span><br><span class="line"><span class="built_in">sudo</span> apt install -y containerd.io</span><br></pre></td></tr></table></figure><h4 id="配置"><a href="#配置" class="headerlink" title="配置"></a>配置</h4><p>生成默认配置</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">sudo</span> <span class="built_in">mkdir</span> -p /etc/containerd</span><br><span class="line">containerd config default | <span class="built_in">sudo</span> <span class="built_in">tee</span> /etc/containerd/config.toml</span><br></pre></td></tr></table></figure><p>结合 runc 使用 systemd cgroup 驱动，在 <code>/etc/containerd/config.toml</code> 中设置</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 结合 runc 使用 systemd cgroup 驱动，在 `/etc/containerd/config.toml` 中设置</span></span><br><span class="line">sed -i <span class="string">&#x27;s#SystemdCgroup = .*#SystemdCgroup = true#g&#x27;</span> /etc/containerd/config.toml</span><br><span class="line"></span><br><span class="line"><span class="comment"># 修改 pause容器 镜像，不能拉取官方镜像的可以使用阿里云镜像源</span></span><br><span class="line"><span class="comment"># sed -i &#x27;s#sandbox_image = .*#sandbox_image = &quot;registry.aliyuncs.com/google_containers/pause:3.9&quot;#g&#x27; /etc/containerd/config.toml</span></span><br><span class="line">sed -i <span class="string">&#x27;s#sandbox_image = .*#sandbox_image = &quot;registry.k8s.io/pause:3.10.1&quot;#g&#x27;</span> /etc/containerd/config.toml</span><br></pre></td></tr></table></figure><p><code>sudo systemctl restart containerd</code></p><h4 id="crictl-配置"><a href="#crictl-配置" class="headerlink" title="crictl 配置"></a>crictl 配置</h4><p>之前使用 docker 的时候，docker 给我们做了很多好用的工具，现在用了 containerd，管理容器我们用 cri 管理工具 crictl，创建配置文件</p><figure class="highlight yaml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line"><span class="string">cat</span> <span class="string">&gt;</span> <span class="string">/etc/crictl.yaml</span> <span class="string">&lt;&lt;-&#x27;EOF&#x27;</span></span><br><span class="line"><span class="attr">runtime-endpoint:</span> <span class="string">unix:///run/containerd/containerd.sock</span></span><br><span class="line"><span class="attr">debug:</span> <span class="literal">false</span></span><br><span class="line"><span class="string">EOF</span></span><br></pre></td></tr></table></figure></div><div class="tab-item-content"><h4 id="安装-Docker"><a href="#安装-Docker" class="headerlink" title="安装 Docker"></a>安装 Docker</h4><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">curl -fsSL get.docker.com | bash</span><br></pre></td></tr></table></figure><h4 id="配置-Doker"><a href="#配置-Doker" class="headerlink" title="配置 Doker"></a>配置 Doker</h4><figure class="highlight json"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br></pre></td><td class="code"><pre><span class="line">sudo mkdir /etc/docker</span><br><span class="line">cat &lt;&lt;EOF | sudo tee /etc/docker/daemon.json</span><br><span class="line"><span class="punctuation">&#123;</span></span><br><span class="line">  <span class="attr">&quot;exec-opts&quot;</span><span class="punctuation">:</span> <span class="punctuation">[</span><span class="string">&quot;native.cgroupdriver=systemd&quot;</span><span class="punctuation">]</span><span class="punctuation">,</span></span><br><span class="line">  <span class="attr">&quot;log-driver&quot;</span><span class="punctuation">:</span> <span class="string">&quot;json-file&quot;</span><span class="punctuation">,</span></span><br><span class="line">  <span class="attr">&quot;log-opts&quot;</span><span class="punctuation">:</span> <span class="punctuation">&#123;</span></span><br><span class="line">    <span class="attr">&quot;max-size&quot;</span><span class="punctuation">:</span> <span class="string">&quot;100m&quot;</span></span><br><span class="line">  <span class="punctuation">&#125;</span><span class="punctuation">,</span></span><br><span class="line">  <span class="attr">&quot;storage-driver&quot;</span><span class="punctuation">:</span> <span class="string">&quot;overlay2&quot;</span></span><br><span class="line"><span class="punctuation">&#125;</span></span><br><span class="line">EOF</span><br><span class="line"></span><br><span class="line">sudo systemctl enable --now docker</span><br></pre></td></tr></table></figure></div></div><div class="tab-to-top"><button type="button" aria-label="scroll to top"><i class="fas fa-arrow-up"></i></button></div></div><h3 id="安装-kubeadm、kubelet-和-kubectl"><a href="#安装-kubeadm、kubelet-和-kubectl" class="headerlink" title="安装 kubeadm、kubelet 和 kubectl"></a>安装 kubeadm、kubelet 和 kubectl</h3><blockquote><p>这一步需要科学上网, 不能科学上网的可以看看国内的源。</p></blockquote><p>更新 apt 包索引并安装使用 Kubernetes apt 仓库所需要的包：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">sudo</span> apt update</span><br><span class="line"><span class="built_in">sudo</span> apt-get install -y apt-transport-https ca-certificates curl gpg</span><br></pre></td></tr></table></figure><p>下载 Google Cloud 公开签名秘钥与添加 Kubernetes apt 仓库：</p><p>官方版本变更较快，详情查看官方文档<a href="https://kubernetes.io/zh-cn/docs/setup/production-environment/tools/kubeadm/install-kubeadm/">https://kubernetes.io/zh-cn/docs/setup/production-environment/tools/kubeadm/install-kubeadm/</a></p><p>更新 apt 包索引，安装 kubelet、kubeadm 和 kubectl，并锁定其版本：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br></pre></td><td class="code"><pre><span class="line">curl -fsSL https://pkgs.k8s.io/core:/stable:/v1.34/deb/Release.key | <span class="built_in">sudo</span> gpg --dearmor -o /etc/apt/keyrings/kubernetes-apt-keyring.gpg</span><br><span class="line"><span class="built_in">echo</span> <span class="string">&#x27;deb [signed-by=/etc/apt/keyrings/kubernetes-apt-keyring.gpg] https://pkgs.k8s.io/core:/stable:/v1.34/deb/ /&#x27;</span> | <span class="built_in">sudo</span> <span class="built_in">tee</span> /etc/apt/sources.list.d/kubernetes.list</span><br><span class="line"></span><br><span class="line"><span class="built_in">sudo</span> apt update</span><br><span class="line"></span><br><span class="line"><span class="comment"># 查看可用的版本号</span></span><br><span class="line"><span class="built_in">sudo</span> apt-cache madison kubeadm</span><br><span class="line"><span class="built_in">sudo</span> apt install -y kubeadm=1.34.5-1.1 kubelet=1.34.5-1.1 kubectl=1.34.5-1.1</span><br><span class="line"></span><br><span class="line"><span class="comment"># 锁定版本，不随 apt upgrade 更新</span></span><br><span class="line"><span class="built_in">sudo</span> apt-mark hold kubelet kubeadm kubectl</span><br><span class="line"><span class="built_in">sudo</span> systemctl <span class="built_in">enable</span> --now kubelet</span><br><span class="line"></span><br></pre></td></tr></table></figure><h2 id="准备高可用方案"><a href="#准备高可用方案" class="headerlink" title="准备高可用方案"></a>准备高可用方案</h2><p>高可用方案有很多种，其他方案请参考 <a href="/posts/10cef768/">Kubernetes之master高可用方案</a></p><p>这里使用<strong>每台</strong>节点部署 nginx 反代来实现高可用，这种方式需要<strong>所有</strong>节点都安装负载均衡 (包括 master 和 worker )</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">mkdir</span> -p /etc/kube-lb/&#123;conf,logs,sbin&#125;</span><br><span class="line"></span><br><span class="line">curl -L -C - https://s3.babudiu.com/src/linux/bin/kube-lb -o /etc/kube-lb/sbin/kube-lb</span><br><span class="line"><span class="built_in">chmod</span> +x /etc/kube-lb/sbin/kube-lb</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="built_in">cat</span> &gt; /etc/kube-lb/conf/kube-lb.conf &lt;&lt;<span class="string">&#x27;EOF&#x27;</span></span><br><span class="line">user root;</span><br><span class="line">worker_processes 1;</span><br><span class="line"></span><br><span class="line">error_log  /etc/kube-lb/logs/error.log warn;</span><br><span class="line"></span><br><span class="line">events &#123;</span><br><span class="line">    worker_connections  3000;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line">stream &#123;</span><br><span class="line">    upstream backend &#123;</span><br><span class="line">        server 10.0.0.11:6443    max_fails=2 fail_timeout=3s;</span><br><span class="line">        server 10.0.0.12:6443    max_fails=2 fail_timeout=3s;</span><br><span class="line">        server 10.0.0.13:6443    max_fails=2 fail_timeout=3s;</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    server &#123;</span><br><span class="line">        listen 127.0.0.1:8443;</span><br><span class="line">        proxy_connect_timeout 1s;</span><br><span class="line">        proxy_pass backend;</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br><span class="line">EOF</span><br><span class="line"></span><br><span class="line"><span class="built_in">cat</span> &gt; /etc/systemd/system/kube-lb.service &lt;&lt;<span class="string">&#x27;EOF&#x27;</span></span><br><span class="line">[Unit]</span><br><span class="line">Description=l4 nginx proxy <span class="keyword">for</span> kube-apiservers</span><br><span class="line">After=network.target</span><br><span class="line">After=network-online.target</span><br><span class="line">Wants=network-online.target</span><br><span class="line"></span><br><span class="line">[Service]</span><br><span class="line">Type=forking</span><br><span class="line">ExecStartPre=/etc/kube-lb/sbin/kube-lb -c /etc/kube-lb/conf/kube-lb.conf -p /etc/kube-lb -t</span><br><span class="line">ExecStart=/etc/kube-lb/sbin/kube-lb -c /etc/kube-lb/conf/kube-lb.conf -p /etc/kube-lb</span><br><span class="line">ExecReload=/etc/kube-lb/sbin/kube-lb -c /etc/kube-lb/conf/kube-lb.conf -p /etc/kube-lb -s reload</span><br><span class="line">PrivateTmp=<span class="literal">true</span></span><br><span class="line">Restart=always</span><br><span class="line">RestartSec=15</span><br><span class="line">StartLimitInterval=0</span><br><span class="line">LimitNOFILE=65536</span><br><span class="line"></span><br><span class="line">[Install]</span><br><span class="line">WantedBy=multi-user.target</span><br><span class="line">EOF</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="comment"># 启动服务</span></span><br><span class="line">systemctl <span class="built_in">enable</span> --now kube-lb</span><br></pre></td></tr></table></figure><div class="note default flat"><p>kube-lb 其实就是自己编译的 Nginx，精简了 http 模块，只开启了 stream 模块用作 4 层转发，详细参数如下：</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">nginx version: nginx/1.24.0</span><br><span class="line">built by gcc 4.8.5 20150623 (Red Hat 4.8.5-44) (GCC)</span><br><span class="line">configure arguments: --with-stream --without-http --without-http_uwsgi_module --without-http_scgi_module --without-http_fastcgi_module</span><br></pre></td></tr></table></figure></div><h2 id="创建集群"><a href="#创建集群" class="headerlink" title="创建集群"></a>创建集群</h2><h3 id="kubeadm-init"><a href="#kubeadm-init" class="headerlink" title="kubeadm init"></a>kubeadm init</h3><div class="tabs"><div class="nav-tabs"><button type="button" class="tab active">官方镜像源</button><button type="button" class="tab">国内阿里云镜像源</button></div><div class="tab-contents"><div class="tab-item-content active"><p>在 init 之前先将镜像拉取到本地（可选步骤）</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">kubeadm config images pull --kubernetes-version 1.34.5</span><br></pre></td></tr></table></figure><p>其中会拉下来一个 pause 镜像，尽量再修改一下 containerd 里面配置的 pause 镜像，版本保持一致。</p><p>在 k8s-master0 上执行</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">sudo</span> kubeadm init \</span><br><span class="line">--kubernetes-version 1.34.5 \</span><br><span class="line">--control-plane-endpoint <span class="string">&quot;127.0.0.1:8443&quot;</span> \</span><br><span class="line">--upload-certs \</span><br><span class="line">--service-cidr=10.96.0.0/12 \</span><br><span class="line">--pod-network-cidr=10.244.0.0/16</span><br></pre></td></tr></table></figure></div><div class="tab-item-content"><p>在 init 之前先将镜像拉取到本地（可选步骤）</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">kubeadm config images pull --kubernetes-version 1.34.5 --image-repository registry.cn-hangzhou.aliyuncs.com/google_containers</span><br></pre></td></tr></table></figure><p>在 k8s-master0 上执行</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">sudo</span> kubeadm init \</span><br><span class="line">--kubernetes-version 1.34.5 \</span><br><span class="line">--control-plane-endpoint <span class="string">&quot;127.0.0.1:8443&quot;</span> \</span><br><span class="line">--image-repository registry.cn-hangzhou.aliyuncs.com/google_containers \</span><br><span class="line">--upload-certs \</span><br><span class="line">--service-cidr=10.96.0.0/12 \</span><br><span class="line">--pod-network-cidr=10.244.0.0/16</span><br></pre></td></tr></table></figure></div></div><div class="tab-to-top"><button type="button" aria-label="scroll to top"><i class="fas fa-arrow-up"></i></button></div></div><blockquote><p>也可以用 <code>kubeadm config print init-defaults &gt; init.yaml</code> 生成 kubeadm 的配置，并用<br><code>kubeadm init --config=init.yaml</code> 来创建集群。</p></blockquote><h3 id="安装网络插件"><a href="#安装网络插件" class="headerlink" title="安装网络插件"></a>安装网络插件</h3><div class="tabs"><div class="nav-tabs"><button type="button" class="tab active">安装flannel插件</button><button type="button" class="tab">安装calico插件</button></div><div class="tab-contents"><div class="tab-item-content active"><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml</span><br></pre></td></tr></table></figure></div><div class="tab-item-content"><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">待补充</span><br></pre></td></tr></table></figure></div></div><div class="tab-to-top"><button type="button" aria-label="scroll to top"><i class="fas fa-arrow-up"></i></button></div></div><h2 id="常见问题"><a href="#常见问题" class="headerlink" title="常见问题"></a>常见问题</h2><p><a href="/posts/sepu3k/">kubeadm 部署的集群 常见问题汇总</a></p>]]>
    </content>
    <id>https://zahui.fan/posts/t4ve3m/</id>
    <link href="https://zahui.fan/posts/t4ve3m/"/>
    <published>2025-10-29T01:42:58.000Z</published>
    <summary>
      <![CDATA[<blockquote>
<p>基于 ubuntu 使用 kubeadm 搭建集群， <a href="/posts/b86d9e9f/">centos部署文档</a>, 有疑问的地方可以看 <a]]>
    </summary>
    <title>使用kubeadm部署一套高可用k8s集群1.34 for Ubuntu</title>
    <updated>2026-03-01T13:43:47.000Z</updated>
  </entry>
</feed>
