<?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-04-23T00:31:33.000Z</updated>
  <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-04-23T00:31:33.000Z</updated>
  </entry>
  <entry>
    <author>
      <name>张理坤</name>
    </author>
    <category term="容器" scheme="https://zahui.fan/categories/%E5%AE%B9%E5%99%A8/"/>
    <category term="Nginx" scheme="https://zahui.fan/tags/Nginx/"/>
    <category term="ingress" scheme="https://zahui.fan/tags/ingress/"/>
    <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="工具" scheme="https://zahui.fan/categories/%E5%B7%A5%E5%85%B7/"/>
    <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">sudo 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">sudo 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">sudo yum install -y yum-utils</span><br><span class="line">sudo 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">sudo 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">sudo 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">sudo 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">sudo <span class="built_in">cp</span> -i /etc/kubernetes/admin.conf <span class="variable">$HOME</span>/.kube/config</span><br><span class="line">sudo <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">sudo 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.ingeek.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.ingeek.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/%E5%AE%B9%E5%99%A8/"/>
    <category term="记录" scheme="https://zahui.fan/tags/%E8%AE%B0%E5%BD%95/"/>
    <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, time, <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="keepalived" scheme="https://zahui.fan/tags/keepalived/"/>
    <category term="Container" scheme="https://zahui.fan/tags/Container/"/>
    <category term="Kubernetes" scheme="https://zahui.fan/tags/Kubernetes/"/>
    <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">sudo 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">sudo modprobe overlay</span><br><span class="line">sudo 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">sudo 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">sudo apt-get update</span><br><span class="line">sudo 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 | sudo 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> | sudo <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">sudo apt update</span><br><span class="line">sudo 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">sudo <span class="built_in">mkdir</span> -p /etc/containerd</span><br><span class="line">containerd config default | sudo <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">sudo apt update</span><br><span class="line">sudo 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 | sudo 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> | sudo <span class="built_in">tee</span> /etc/apt/sources.list.d/kubernetes.list</span><br><span class="line"></span><br><span class="line">sudo apt update</span><br><span class="line"></span><br><span class="line"><span class="comment"># 查看可用的版本号</span></span><br><span class="line">sudo apt-cache madison kubeadm</span><br><span class="line">sudo 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">sudo apt-mark hold kubelet kubeadm kubectl</span><br><span class="line">sudo 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">sudo 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">sudo 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>
  <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/%E7%BD%91%E7%BB%9C/"/>
    <category term="iptables" scheme="https://zahui.fan/tags/iptables/"/>
    <category term="Docker" scheme="https://zahui.fan/tags/Docker/"/>
    <category term="容器" scheme="https://zahui.fan/tags/%E5%AE%B9%E5%99%A8/"/>
    <content>
      <![CDATA[<h2 id="为什么有这个需求"><a href="#为什么有这个需求" class="headerlink" title="为什么有这个需求"></a>为什么有这个需求</h2><p>假设有如下情况：</p><ol><li>这个服务很重要，很多服务在连，停服不知道会有什么影响。</li><li>服务是运行在 docker 里的，但是 docker 启动命令找不到了。</li><li>想给 docker 容器临时增加一个端口映射。</li></ol><h2 id="方法一、使用工具反向代理"><a href="#方法一、使用工具反向代理" class="headerlink" title="方法一、使用工具反向代理"></a>方法一、使用工具反向代理</h2><p>这个方法性能不如上面的 <code>iptables</code> 规则，比如可以用 <code>nginx</code> 的 <code>stream</code> 四层代理，或者用 <code>socat</code> 一条命令搞定。</p><h3 id="查看容器的-IP-地址"><a href="#查看容器的-IP-地址" class="headerlink" title="查看容器的 IP 地址"></a>查看容器的 IP 地址</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">docker inspect postgres</span><br></pre></td></tr></table></figure><p> 在结果中找到 <code>NetworkSettings</code> -&gt; <code>Networks</code> -&gt; <code>&lt;你的网络名称&gt;</code> -&gt; <code>IPAddress</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"># 安装 socat</span></span><br><span class="line">sudo apt-get install socat  <span class="comment"># Ubuntu/Debian</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># 创建端口转发，172.18.0.2 是容器的IP</span></span><br><span class="line">socat TCP-LISTEN:5432,fork TCP:172.18.0.2:5432</span><br><span class="line"></span><br></pre></td></tr></table></figure><h2 id="方法二、参照-Docker-原生的方式"><a href="#方法二、参照-Docker-原生的方式" class="headerlink" title="方法二、参照 Docker 原生的方式"></a>方法二、参照 Docker 原生的方式</h2><p>docker 的 -p 命令来进行端口映射，本质上也是维护了一套 iptables 规则来实现的，docker-proxy 会维护 docker 需要的 iptables 规则，执行 <code>iptables-save</code> 可以查看所有的规则 (<code>iptables-save</code> 并不会真的 save，想保存 <code>iptables</code> 规则还需要额外的操作)。</p><h3 id="获取容器的-IP-地址"><a href="#获取容器的-IP-地址" class="headerlink" title="获取容器的 IP 地址"></a>获取容器的 IP 地址</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">docker inspect postgres</span><br></pre></td></tr></table></figure><p> 在结果中找到 <code>NetworkSettings</code> -&gt; <code>Networks</code> -&gt; <code>&lt;你的网络名称&gt;</code> -&gt; <code>IPAddress</code></p><h3 id="查看-docker-的虚拟网卡"><a href="#查看-docker-的虚拟网卡" class="headerlink" title="查看 docker 的虚拟网卡"></a>查看 docker 的虚拟网卡</h3><p>docker 的一个 bridge 网卡就对应了 linux 机器上的一个网卡，要新增端口映射，需要知道你的容器连接的虚拟网卡是什么。</p><p>比如我想让 Postgres 的 5432 端口映射到外网，先查看 Postgres 的容器信息。</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">docker inspect postgres</span><br></pre></td></tr></table></figure><p>在结果中找到 <code>NetworkSettings</code> -&gt; <code>Networks</code> -&gt; <code>&lt;你的网络名称&gt;</code> -&gt; <code>Gateway</code> ，记录一下网关的 IP</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">ip addr</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/2025/09/32b6758667d0085e2bc258757097522b.png" alt="image.png|511"></p><p>可以知道网卡的名称是 <code>br-342eceae259f</code></p><h3 id="配置-iptables-规则"><a href="#配置-iptables-规则" class="headerlink" title="配置 iptables 规则"></a>配置 iptables 规则</h3><p>比如我的容器 IP：172.18.0.2<br>Docker 虚拟网卡：br-342eceae259f<br>要映射的端口：5432</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">iptables -A DOCKER-USER -o br-342eceae259f ! -i br-342eceae259f -d 172.18.0.2/32 -m tcp -p tcp --dport 5432 -j ACCEPT</span><br><span class="line">iptables -t nat -A DOCKER ! -i br-342eceae259f -p tcp -m tcp --dport 5432 -j DNAT --to-destination 172.18.0.2:5432</span><br></pre></td></tr></table></figure><p>不需要做 SNAT，因为 Docker 默认已经做了 SNAT 了。<br><img src="https://s3.babudiu.com/iuxt/public/nes.svg" data-lazy-src="https://s3.babudiu.com/iuxt/2025/09/7c09d3c4ce37d93f4a75f3a645d45d2f.png" alt="image.png|705"></p><h2 id="方法三、传统的-iptables-规则"><a href="#方法三、传统的-iptables-规则" class="headerlink" title="方法三、传统的 iptables 规则"></a>方法三、传统的 iptables 规则</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><span class="line">19</span><br><span class="line">20</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#!/bin/bash</span></span><br><span class="line"></span><br><span class="line">IP=10.0.0.21</span><br><span class="line">PORT=8000</span><br><span class="line">CONTAINER_IP=172.17.0.2</span><br><span class="line">CONTAINER_PORT=80</span><br><span class="line"></span><br><span class="line"><span class="comment"># 这个是DNAT，到本机的流量，重写目的地址为容器</span></span><br><span class="line">iptables -t nat -A PREROUTING -4 -p tcp -d <span class="variable">$&#123;IP&#125;</span> --dport <span class="variable">$&#123;PORT&#125;</span> -j DNAT --to-destination <span class="variable">$&#123;CONTAINER_IP&#125;</span>:<span class="variable">$&#123;CONTAINER_PORT&#125;</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># 这个是为了本机也可以通过访问自己的IP和端口来访问</span></span><br><span class="line">iptables -t nat -A OUTPUT -4 -p tcp -d <span class="variable">$&#123;IP&#125;</span> --dport <span class="variable">$&#123;PORT&#125;</span> -j DNAT --to-destination <span class="variable">$&#123;CONTAINER_IP&#125;</span>:<span class="variable">$&#123;CONTAINER_PORT&#125;</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># 注意这两条，需要将规则插到最上面，或者加入到DOCKER-USER链，配合下面的图理解</span></span><br><span class="line">iptables -I FORWARD -p tcp -d <span class="variable">$&#123;CONTAINER_IP&#125;</span> --dport <span class="variable">$&#123;CONTAINER_PORT&#125;</span> -j ACCEPT</span><br><span class="line">iptables -I FORWARD -p tcp -s <span class="variable">$&#123;CONTAINER_IP&#125;</span> --sport <span class="variable">$&#123;CONTAINER_PORT&#125;</span> -j ACCEPT</span><br><span class="line"></span><br><span class="line"><span class="comment"># 这个是SNAT规则，数据包回包</span></span><br><span class="line">iptables -t nat -A POSTROUTING -4 -p tcp -d <span class="variable">$&#123;CONTAINER_IP&#125;</span> --dport <span class="variable">$&#123;CONTAINER_PORT&#125;</span> -j SNAT --to-source <span class="variable">$&#123;IP&#125;</span></span><br><span class="line"></span><br></pre></td></tr></table></figure><p>如果规则不加，或加在了 DOCKER-USER 的下面，会兜兜转转，最后匹配到了 DROP</p><p><img src="https://s3.babudiu.com/iuxt/public/nes.svg" data-lazy-src="https://s3.babudiu.com/iuxt/2025/09/415b32397c6d32a942372431287b7280.png" alt="image.png|534"></p><p>知道了原理后，那么还有一种方法：删除这个 DROP（不要这么做）</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"><span class="comment"># iptables -D DOCKER ! -i docker0 -o docker0 -j DROP</span></span><br></pre></td></tr></table></figure>]]>
    </content>
    <id>https://zahui.fan/posts/t37flu/</id>
    <link href="https://zahui.fan/posts/t37flu/"/>
    <published>2025-09-26T16:39:30.000Z</published>
    <summary>
      <![CDATA[<h2 id="为什么有这个需求"><a href="#为什么有这个需求" class="headerlink" title="为什么有这个需求"></a>为什么有这个需求</h2><p>假设有如下情况：</p>
<ol>
<li>这个服务很重要，很多服务在连，停服不知道会有什么影响。</li>
<li>服务是运行在 docker 里的，但是 docker]]>
    </summary>
    <title>正在运行的Docker容器增加端口映射</title>
    <updated>2025-10-04T15:24:34.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/"/>
    <category term="VPN" scheme="https://zahui.fan/tags/VPN/"/>
    <content>
      <![CDATA[<p>要先打开服务器的内核转发：<code>net.ipv4.ip_forward = 1</code><br>假设 WireGuard 自身的虚拟网段是 <code>10.8.0.0/24</code>, 给服务器分配的 IP 是：<code>10.8.0.1</code>，服务器的公网 IP 是：<code>124.221.31.148</code></p><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><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"># Ubuntu安装 WireGuard</span></span><br><span class="line">sudo apt-get install -y wireguard</span><br><span class="line"></span><br><span class="line"><span class="comment"># CentOS 安装 WireGuard</span></span><br><span class="line">sudo yum install -y wireguard-tools</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 class="string">&quot;net.ipv4.ip_forward = 1&quot;</span> &gt;&gt; /etc/sysctl.conf</span><br><span class="line">sysctl -p</span><br><span class="line"></span><br><span class="line"><span class="comment"># 配置目录创建</span></span><br><span class="line"><span class="built_in">mkdir</span> -p /etc/wireguard</span><br><span class="line"><span class="built_in">cd</span> /etc/wireguard</span><br><span class="line"><span class="built_in">umask</span> 077</span><br></pre></td></tr></table></figure><h2 id="生成公私钥对"><a href="#生成公私钥对" class="headerlink" title="生成公私钥对"></a>生成公私钥对</h2><p>先生成一些公私钥对，服务器需要 1 个，每个客户端 1 个。</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">wg genkey &gt; server_privatekey</span><br><span class="line">wg pubkey &lt; server_privatekey &gt; server_publickey</span><br><span class="line"></span><br><span class="line"><span class="comment"># Client1 的公私钥和预共享密钥</span></span><br><span class="line">wg genkey &gt; client1_privatekey</span><br><span class="line">wg pubkey &lt; client1_privatekey &gt; client1_publickey</span><br><span class="line">wg genpsk &gt; client1_preSharedKey</span><br><span class="line"></span><br><span class="line"><span class="comment"># Client2 的公私钥和预共享密钥</span></span><br><span class="line">wg genkey &gt; client2_privatekey</span><br><span class="line">wg pubkey &lt; client2_privatekey &gt; client2_publickey</span><br><span class="line">wg genpsk &gt; client2_preSharedKey</span><br></pre></td></tr></table></figure><p>那么服务器的配置文件 <code>wg0.conf</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><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></pre></td><td class="code"><pre><span class="line"><span class="built_in">echo</span> <span class="string">&quot;</span></span><br><span class="line"><span class="string"># Server</span></span><br><span class="line"><span class="string">[Interface]</span></span><br><span class="line"><span class="string">PrivateKey = <span class="subst">$(cat server_privatekey)</span></span></span><br><span class="line"><span class="string">Address = 10.8.0.1/24</span></span><br><span class="line"><span class="string">ListenPort = 51820</span></span><br><span class="line"><span class="string">MTU = 1420</span></span><br><span class="line"><span class="string">PreUp =</span></span><br><span class="line"><span class="string">PostUp = iptables -t nat -A POSTROUTING -s 10.8.0.0/24 -o eth0 -j MASQUERADE</span></span><br><span class="line"><span class="string">PostUp = iptables -A INPUT -p udp -m udp --dport 51820 -j ACCEPT</span></span><br><span class="line"><span class="string">PostUp = iptables -A FORWARD -i %i -j ACCEPT</span></span><br><span class="line"><span class="string">PostUp = iptables -A FORWARD -o %i -j ACCEPT</span></span><br><span class="line"><span class="string">PreDown =</span></span><br><span class="line"><span class="string">PostDown = iptables -t nat -D POSTROUTING -s 10.8.0.0/24 -o eth0 -j MASQUERADE</span></span><br><span class="line"><span class="string">PostDown = iptables -D INPUT -p udp -m udp --dport 51820 -j ACCEPT</span></span><br><span class="line"><span class="string">PostDown = iptables -D FORWARD -i %i -j ACCEPT</span></span><br><span class="line"><span class="string">PostDown = iptables -D FORWARD -o %i -j ACCEPT</span></span><br><span class="line"><span class="string"></span></span><br><span class="line"><span class="string"># Client 1</span></span><br><span class="line"><span class="string">[Peer]</span></span><br><span class="line"><span class="string">PublicKey = <span class="subst">$(cat client1_publickey)</span></span></span><br><span class="line"><span class="string">PresharedKey = <span class="subst">$(cat client1_preSharedKey)</span></span></span><br><span class="line"><span class="string">AllowedIPs = 10.8.0.2/32, 192.168.1.0/24</span></span><br><span class="line"><span class="string"></span></span><br><span class="line"><span class="string"># Client 2</span></span><br><span class="line"><span class="string">[Peer]</span></span><br><span class="line"><span class="string">PublicKey = <span class="subst">$(cat client2_publickey)</span></span></span><br><span class="line"><span class="string">PresharedKey = <span class="subst">$(cat client2_preSharedKey)</span></span></span><br><span class="line"><span class="string">AllowedIPs = 10.8.0.3/32&quot;</span> &gt; wg0.conf</span><br></pre></td></tr></table></figure><ul><li>AllowedIPs 表示这些 IP&#x2F;段，发送到这个 Peer 上。</li></ul><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">systemctl <span class="built_in">enable</span> --now wg-quick@wg0</span><br></pre></td></tr></table></figure><h2 id="Client-1-配置"><a href="#Client-1-配置" class="headerlink" title="Client 1 配置"></a>Client 1 配置</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></pre></td><td class="code"><pre><span class="line"><span class="built_in">echo</span> <span class="string">&quot;</span></span><br><span class="line"><span class="string">[Interface]</span></span><br><span class="line"><span class="string">PrivateKey = <span class="subst">$(cat client1_privatekey)</span></span></span><br><span class="line"><span class="string">Address = 10.8.0.2/24</span></span><br><span class="line"><span class="string">DNS = 1.1.1.1</span></span><br><span class="line"><span class="string">MTU = 1420</span></span><br><span class="line"><span class="string"></span></span><br><span class="line"><span class="string">[Peer]</span></span><br><span class="line"><span class="string">PublicKey = <span class="subst">$(cat server_publickey)</span></span></span><br><span class="line"><span class="string">PresharedKey = <span class="subst">$(cat client1_preSharedKey)</span></span></span><br><span class="line"><span class="string">AllowedIPs = 10.8.0.0/24</span></span><br><span class="line"><span class="string">PersistentKeepalive = 0</span></span><br><span class="line"><span class="string">Endpoint = 124.221.31.148:51820 &quot;</span> &gt; client1.conf</span><br></pre></td></tr></table></figure><ul><li>AllowedIPs 表示这些 IP&#x2F;段，发送到这个 Peer 上。</li><li>Endpoint 是这个 Peer 的入口，这里配置的就是服务器的端口。</li></ul><h2 id="Client-2-配置"><a href="#Client-2-配置" class="headerlink" title="Client 2 配置"></a>Client 2 配置</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></pre></td><td class="code"><pre><span class="line"><span class="built_in">echo</span> <span class="string">&quot;</span></span><br><span class="line"><span class="string">[Interface]</span></span><br><span class="line"><span class="string">PrivateKey = <span class="subst">$(cat client2_privatekey)</span></span></span><br><span class="line"><span class="string">Address = 10.8.0.3/24</span></span><br><span class="line"><span class="string">DNS = 1.1.1.1</span></span><br><span class="line"><span class="string">MTU = 1420</span></span><br><span class="line"><span class="string"></span></span><br><span class="line"><span class="string">[Peer]</span></span><br><span class="line"><span class="string">PublicKey = <span class="subst">$(cat server_publickey)</span></span></span><br><span class="line"><span class="string">PresharedKey = <span class="subst">$(cat client2_preSharedKey)</span></span></span><br><span class="line"><span class="string">AllowedIPs = 10.8.0.0/24</span></span><br><span class="line"><span class="string">PersistentKeepalive = 0</span></span><br><span class="line"><span class="string">Endpoint = 124.221.31.148:51820 &quot;</span> &gt; client2.conf</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><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="comment"># 启动WireGuard</span></span><br><span class="line">wg-quick up wg0</span><br><span class="line"></span><br><span class="line"><span class="comment"># 停止WireGuard</span></span><br><span class="line">wg-quick down wg0</span><br><span class="line"></span><br><span class="line"><span class="comment"># 查看状态</span></span><br><span class="line">wg</span><br><span class="line"></span><br><span class="line"><span class="comment"># 重启WireGuard</span></span><br><span class="line">wg-quick down wg0 &amp;&amp; wg-quick up wg0 &amp;&amp; wg</span><br></pre></td></tr></table></figure><p>wg-quick 可以自动创建网卡</p><h2 id="实际案例"><a href="#实际案例" class="headerlink" title="实际案例"></a>实际案例</h2><p>从 client1 可以直接访问 client2 的虚拟 IP：根据 AllowIPs 配置，client1 的所有流量都会转发给 server，server 接收到请求 10.8.0.3 的流量，根据 server 的 AllowIPs 配置，转发给了 client2，回包同理。<br><img src="https://s3.babudiu.com/iuxt/public/nes.svg" data-lazy-src="https://s3.babudiu.com/iuxt/2025/09/9218825ab5b76337fa0bbae5a24e3c8c.png" alt="image.png|776"></p><p>如果想打通两个内网，需要将对方的内网 IP 段添加到 AllowIPs 列表里。并且在内网机器上添加路由。</p><table><thead><tr><th>名称</th><th>说明</th></tr></thead><tbody><tr><td>机器 A IP</td><td>10.0.1.3&#x2F;24</td></tr><tr><td>机器 B IP</td><td>10.0.2.3&#x2F;24</td></tr></tbody></table><h3 id="机器-A"><a href="#机器-A" class="headerlink" title="机器 A"></a>机器 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></pre></td><td class="code"><pre><span class="line"># /etc/wireguard/wg0.conf on Server A</span><br><span class="line">[Interface]</span><br><span class="line">Address = 10.200.200.1/24</span><br><span class="line">ListenPort = 51820</span><br><span class="line">PrivateKey = &lt;Server_A_Private_Key&gt;</span><br><span class="line"># Enable IP forwarding</span><br><span class="line">PostUp = iptables -A FORWARD -i %i -j ACCEPT; iptables -A FORWARD -o %i -j ACCEPT; iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE</span><br><span class="line">PostDown = iptables -D FORWARD -i %i -j ACCEPT; iptables -D FORWARD -o %i -j ACCEPT; iptables -t nat -D POSTROUTING -o eth0 -j MASQUERADE</span><br><span class="line"></span><br><span class="line">[Peer]</span><br><span class="line"># Server B</span><br><span class="line">PublicKey = &lt;Server_B_Public_Key&gt;</span><br><span class="line">AllowedIPs = 10.200.200.2/32, 10.0.2.0/24 # 关键：包含对端内网网段</span><br><span class="line">Endpoint = 10.0.2.3:51820</span><br><span class="line">PersistentKeepalive = 25</span><br></pre></td></tr></table></figure><p>如果机器 A 是内网的网关，那么它就已经是默认路由了。否则机器 A 局域网内的其他机器需要手动添加一条路由规则：</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"># Linux</span></span><br><span class="line">sudo ip route add 10.0.2.0/24 via 10.0.2.3</span><br><span class="line"></span><br><span class="line"><span class="comment"># Windows (以管理员身份运行 PowerShell)</span></span><br><span class="line">route add 10.0.2.0 mask 255.255.255.0 10.0.2.3</span><br></pre></td></tr></table></figure><h3 id="机器-B"><a href="#机器-B" class="headerlink" title="机器 B"></a>机器 B</h3><p>和 A 同理。</p>]]>
    </content>
    <id>https://zahui.fan/posts/t22j7t/</id>
    <link href="https://zahui.fan/posts/t22j7t/"/>
    <published>2025-09-04T14:35:52.000Z</published>
    <summary>
      <![CDATA[<p>要先打开服务器的内核转发：<code>net.ipv4.ip_forward = 1</code><br>假设 WireGuard 自身的虚拟网段是 <code>10.8.0.0/24</code>, 给服务器分配的 IP 是：<code>10.8.0.1</code>，服务器的公网 IP 是：<code>124.221.31.148</code></p>
<h2]]>
    </summary>
    <title>轻量级组网工具WireGuard</title>
    <updated>2025-09-05T15:03:45.000Z</updated>
  </entry>
  <entry>
    <author>
      <name>张理坤</name>
    </author>
    <category term="容器" scheme="https://zahui.fan/categories/%E5%AE%B9%E5%99%A8/"/>
    <content>
      <![CDATA[<ol><li>Elasticsearch 有自己的高可用集群机制，不建议再用 k8s 管理</li><li>适用于临时使用一下、或者测试使用</li></ol><h2 id="数据存储问题"><a href="#数据存储问题" class="headerlink" title="数据存储问题"></a>数据存储问题</h2><p>为了测试使用，我也没有用 pvc 来管理数据，而是选择了 hostpath，那么为了重启也可以正常访问数据，需要将 es 固定在一个节点上。</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></pre></td><td class="code"><pre><span class="line"><span class="attr">apiVersion:</span> <span class="string">apps/v1</span></span><br><span class="line"><span class="attr">kind:</span> <span class="string">Deployment</span></span><br><span class="line"><span class="attr">metadata:</span></span><br><span class="line">  <span class="attr">name:</span> <span class="string">elasticsearch</span></span><br><span class="line">  <span class="attr">labels:</span></span><br><span class="line">    <span class="attr">app:</span> <span class="string">elasticsearch</span></span><br><span class="line"><span class="attr">spec:</span></span><br><span class="line">  <span class="attr">replicas:</span> <span class="number">1</span></span><br><span class="line">  <span class="attr">selector:</span></span><br><span class="line">    <span class="attr">matchLabels:</span></span><br><span class="line">      <span class="attr">app:</span> <span class="string">elasticsearch</span></span><br><span class="line">  <span class="attr">template:</span></span><br><span class="line">    <span class="attr">metadata:</span></span><br><span class="line">      <span class="attr">labels:</span></span><br><span class="line">        <span class="attr">app:</span> <span class="string">elasticsearch</span></span><br><span class="line">    <span class="attr">spec:</span></span><br><span class="line">      <span class="attr">nodeSelector:</span></span><br><span class="line">        <span class="attr">kubernetes.io/hostname:</span> <span class="string">iuxt</span></span><br><span class="line">      <span class="attr">containers:</span></span><br><span class="line">      <span class="bullet">-</span> <span class="attr">name:</span> <span class="string">elasticsearch</span></span><br><span class="line">        <span class="attr">image:</span> <span class="string">sls-registry.cn-hangzhou.cr.aliyuncs.com/kproxy/elasticsearch:7.17.26</span></span><br><span class="line">        <span class="attr">env:</span></span><br><span class="line">          <span class="bullet">-</span> <span class="attr">name:</span> <span class="string">discovery.type</span></span><br><span class="line">            <span class="attr">value:</span> <span class="string">single-node</span></span><br><span class="line">          <span class="bullet">-</span> <span class="attr">name:</span> <span class="string">ELASTIC_USERNAME</span></span><br><span class="line">            <span class="attr">value:</span> <span class="string">elastic</span></span><br><span class="line">          <span class="bullet">-</span> <span class="attr">name:</span> <span class="string">ELASTIC_PASSWORD</span></span><br><span class="line">            <span class="attr">value:</span> <span class="string">&quot;jjxkjkdgkdjgkkdjgk&quot;</span></span><br><span class="line">          <span class="bullet">-</span> <span class="attr">name:</span> <span class="string">ES_JAVA_OPTS</span></span><br><span class="line">            <span class="attr">value:</span> <span class="string">&quot;-Xms1G -Xmx1G&quot;</span></span><br><span class="line">          <span class="bullet">-</span> <span class="attr">name:</span> <span class="string">xpack.security.enabled</span></span><br><span class="line">            <span class="attr">value:</span> <span class="string">&quot;true&quot;</span></span><br><span class="line">        <span class="attr">ports:</span></span><br><span class="line">        <span class="bullet">-</span> <span class="attr">containerPort:</span> <span class="number">9200</span></span><br><span class="line">          <span class="attr">name:</span> <span class="string">http</span></span><br><span class="line">        <span class="bullet">-</span> <span class="attr">containerPort:</span> <span class="number">9300</span></span><br><span class="line">          <span class="attr">name:</span> <span class="string">transport</span></span><br><span class="line">        <span class="attr">volumeMounts:</span></span><br><span class="line">        <span class="bullet">-</span> <span class="attr">name:</span> <span class="string">data</span></span><br><span class="line">          <span class="attr">mountPath:</span> <span class="string">/usr/share/elasticsearch/data</span></span><br><span class="line">      <span class="attr">volumes:</span></span><br><span class="line">      <span class="bullet">-</span> <span class="attr">name:</span> <span class="string">data</span></span><br><span class="line">        <span class="attr">hostPath:</span></span><br><span class="line">          <span class="attr">path:</span> <span class="string">/data/elasticsearch</span></span><br><span class="line">          <span class="attr">type:</span> <span class="string">DirectoryOrCreate</span></span><br></pre></td></tr></table></figure><p>这里我使用 nodeSelector 指定了一个标签来选择节点。</p><h2 id="问题"><a href="#问题" class="headerlink" title="问题"></a>问题</h2><p>日志停留在：<code>Created elasticsearch keystore in /usr/share/elasticsearch/config/elasticsearch.keystore</code><br>然后自动重启</p><p>到主机的 <code>/data/elasticsearch</code> 目录查看，是空的</p><p>这种情况是没有权限写入，用 pvc 没有这个问题，直接挂载 hostpath 就会有权限问题，因为 es 这个容器不是使用 root 运行的进程，而是用的 uid:1000 这个用户来运行的。</p><p>解决方法是：使用 init container 来修复目录权限 ，init container 太适合来做这个事情了</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></pre></td><td class="code"><pre><span class="line"><span class="attr">apiVersion:</span> <span class="string">apps/v1</span></span><br><span class="line"><span class="attr">kind:</span> <span class="string">Deployment</span></span><br><span class="line"><span class="attr">metadata:</span></span><br><span class="line">  <span class="attr">name:</span> <span class="string">elasticsearch</span></span><br><span class="line">  <span class="attr">labels:</span></span><br><span class="line">    <span class="attr">app:</span> <span class="string">elasticsearch</span></span><br><span class="line"><span class="attr">spec:</span></span><br><span class="line">  <span class="attr">replicas:</span> <span class="number">1</span></span><br><span class="line">  <span class="attr">selector:</span></span><br><span class="line">    <span class="attr">matchLabels:</span></span><br><span class="line">      <span class="attr">app:</span> <span class="string">elasticsearch</span></span><br><span class="line">  <span class="attr">template:</span></span><br><span class="line">    <span class="attr">metadata:</span></span><br><span class="line">      <span class="attr">labels:</span></span><br><span class="line">        <span class="attr">app:</span> <span class="string">elasticsearch</span></span><br><span class="line">    <span class="attr">spec:</span></span><br><span class="line">      <span class="attr">nodeSelector:</span></span><br><span class="line">        <span class="attr">kubernetes.io/hostname:</span> <span class="string">iuxt</span></span><br><span class="line">      <span class="attr">initContainers:</span></span><br><span class="line">      <span class="bullet">-</span> <span class="attr">name:</span> <span class="string">fix-permissions</span></span><br><span class="line">        <span class="attr">image:</span> <span class="string">busybox</span></span><br><span class="line">        <span class="attr">command:</span> [<span class="string">&quot;sh&quot;</span>, <span class="string">&quot;-c&quot;</span>, <span class="string">&quot;chown -R 1000:1000 /usr/share/elasticsearch/data&quot;</span>]</span><br><span class="line">        <span class="attr">volumeMounts:</span></span><br><span class="line">        <span class="bullet">-</span> <span class="attr">name:</span> <span class="string">data</span></span><br><span class="line">          <span class="attr">mountPath:</span> <span class="string">/usr/share/elasticsearch/data</span></span><br><span class="line">      <span class="attr">containers:</span></span><br><span class="line">      <span class="bullet">-</span> <span class="attr">name:</span> <span class="string">elasticsearch</span></span><br><span class="line">        <span class="attr">image:</span> <span class="string">sls-registry.cn-hangzhou.cr.aliyuncs.com/kproxy/elasticsearch:7.17.26</span></span><br><span class="line">        <span class="attr">env:</span></span><br><span class="line">          <span class="bullet">-</span> <span class="attr">name:</span> <span class="string">discovery.type</span></span><br><span class="line">            <span class="attr">value:</span> <span class="string">single-node</span></span><br><span class="line">          <span class="bullet">-</span> <span class="attr">name:</span> <span class="string">ELASTIC_USERNAME</span></span><br><span class="line">            <span class="attr">value:</span> <span class="string">elastic</span></span><br><span class="line">          <span class="bullet">-</span> <span class="attr">name:</span> <span class="string">ELASTIC_PASSWORD</span></span><br><span class="line">            <span class="attr">value:</span> <span class="string">&quot;jjxkjkdgkdjgkkdjgk&quot;</span></span><br><span class="line">          <span class="bullet">-</span> <span class="attr">name:</span> <span class="string">ES_JAVA_OPTS</span></span><br><span class="line">            <span class="attr">value:</span> <span class="string">&quot;-Xms1G -Xmx1G&quot;</span></span><br><span class="line">          <span class="bullet">-</span> <span class="attr">name:</span> <span class="string">xpack.security.enabled</span></span><br><span class="line">            <span class="attr">value:</span> <span class="string">&quot;true&quot;</span></span><br><span class="line">        <span class="attr">ports:</span></span><br><span class="line">        <span class="bullet">-</span> <span class="attr">containerPort:</span> <span class="number">9200</span></span><br><span class="line">          <span class="attr">name:</span> <span class="string">http</span></span><br><span class="line">        <span class="bullet">-</span> <span class="attr">containerPort:</span> <span class="number">9300</span></span><br><span class="line">          <span class="attr">name:</span> <span class="string">transport</span></span><br><span class="line">        <span class="attr">volumeMounts:</span></span><br><span class="line">        <span class="bullet">-</span> <span class="attr">name:</span> <span class="string">data</span></span><br><span class="line">          <span class="attr">mountPath:</span> <span class="string">/usr/share/elasticsearch/data</span></span><br><span class="line">      <span class="attr">volumes:</span></span><br><span class="line">      <span class="bullet">-</span> <span class="attr">name:</span> <span class="string">data</span></span><br><span class="line">        <span class="attr">hostPath:</span></span><br><span class="line">          <span class="attr">path:</span> <span class="string">/data/elasticsearch</span></span><br><span class="line">          <span class="attr">type:</span> <span class="string">DirectoryOrCreate</span></span><br></pre></td></tr></table></figure><p>这样就解决了权限问题：</p><h2 id="部署-kibana"><a href="#部署-kibana" class="headerlink" title="部署 kibana"></a>部署 kibana</h2><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><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br><span class="line">84</span><br><span class="line">85</span><br><span class="line">86</span><br><span class="line">87</span><br><span class="line">88</span><br><span class="line">89</span><br><span class="line">90</span><br><span class="line">91</span><br><span class="line">92</span><br><span class="line">93</span><br><span class="line">94</span><br><span class="line">95</span><br><span class="line">96</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">---</span></span><br><span class="line"><span class="attr">kind:</span> <span class="string">Deployment</span></span><br><span class="line"><span class="attr">apiVersion:</span> <span class="string">apps/v1</span></span><br><span class="line"><span class="attr">metadata:</span></span><br><span class="line">  <span class="attr">namespace:</span> <span class="string">default</span></span><br><span class="line">  <span class="attr">labels:</span></span><br><span class="line">    <span class="attr">app:</span> <span class="string">kibana</span></span><br><span class="line">  <span class="attr">name:</span> <span class="string">kibana</span></span><br><span class="line"><span class="attr">spec:</span></span><br><span class="line">  <span class="attr">replicas:</span> <span class="number">1</span></span><br><span class="line">  <span class="attr">selector:</span></span><br><span class="line">    <span class="attr">matchLabels:</span></span><br><span class="line">      <span class="attr">app:</span> <span class="string">kibana</span></span><br><span class="line">  <span class="attr">template:</span></span><br><span class="line">    <span class="attr">metadata:</span></span><br><span class="line">      <span class="attr">labels:</span></span><br><span class="line">        <span class="attr">app:</span> <span class="string">kibana</span></span><br><span class="line">    <span class="attr">spec:</span></span><br><span class="line">      <span class="attr">containers:</span></span><br><span class="line">      <span class="bullet">-</span> <span class="attr">name:</span> <span class="string">kibana</span></span><br><span class="line">        <span class="attr">image:</span> <span class="string">sls-registry.cn-hangzhou.cr.aliyuncs.com/kproxy/kibana:7.17.26</span></span><br><span class="line">        <span class="attr">ports:</span></span><br><span class="line">          <span class="bullet">-</span> <span class="attr">containerPort:</span> <span class="number">5601</span></span><br><span class="line">            <span class="attr">protocol:</span> <span class="string">TCP</span></span><br><span class="line">        <span class="attr">volumeMounts:</span></span><br><span class="line">          <span class="bullet">-</span> <span class="attr">name:</span> <span class="string">kibana-config</span></span><br><span class="line">            <span class="attr">mountPath:</span> <span class="string">/usr/share/kibana/config</span></span><br><span class="line">        <span class="attr">resources:</span></span><br><span class="line">          <span class="attr">limits:</span></span><br><span class="line">            <span class="attr">memory:</span> <span class="string">&quot;4Gi&quot;</span></span><br><span class="line">            <span class="attr">cpu:</span> <span class="string">&quot;2&quot;</span></span><br><span class="line">          <span class="attr">requests:</span> </span><br><span class="line">            <span class="attr">memory:</span> <span class="string">&quot;2Gi&quot;</span></span><br><span class="line">            <span class="attr">cpu:</span> <span class="string">&quot;2&quot;</span></span><br><span class="line">      <span class="attr">volumes:</span></span><br><span class="line">      <span class="bullet">-</span> <span class="attr">name:</span> <span class="string">kibana-config</span></span><br><span class="line">        <span class="attr">configMap:</span></span><br><span class="line">          <span class="attr">name:</span> <span class="string">kibana-config</span></span><br><span class="line">          <span class="attr">items:</span></span><br><span class="line">            <span class="bullet">-</span> <span class="attr">key:</span> <span class="string">kibana.yml</span></span><br><span class="line">              <span class="attr">path:</span> <span class="string">kibana.yml</span></span><br><span class="line"><span class="meta">---</span></span><br><span class="line"><span class="attr">apiVersion:</span> <span class="string">v1</span></span><br><span class="line"><span class="attr">kind:</span> <span class="string">ConfigMap</span></span><br><span class="line"><span class="attr">metadata:</span></span><br><span class="line">  <span class="attr">namespace:</span> <span class="string">default</span></span><br><span class="line">  <span class="attr">name:</span> <span class="string">kibana-config</span></span><br><span class="line"><span class="attr">data:</span></span><br><span class="line">  <span class="attr">kibana.yml:</span> <span class="string">|</span></span><br><span class="line"><span class="string">    server.port: 5601</span></span><br><span class="line"><span class="string">    server.host: &quot;0.0.0.0&quot;</span></span><br><span class="line"><span class="string">    elasticsearch.hosts: [&quot;http://elasticsearch:9200&quot;]</span></span><br><span class="line"><span class="string">    elasticsearch.requestTimeout: 3600000</span></span><br><span class="line"><span class="string">    elasticsearch.shardTimeout: 3600000</span></span><br><span class="line"><span class="string">    i18n.locale: &quot;zh-CN&quot;</span></span><br><span class="line"><span class="string">    elasticsearch.username: &quot;elastic&quot;</span></span><br><span class="line"><span class="string">    elasticsearch.password: &quot;jjxkjkdgkdjgkkdjgk&quot;</span></span><br><span class="line"><span class="string"></span><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">labels:</span></span><br><span class="line">    <span class="attr">app:</span> <span class="string">kibana</span></span><br><span class="line">  <span class="attr">name:</span> <span class="string">kibana-service</span></span><br><span class="line">  <span class="attr">namespace:</span> <span class="string">default</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">port:</span> <span class="number">5601</span></span><br><span class="line">      <span class="attr">targetPort:</span> <span class="number">5601</span></span><br><span class="line">  <span class="attr">selector:</span></span><br><span class="line">    <span class="attr">app:</span> <span class="string">kibana</span></span><br><span class="line">  <span class="attr">type:</span> <span class="string">ClusterIP</span></span><br><span class="line"></span><br><span class="line"><span class="meta">---</span></span><br><span class="line"><span class="attr">apiVersion:</span> <span class="string">networking.k8s.io/v1beta1</span></span><br><span class="line"><span class="attr">kind:</span> <span class="string">Ingress</span></span><br><span class="line"><span class="attr">metadata:</span></span><br><span class="line">  <span class="attr">namespace:</span> <span class="string">default</span></span><br><span class="line">  <span class="attr">name:</span> <span class="string">kibana</span></span><br><span class="line">  <span class="attr">annotations:</span></span><br><span class="line">    <span class="attr">kubernetes.io/ingress.class:</span> <span class="string">&quot;nginx&quot;</span></span><br><span class="line">    <span class="attr">nginx.ingress.kubernetes.io/ssl-redirect:</span> <span class="string">&quot;false&quot;</span> <span class="comment">#关闭SSL跳转</span></span><br><span class="line"></span><br><span class="line"><span class="attr">spec:</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">kibana.xxxx.com</span></span><br><span class="line">    <span class="attr">secretName:</span> <span class="string">xxxx-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">kibana.xxxx.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">backend:</span></span><br><span class="line">          <span class="attr">serviceName:</span> <span class="string">kibana-service</span></span><br><span class="line">          <span class="attr">servicePort:</span> <span class="number">5601</span></span><br><span class="line">        <span class="attr">path:</span> <span class="string">/</span></span><br></pre></td></tr></table></figure>]]>
    </content>
    <id>https://zahui.fan/posts/t0wu1k/</id>
    <link href="https://zahui.fan/posts/t0wu1k/"/>
    <published>2025-08-13T02:10:31.000Z</published>
    <summary>
      <![CDATA[<ol>
<li>Elasticsearch 有自己的高可用集群机制，不建议再用 k8s 管理</li>
<li>适用于临时使用一下、或者测试使用</li>
</ol>
<h2 id="数据存储问题"><a href="#数据存储问题" class="headerlink" title="数据存储问题"></a>数据存储问题</h2><p>为了测试使用，我也没有用 pvc 来管理数据，而是选择了]]>
    </summary>
    <title>在Kubernetes中部署一个单节点Elasticsearch</title>
    <updated>2025-08-13T02:47:26.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="SSL" scheme="https://zahui.fan/tags/SSL/"/>
    <category term="Auth" scheme="https://zahui.fan/tags/Auth/"/>
    <content>
      <![CDATA[<p>可以直接使用我制作好的工具，支持自签名 HTTPS 证书和双向认证证书，纯 shell 脚本，支持 Docker 使用，一键生成证书：<a href="https://github.com/iuxt/my_cert">https://github.com/iuxt/my_cert</a></p><p>双向认证用途是什么： 双向认证就是客户端需要携带证书来请求服务器，证书校验通过了才会正常返回。比如说我有个网站只有自己访问，就可以配置双向认证，自己电脑安装一下证书就可以访问，还可以通过吊销证书的方式来禁止对应的人访问网站。</p><h2 id="CA-证书"><a href="#CA-证书" class="headerlink" title="CA 证书"></a>CA 证书</h2><h3 id="生成-CA-私钥"><a href="#生成-CA-私钥" class="headerlink" title="生成 CA 私钥"></a>生成 CA 私钥</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">openssl genrsa -out ca.key 4096</span><br></pre></td></tr></table></figure><p>生成一个 <code>ca.key</code> 文件</p><h3 id="生成-CA-证书"><a href="#生成-CA-证书" class="headerlink" title="生成 CA 证书"></a>生成 CA 证书</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></pre></td><td class="code"><pre><span class="line">openssl req -utf8 -new -x509 -days 3650 -key ca.key -out ca.crt -subj <span class="string">&#x27;/C=CN/ST=Shanghai/L=Pudong/O=iuxt/OU=张理坤/CN=www.i.com/emailAddress=iuxt@qq.com&#x27;</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></pre></td><td class="code"><pre><span class="line">openssl req -utf8 -new -x509 -days 3650 -key ca.key -out ca.crt</span><br></pre></td></tr></table></figure><p>需要交互式输入:</p><table><thead><tr><th>提示</th><th>含义</th><th>输入内容</th></tr></thead><tbody><tr><td>Country Name</td><td>国家</td><td>CN</td></tr><tr><td>State or Province Name</td><td>省</td><td>Shanghai</td></tr><tr><td>Locality Name</td><td>市</td><td>留空</td></tr><tr><td>Organization Name</td><td>组织名,公司名</td><td>iuxt</td></tr><tr><td>Organizational Unit Name</td><td>团体名</td><td>留空</td></tr><tr><td>Common Name</td><td>你的名字或域名</td><td>zhanglikun</td></tr><tr><td>Email Address</td><td>电子邮箱</td><td><a href="mailto:&#x69;&#x75;&#120;&#x74;&#x40;&#113;&#x71;&#x2e;&#x63;&#111;&#x6d;">iuxt@qq.com</a></td></tr></tbody></table></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><p>就可以生成 <code>ca.crt</code> 文件, 这个文件需要加入到客户端的 <code>受信任的根证书颁发机构</code></p><h2 id="制作双向认证客户端证书"><a href="#制作双向认证客户端证书" class="headerlink" title="制作双向认证客户端证书"></a>制作双向认证客户端证书</h2><p>我是在 <code>Ubuntu 24.04</code> 系统下操作。不同系统可能会有差别。</p><h3 id="生成证书吊销列表"><a href="#生成证书吊销列表" class="headerlink" title="生成证书吊销列表"></a>生成证书吊销列表</h3><p>准备一份 <code>openssl.cnf</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><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">[ ca ]</span><br><span class="line">default_ca = CA_default</span><br><span class="line"></span><br><span class="line">[ CA_default ]</span><br><span class="line"># 根目录设置为自定义路径</span><br><span class="line">dir = ./ca</span><br><span class="line"></span><br><span class="line"># 默认算法</span><br><span class="line">default_md = sha256</span><br><span class="line"></span><br><span class="line"># CA 的数据库文件</span><br><span class="line">database = $dir/index.txt</span><br><span class="line"># 证书的序列号文件</span><br><span class="line">serial = $dir/serial</span><br><span class="line"># 新证书的默认有效期</span><br><span class="line">default_days = 365</span><br><span class="line"># 吊销证书的理由</span><br><span class="line">crl_reason = unspecified</span><br><span class="line"># 默认的证书颁发策略</span><br><span class="line">policy = policy_anything</span><br><span class="line"></span><br><span class="line"># CRL 选项</span><br><span class="line">crlnumber = $dir/crlnumber</span><br><span class="line">default_crl_days = 30</span><br><span class="line">crl_extensions = crl_ext</span><br><span class="line"></span><br><span class="line">[ policy_anything ]</span><br><span class="line"># 配置任何策略</span><br><span class="line">countryName = optional</span><br><span class="line">stateOrProvinceName = optional</span><br><span class="line">organizationName = optional</span><br><span class="line">organizationalUnitName = optional</span><br><span class="line">commonName = supplied</span><br><span class="line">emailAddress = optional</span><br><span class="line"></span><br><span class="line">[ crl_ext ]</span><br><span class="line"># CRL 的扩展配置</span><br><span class="line">authorityKeyIdentifier = keyid:always</span><br></pre></td></tr></table></figure><h3 id="吊销指定证书"><a href="#吊销指定证书" class="headerlink" title="吊销指定证书"></a>吊销指定证书</h3><p>其他的证书都是 ca 签发的, 不管是 nginx 用的 server 证书,还是双向认证用到的 client 证书, 吊销证书后需要重新生成 crl 文件</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></pre></td><td class="code"><pre><span class="line"><span class="built_in">touch</span> ca/index.txt</span><br><span class="line"></span><br><span class="line"><span class="comment"># crlnumber初始化，第一次给个初始值即可，后面不需要修改，每次重新生成crl的时候会自增。</span></span><br><span class="line">[ ! -f ca/crlnumber ] &amp;&amp; <span class="built_in">echo</span> <span class="string">&quot;01&quot;</span> &gt; ca/crlnumber</span><br><span class="line"></span><br><span class="line"><span class="comment"># 吊销指定证书</span></span><br><span class="line">openssl ca  -config openssl.cnf -cert ca/ca.crt  -keyfile  ca/ca.key  -revoke ssl/i.com.crt</span><br><span class="line"></span><br><span class="line"><span class="comment"># 吊销完成后，重新生成吊销列表，建议定期重新生成 CRL 文件，并在 Nginx 上 reload 配置</span></span><br><span class="line">openssl ca -config openssl.cnf  -cert ca/ca.crt  -keyfile  ca/ca.key  -gencrl -out ca/crl.pem</span><br></pre></td></tr></table></figure><h3 id="服务端-nginx-配置"><a href="#服务端-nginx-配置" class="headerlink" title="服务端 nginx 配置"></a>服务端 nginx 配置</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></pre></td><td class="code"><pre><span class="line">server &#123;</span><br><span class="line">  listen 80;</span><br><span class="line">  listen [::]:80;</span><br><span class="line">  listen 443 ssl;</span><br><span class="line">  listen [::]:443 ssl;</span><br><span class="line">  ssl_certificate   ssl/i.com.crt;</span><br><span class="line">  ssl_certificate_key ssl/i.com.key;</span><br><span class="line">  ssl_session_timeout 5m;</span><br><span class="line">  ssl_ciphers HIGH:!aNULL:!MD5;</span><br><span class="line">  ssl_protocols TLSv1 TLSv1.1 TLSv1.2;</span><br><span class="line">  ssl_prefer_server_ciphers on;</span><br><span class="line">  server_name i.com;</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">  client_max_body_size 1024m;</span><br><span class="line"></span><br><span class="line">  location / &#123;</span><br><span class="line">          default_type text/plain;</span><br><span class="line">          return 200 &quot;hello&quot;;</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="配置客户端-client-证书"><a href="#配置客户端-client-证书" class="headerlink" title="配置客户端 client 证书"></a>配置客户端 client 证书</h2><p>证书生成方式和上面一样，p12 格式包含私钥和证书（iPhone 想导入的话，必须设置密码。）</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">openssl pkcs12 -<span class="built_in">export</span> -<span class="keyword">in</span> zhangsan.crt -inkey zhangsan.key -out zhangsan.p12</span><br></pre></td></tr></table></figure><h3 id="Windows-系统"><a href="#Windows-系统" class="headerlink" title="Windows 系统"></a>Windows 系统</h3><p>双击导入，存储位置选择个人<br><img src="https://s3.babudiu.com/iuxt/public/nes.svg" data-lazy-src="https://s3.babudiu.com/iuxt/images/202411071859189.png" alt="image.png"></p><p>访问对应网站的时候浏览器会提示让选择证书<br><img src="https://s3.babudiu.com/iuxt/public/nes.svg" data-lazy-src="https://s3.babudiu.com/iuxt/images/202411071900128.png" alt="image.png|593"></p><p>这是证书被吊销的样子：<br><img src="https://s3.babudiu.com/iuxt/public/nes.svg" data-lazy-src="https://s3.babudiu.com/iuxt/images/202411071900403.png" alt="image.png|593"></p><h3 id="iPhone-手机"><a href="#iPhone-手机" class="headerlink" title="iPhone 手机"></a>iPhone 手机</h3><p>先在文件里点击一下 p12 文件<br><img src="https://s3.babudiu.com/iuxt/public/nes.svg" data-lazy-src="https://s3.babudiu.com/iuxt/2025/07/fa3a67c3a23c675bc5d1c9a0b1c64fbc.png" alt="IMG_5978-1.png|283"></p><p>然后到 VPN 与设备管理里<br><img src="https://s3.babudiu.com/iuxt/public/nes.svg" data-lazy-src="https://s3.babudiu.com/iuxt/2025/07/7e78a2fe2e97dc9cd3bfc41d883cd953.png" alt="IMG_5979-1.png|302"></p><p>选择已下载的描述文件，进行安装。</p><h2 id="二级-CA"><a href="#二级-CA" class="headerlink" title="二级 CA"></a>二级 CA</h2><p>可选使用二级 CA 证书，如果业务量比较大的情况下，可以使用二级 CA，这样如果二级 CA 出现私钥泄露，可以通过根 CA 吊销二级 CA 证书 (通过此二级 CA 签发的证书都会失效)。使用二级 CA 签发证书需要注意：</p><ol><li>签发二级 CA 的时候需要执行证书扩展信息为 CA (<code>basicConstraints=CA:TRUE</code>)</li><li>在 Nginx 等配置认证证书的时候，需要配置证书链，即 二级 CA 和 根 CA 这两个证书合并到一个文件里。</li></ol><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><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></pre></td><td class="code"><pre><span class="line"><span class="meta">#!/bin/bash</span></span><br><span class="line"><span class="built_in">set</span> -e</span><br><span class="line"></span><br><span class="line">WORKDIR=mtls_certs</span><br><span class="line"><span class="built_in">mkdir</span> -p <span class="variable">$WORKDIR</span></span><br><span class="line"><span class="built_in">cd</span> <span class="variable">$WORKDIR</span></span><br><span class="line"></span><br><span class="line"><span class="built_in">echo</span> <span class="string">&quot;[1/6] 生成 Root CA...&quot;</span></span><br><span class="line">openssl genrsa -out rootCA.key 4096</span><br><span class="line">openssl req -x509 -new -nodes -key rootCA.key -sha256 -days 3650 \</span><br><span class="line">  -subj <span class="string">&quot;/C=CN/ST=Beijing/O=MyOrg/CN=MyRootCA&quot;</span> \</span><br><span class="line">  -out rootCA.crt</span><br><span class="line"></span><br><span class="line"><span class="built_in">echo</span> <span class="string">&quot;[2/6] 生成二级 Sub CA...&quot;</span></span><br><span class="line">openssl genrsa -out subCA.key 4096</span><br><span class="line">openssl req -new -key subCA.key \</span><br><span class="line">  -subj <span class="string">&quot;/C=CN/ST=Beijing/O=MyOrg/CN=MySubCA&quot;</span> \</span><br><span class="line">  -out subCA.csr</span><br><span class="line"></span><br><span class="line">openssl x509 -req -<span class="keyword">in</span> subCA.csr -CA rootCA.crt -CAkey rootCA.key -CAcreateserial \</span><br><span class="line">  -out subCA.crt -days 1825 -sha256 -extfile &lt;(<span class="built_in">printf</span> <span class="string">&quot;basicConstraints=CA:TRUE,pathlen:0\nkeyUsage=critical,keyCertSign,cRLSign&quot;</span>)</span><br><span class="line"></span><br><span class="line"><span class="built_in">echo</span> <span class="string">&quot;[3/6] 生成 Client Key &amp; CSR...&quot;</span></span><br><span class="line">openssl genrsa -out client.key 2048</span><br><span class="line">openssl req -new -key client.key \</span><br><span class="line">  -subj <span class="string">&quot;/C=CN/ST=Beijing/O=MyOrg/CN=mtls-client&quot;</span> \</span><br><span class="line">  -out client.csr</span><br><span class="line"></span><br><span class="line"><span class="built_in">echo</span> <span class="string">&quot;[4/6] 用 Sub CA 签发 Client Cert...&quot;</span></span><br><span class="line">openssl x509 -req -<span class="keyword">in</span> client.csr -CA subCA.crt -CAkey subCA.key -CAcreateserial \</span><br><span class="line">  -out client.crt -days 825 -sha256</span><br><span class="line"></span><br><span class="line"><span class="built_in">echo</span> <span class="string">&quot;[5/6] 生成证书链 (SubCA + RootCA)...&quot;</span></span><br><span class="line"><span class="built_in">cat</span> subCA.crt rootCA.crt &gt; ca-chain.crt</span><br><span class="line"></span><br><span class="line"><span class="built_in">echo</span> <span class="string">&quot;[6/6] 生成 PFX (可用于浏览器/工具)&quot;</span></span><br><span class="line">openssl pkcs12 -<span class="built_in">export</span> -out client.pfx -inkey client.key -<span class="keyword">in</span> client.crt -certfile ca-chain.crt -password pass:123456</span><br><span class="line"></span><br><span class="line"><span class="built_in">echo</span> <span class="string">&quot;✅ 证书生成完成 (目录: <span class="variable">$WORKDIR</span>)&quot;</span></span><br><span class="line"><span class="built_in">ls</span> -l</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></pre></td><td class="code"><pre><span class="line"><span class="comment"># openssl 验证证书关系</span></span><br><span class="line">openssl verify -CAfile ca-chain.crt client.crt</span><br><span class="line"></span><br><span class="line"><span class="comment"># curl测试</span></span><br><span class="line">curl --cert client.crt --key client.key https://test.babudiu.com</span><br></pre></td></tr></table></figure><h3 id="Windows-删除个人证书"><a href="#Windows-删除个人证书" class="headerlink" title="Windows 删除个人证书"></a>Windows 删除个人证书</h3><p>win + r 运行，输入 <code>certmgr.msc</code> 进入证书管理器。或者在开始菜单搜索 <code>管理用户证书</code> 进入。找到证书，右键删除即可。</p><h3 id="iPhone-删除证书"><a href="#iPhone-删除证书" class="headerlink" title="iPhone 删除证书"></a>iPhone 删除证书</h3><p>删除描述文件即可。</p>]]>
    </content>
    <id>https://zahui.fan/posts/szkilc/</id>
    <link href="https://zahui.fan/posts/szkilc/"/>
    <published>2025-07-17T23:58:24.000Z</published>
    <summary>
      <![CDATA[<p>可以直接使用我制作好的工具，支持自签名 HTTPS 证书和双向认证证书，纯 shell 脚本，支持 Docker 使用，一键生成证书：<a href="https://github.com/iuxt/my_cert">https://github.com/iuxt/my_cert</a></p>
<p>双向认证用途是什么：]]>
    </summary>
    <title>使用openssl制作自签名双向认证(mTLS)证书</title>
    <updated>2025-08-23T17:02:24.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/%E6%90%AD%E5%BB%BA/"/>
    <category term="存储" scheme="https://zahui.fan/tags/%E5%AD%98%E5%82%A8/"/>
    <category term="对象存储" scheme="https://zahui.fan/tags/%E5%AF%B9%E8%B1%A1%E5%AD%98%E5%82%A8/"/>
    <content>
      <![CDATA[<h2 id="单域名方式部署"><a href="#单域名方式部署" class="headerlink" title="单域名方式部署"></a>单域名方式部署</h2><p>单域名就是把 minio 的 api 接口和 web 管理控制台放在一个域名下，比如：</p><p>管理控制台：<code>https://minio.xxx.com/ui/</code><br>API 接口：<code>https://minio.xxx.com</code></p><h3 id="docker-部署"><a href="#docker-部署" class="headerlink" title="docker 部署"></a>docker 部署</h3><blockquote><p>这里我指定了 network，我的 nginx 也是用的这个 network，可以直接用 容器名字 来访问</p></blockquote><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">docker run --name minio -d \</span><br><span class="line">    --env-file=.<span class="built_in">env</span> \</span><br><span class="line">    --network iuxt \</span><br><span class="line">    -v ./data:/data \</span><br><span class="line">    -v ./config:/root/.mc \</span><br><span class="line">    minio/minio:RELEASE.2025-04-22T22-12-26Z server --console-address <span class="string">&quot;:9001&quot;</span> /data</span><br></pre></td></tr></table></figure><p>.env 配置</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></pre></td><td class="code"><pre><span class="line">MINIO_ROOT_USER=username</span><br><span class="line">MINIO_ROOT_PASSWORD=password</span><br><span class="line">MINIO_SERVER_URL=https://minio.xxx.com</span><br><span class="line">MINIO_BROWSER_REDIRECT_URL=https://minio.xxx.com/ui/</span><br><span class="line">MC_CONFIG_DIR=/root/.mc</span><br></pre></td></tr></table></figure><h3 id="nginx-配置"><a href="#nginx-配置" class="headerlink" title="nginx 配置"></a>nginx 配置</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></pre></td><td class="code"><pre><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 minio.xxx.com;</span><br><span class="line">    client_max_body_size 0;</span><br><span class="line"></span><br><span class="line">    ssl_certificate         ssl/xxx.com.crt;</span><br><span class="line">    ssl_certificate_key     ssl/xxx.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">    # API endpoint</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://minio:9000;</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    # Console endpoint</span><br><span class="line">    location /ui/ &#123;</span><br><span class="line">        rewrite ^/ui/(.*) /$1 break;</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://minio:9001;</span><br><span class="line">        proxy_http_version 1.1;</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">    &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h2 id="独立-web-控制台方式部署"><a href="#独立-web-控制台方式部署" class="headerlink" title="独立 web 控制台方式部署"></a>独立 web 控制台方式部署</h2><p>可以将 web 控制台独立出来，考虑到安全性，web 控制台不需要开放到公网，可以将控制台独立域名。比如：</p><p>管理控制台：<code>https://s3-admin.example.com</code><br>API 接口：<code>https://s3.example.com</code></p><h3 id="docker-部署-1"><a href="#docker-部署-1" class="headerlink" title="docker 部署"></a>docker 部署</h3><blockquote><p>这里我指定了 network，我的 nginx 也是用的这个 network，可以直接用 容器名字 来访问</p></blockquote><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">docker run --name minio -d \</span><br><span class="line">    --env-file=.<span class="built_in">env</span> \</span><br><span class="line">    --network iuxt \</span><br><span class="line">    -v ./data:/data \</span><br><span class="line">    -v ./config:/root/.mc \</span><br><span class="line">    minio/minio:RELEASE.2025-04-22T22-12-26Z server --console-address <span class="string">&quot;:9001&quot;</span> /data</span><br></pre></td></tr></table></figure><p>.env 配置</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></pre></td><td class="code"><pre><span class="line">MINIO_ROOT_USER=username</span><br><span class="line">MINIO_ROOT_PASSWORD=password</span><br><span class="line">MINIO_SERVER_URL=https://s3.example.com</span><br><span class="line">MINIO_BROWSER_REDIRECT_URL=https://s3-admin.example.com</span><br><span class="line">MC_CONFIG_DIR=/root/.mc</span><br></pre></td></tr></table></figure><h3 id="nginx-配置-1"><a href="#nginx-配置-1" class="headerlink" title="nginx 配置"></a>nginx 配置</h3><p>我给控制台开了双向认证，如果不需要，删除掉这三行配置。<code>ssl_client_certificate ssl/ca.crt;</code> <code>ssl_verify_client on;</code> <code>ssl_crl ssl/crl.pem;</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><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><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br></pre></td><td class="code"><pre><span class="line">```conf</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://minio:9000;</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br><span class="line"></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">    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://minio:9001;</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h2 id="mc-命令创建-apikey"><a href="#mc-命令创建-apikey" class="headerlink" title="mc 命令创建 apikey"></a>mc 命令创建 apikey</h2><p>在 <code>RELEASE.2025-04-22T22-12-26Z</code> 这个版本之后 minio 把控制台的管理功能给砍了，顺便还送了你一个每次打开都会弹出的通知。可以继续使用 <code>RELEASE.2025-04-22T22-12-26Z</code> 这个版本。如果你不幸更新了版本，你需要使用 mc 命令来创建 API 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></pre></td><td class="code"><pre><span class="line"><span class="comment"># 增加节点管理，命名为minio</span></span><br><span class="line">mc <span class="built_in">alias</span> <span class="built_in">set</span> minio http://127.0.0.1:9000 &lt;USERNAME&gt; &lt;PASSWORD&gt;</span><br><span class="line"></span><br><span class="line"><span class="comment"># 创建用户 </span></span><br><span class="line">mc admin user add minio &lt;KEY ID&gt; &lt;KEY SECRET&gt;</span><br><span class="line"></span><br><span class="line"><span class="comment"># 分配权限</span></span><br><span class="line">mc admin policy attach minio readwrite --user=&lt;KEY ID&gt;</span><br></pre></td></tr></table></figure><h2 id="使用-CURL-操作对象存储"><a href="#使用-CURL-操作对象存储" class="headerlink" title="使用 CURL 操作对象存储"></a>使用 CURL 操作对象存储</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></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><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><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><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="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/syv4vu/</id>
    <link href="https://zahui.fan/posts/syv4vu/"/>
    <published>2025-07-04T07:02:18.000Z</published>
    <summary>
      <![CDATA[<h2 id="单域名方式部署"><a href="#单域名方式部署" class="headerlink" title="单域名方式部署"></a>单域名方式部署</h2><p>单域名就是把 minio 的 api 接口和 web 管理控制台放在一个域名下，比如：</p>
<p>管理控制台：<code>https://minio.xxx.com/ui/</code><br>API]]>
    </summary>
    <title>minio自建对象存储</title>
    <updated>2025-12-07T05:34:57.000Z</updated>
  </entry>
  <entry>
    <author>
      <name>张理坤</name>
    </author>
    <category term="容器" scheme="https://zahui.fan/categories/%E5%AE%B9%E5%99%A8/"/>
    <category term="Nginx" scheme="https://zahui.fan/tags/Nginx/"/>
    <category term="ingress" scheme="https://zahui.fan/tags/ingress/"/>
    <category term="Kubernetes" scheme="https://zahui.fan/tags/Kubernetes/"/>
    <content>
      <![CDATA[<p>新版 ingress 增强了 安全性, 它认为用户自己写的 nginx 配置文件不安全，所以又加了限制。（允许自定义 nginx 配置有一定安全风险，酌情修改！）我的 ingress 版本是： 1.12.2</p><p>比如有个需求，Spring Boot 写的程序有个 &#x2F;actuator 路径，安全审查不通过，如果是个 nginx 可以通过：</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">location /actuator &#123;</span><br><span class="line">    return 404;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>来直接让它返回 404</p><h2 id="configmap"><a href="#configmap" class="headerlink" title="configmap"></a>configmap</h2><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></pre></td><td class="code"><pre><span class="line"><span class="attr">apiVersion:</span> <span class="string">v1</span></span><br><span class="line"><span class="attr">data:</span></span><br><span class="line">  <span class="attr">allow-snippet-annotations:</span> <span class="string">&quot;true&quot;</span></span><br><span class="line">  <span class="attr">annotations-risk-level:</span> <span class="string">Critical</span></span><br><span class="line"><span class="attr">kind:</span> <span class="string">ConfigMap</span></span><br><span class="line"><span class="attr">metadata:</span></span><br><span class="line">  <span class="attr">labels:</span></span><br><span class="line">    <span class="attr">app.kubernetes.io/component:</span> <span class="string">controller</span></span><br><span class="line">    <span class="attr">app.kubernetes.io/instance:</span> <span class="string">public-ingress-nginx</span></span><br><span class="line">    <span class="attr">app.kubernetes.io/name:</span> <span class="string">public-ingress-nginx</span></span><br><span class="line">    <span class="attr">app.kubernetes.io/part-of:</span> <span class="string">public-ingress-nginx</span></span><br><span class="line">    <span class="attr">app.kubernetes.io/version:</span> <span class="number">1.12</span><span class="number">.2</span></span><br><span class="line">  <span class="attr">name:</span> <span class="string">public-ingress-nginx-controller</span></span><br><span class="line">  <span class="attr">namespace:</span> <span class="string">public-ingress-nginx</span></span><br></pre></td></tr></table></figure><p>加上这两个配置：<br><code>allow-snippet-annotations</code><br><code>annotations-risk-level</code></p><p>风险等级，在这里可以查到：<br><a href="https://kubernetes.github.io/ingress-nginx/user-guide/nginx-configuration/annotations-risk/">https://kubernetes.github.io/ingress-nginx/user-guide/nginx-configuration/annotations-risk/</a></p><h2 id="ingress-配置"><a href="#ingress-配置" class="headerlink" title="ingress 配置"></a>ingress 配置</h2><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></pre></td><td class="code"><pre><span class="line"><span class="attr">apiVersion:</span> <span class="string">networking.k8s.io/v1</span></span><br><span class="line"><span class="attr">kind:</span> <span class="string">Ingress</span></span><br><span class="line"><span class="attr">metadata:</span></span><br><span class="line">  <span class="attr">annotations:</span></span><br><span class="line">    <span class="attr">nginx.ingress.kubernetes.io/cors-allow-headers:</span> <span class="string">&#x27;*&#x27;</span></span><br><span class="line">    <span class="attr">nginx.ingress.kubernetes.io/cors-allow-methods:</span> <span class="string">&#x27;*&#x27;</span></span><br><span class="line">    <span class="attr">nginx.ingress.kubernetes.io/cors-allow-origin:</span> <span class="string">&#x27;*&#x27;</span></span><br><span class="line">    <span class="attr">nginx.ingress.kubernetes.io/ssl-redirect:</span> <span class="string">&quot;false&quot;</span></span><br><span class="line">    <span class="attr">nginx.ingress.kubernetes.io/server-snippet:</span> <span class="string">|</span></span><br><span class="line"><span class="string">      location /actuator &#123;</span></span><br><span class="line"><span class="string">        return 404;</span></span><br><span class="line"><span class="string">      &#125;</span></span><br><span class="line"><span class="string"></span>  <span class="attr">name:</span> <span class="string">mtls</span></span><br><span class="line">  <span class="attr">namespace:</span> <span class="string">vos</span></span><br><span class="line"><span class="attr">spec:</span></span><br><span class="line">  <span class="attr">ingressClassName:</span> <span class="string">public-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">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">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">gateway</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 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">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">a.com</span></span><br><span class="line">    <span class="attr">secretName:</span> <span class="string">a-com</span></span><br></pre></td></tr></table></figure><p>server-snippet 作用于 server 块<br>configuration-snippet 作用于 location 块</p><p>注意：</p><figure class="highlight yml"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="attr">nginx.ingress.kubernetes.io/use-regex:</span> <span class="string">&#x27;true&#x27;</span></span><br></pre></td></tr></table></figure><p>当启用 <code>use-regex</code> 时，所有路径都会被当作正则表达式处理，会影响到匹配。</p>]]>
    </content>
    <id>https://zahui.fan/posts/sygayi/</id>
    <link href="https://zahui.fan/posts/sygayi/"/>
    <published>2025-06-26T06:49:30.000Z</published>
    <summary>
      <![CDATA[<p>新版 ingress 增强了 安全性, 它认为用户自己写的 nginx 配置文件不安全，所以又加了限制。（允许自定义 nginx 配置有一定安全风险，酌情修改！）我的 ingress 版本是： 1.12.2</p>
<p>比如有个需求，Spring Boot 写的程序有个 &#x2F;actuator 路径，安全审查不通过，如果是个 nginx 可以通过：</p>
<figure]]>
    </summary>
    <title>ingress-nginx 使用自定义的nginx配置</title>
    <updated>2025-11-03T14:48:01.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="SSL" scheme="https://zahui.fan/tags/SSL/"/>
    <content>
      <![CDATA[<p>P12 证书是整合了公钥和私钥的，还可以给 P12 证书设置密码。</p><h2 id="P12-转换为-PEM"><a href="#P12-转换为-PEM" class="headerlink" title="P12 转换为 PEM"></a>P12 转换为 PEM</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></pre></td><td class="code"><pre><span class="line"><span class="comment"># 提取证书</span></span><br><span class="line">openssl pkcs12 -<span class="keyword">in</span> 1.p12  -clcerts -nokeys -out certificate.crt</span><br><span class="line"></span><br><span class="line"><span class="comment"># 提取加密的私钥</span></span><br><span class="line">openssl pkcs12 -<span class="keyword">in</span> 1.p12 -nocerts -out private_key.key</span><br><span class="line"></span><br><span class="line"><span class="comment"># 提取未加密的私钥</span></span><br><span class="line">openssl pkcs12 -<span class="keyword">in</span> 1.p12 -nocerts -nodes -out private_key.key</span><br></pre></td></tr></table></figure><p>这种是加密的 PEM 私钥</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">-----BEGIN ENCRYPTED PRIVATE KEY-----</span><br><span class="line">...</span><br><span class="line">-----END ENCRYPTED PRIVATE KEY-----</span><br></pre></td></tr></table></figure><p>也可以将加密的 PEM 私钥转换成未加密的 PEM 私钥</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">openssl rsa -<span class="keyword">in</span> encrypt.key -out nopassword.key</span><br></pre></td></tr></table></figure><p>未加密的 PEM 私钥长这样</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">-----BEGIN PRIVATE KEY-----</span><br><span class="line">...</span><br><span class="line">-----END PRIVATE KEY-----</span><br></pre></td></tr></table></figure><h2 id="PEM-公钥和私钥转换成-P12"><a href="#PEM-公钥和私钥转换成-P12" class="headerlink" title="PEM 公钥和私钥转换成 P12"></a>PEM 公钥和私钥转换成 P12</h2><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">openssl pkcs12 -<span class="built_in">export</span> -out certificate.p12 -inkey privateKey.key -<span class="keyword">in</span> certificate.crt</span><br></pre></td></tr></table></figure>]]>
    </content>
    <id>https://zahui.fan/posts/sycvjt/</id>
    <link href="https://zahui.fan/posts/sycvjt/"/>
    <published>2025-06-24T10:23:52.000Z</published>
    <summary>
      <![CDATA[<p>P12 证书是整合了公钥和私钥的，还可以给 P12 证书设置密码。</p>
<h2 id="P12-转换为-PEM"><a href="#P12-转换为-PEM" class="headerlink" title="P12 转换为 PEM"></a>P12 转换为 PEM</h2><figure class="highlight bash"><table><tr><td]]>
    </summary>
    <title>P12格式证书与PEM格式转换</title>
    <updated>2025-07-17T16:21:46.000Z</updated>
  </entry>
  <entry>
    <author>
      <name>张理坤</name>
    </author>
    <category term="监控" scheme="https://zahui.fan/categories/%E7%9B%91%E6%8E%A7/"/>
    <category term="监控" scheme="https://zahui.fan/tags/%E7%9B%91%E6%8E%A7/"/>
    <category term="prometheus" scheme="https://zahui.fan/tags/prometheus/"/>
    <content>
      <![CDATA[<h2 id="blackbox-创建模块"><a href="#blackbox-创建模块" class="headerlink" title="blackbox 创建模块"></a>blackbox 创建模块</h2><p>对应的 blackbox exporter 的配置文件：</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></pre></td><td class="code"><pre><span class="line"><span class="attr">modules:</span></span><br><span class="line">  <span class="attr">http_2xx:</span></span><br><span class="line">    <span class="attr">prober:</span> <span class="string">http</span></span><br><span class="line">    <span class="attr">timeout:</span> <span class="string">5s</span></span><br><span class="line">    <span class="attr">http:</span></span><br><span class="line">      <span class="attr">valid_http_versions:</span> [<span class="string">&quot;HTTP/1.1&quot;</span>, <span class="string">&quot;HTTP/2&quot;</span>]</span><br><span class="line">      <span class="attr">valid_status_codes:</span> [<span class="number">200</span>]</span><br><span class="line">      <span class="attr">method:</span> <span class="string">GET</span></span><br><span class="line">      <span class="attr">preferred_ip_protocol:</span> <span class="string">&quot;ip4&quot;</span></span><br><span class="line">  <span class="attr">http_post_2xx:</span></span><br><span class="line">    <span class="attr">prober:</span> <span class="string">http</span></span><br><span class="line">    <span class="attr">timeout:</span> <span class="string">5s</span></span><br><span class="line">    <span class="attr">http:</span></span><br><span class="line">      <span class="attr">valid_http_versions:</span> [<span class="string">&quot;HTTP/1.1&quot;</span>, <span class="string">&quot;HTTP/2&quot;</span>]</span><br><span class="line">      <span class="attr">method:</span> <span class="string">POST</span></span><br><span class="line">      <span class="attr">preferred_ip_protocol:</span> <span class="string">&quot;ip4&quot;</span></span><br><span class="line">  <span class="attr">tcp_connect:</span></span><br><span class="line">    <span class="attr">prober:</span> <span class="string">tcp</span></span><br><span class="line">    <span class="attr">timeout:</span> <span class="string">2s</span></span><br><span class="line">  <span class="attr">icmp:</span></span><br><span class="line">    <span class="attr">prober:</span> <span class="string">icmp</span></span><br><span class="line">    <span class="attr">timeout:</span> <span class="string">2s</span></span><br><span class="line">    <span class="attr">icmp:</span></span><br><span class="line">      <span class="attr">preferred_ip_protocol:</span> <span class="string">&quot;ip4&quot;</span></span><br><span class="line">  <span class="attr">http_accept_404:</span></span><br><span class="line">    <span class="attr">prober:</span> <span class="string">http</span></span><br><span class="line">    <span class="attr">timeout:</span> <span class="string">10s</span></span><br><span class="line">    <span class="attr">http:</span></span><br><span class="line">      <span class="attr">valid_status_codes:</span> [<span class="number">200</span>, <span class="number">201</span>, <span class="number">204</span>, <span class="number">404</span>]  <span class="comment"># 404 也被视为正常</span></span><br><span class="line">      <span class="attr">method:</span> <span class="string">GET</span></span><br><span class="line">      <span class="attr">preferred_ip_protocol:</span> <span class="string">&quot;ip4&quot;</span></span><br><span class="line">      <span class="attr">no_follow_redirects:</span> <span class="literal">false</span></span><br></pre></td></tr></table></figure><p>其中：</p><ul><li>http_2xx： get 请求 200 认为是正常的</li><li>http_post_2xx： post 请求 200 认为是正常的</li><li>tcp_connect： 测试端口是不是通的</li><li>icmp：能否 ping 通</li><li>http_accept_404： get 请求，404 也认为是正常的</li></ul><h2 id="配置-Prometheus"><a href="#配置-Prometheus" class="headerlink" title="配置 Prometheus"></a>配置 Prometheus</h2><h3 id="HTTP-监控-只有-200-是正常请求"><a href="#HTTP-监控-只有-200-是正常请求" class="headerlink" title="HTTP 监控 只有 200 是正常请求"></a>HTTP 监控 只有 200 是正常请求</h3><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></pre></td><td class="code"><pre><span class="line"><span class="bullet">-</span> <span class="attr">job_name:</span> <span class="string">&#x27;http_get&#x27;</span></span><br><span class="line">  <span class="attr">metrics_path:</span> <span class="string">/probe</span></span><br><span class="line">  <span class="attr">params:</span></span><br><span class="line">    <span class="attr">module:</span> [<span class="string">http_2xx</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;https://test.com&#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">生产环境域名</span></span><br><span class="line">    <span class="bullet">-</span> <span class="attr">targets:</span> [<span class="string">&#x27;http://1.1.1.1:8888&#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">测试IP地址</span></span><br><span class="line">  <span class="attr">relabel_configs:</span></span><br><span class="line">    <span class="bullet">-</span> <span class="attr">source_labels:</span> [<span class="string">__address__</span>]</span><br><span class="line">      <span class="attr">target_label:</span> <span class="string">__param_target</span></span><br><span class="line">    <span class="bullet">-</span> <span class="attr">target_label:</span> <span class="string">__address__</span></span><br><span class="line">      <span class="attr">replacement:</span> <span class="string">blackbox-exporter.monitor.svc:9115</span></span><br><span class="line">    <span class="bullet">-</span> <span class="attr">source_labels:</span> [<span class="string">__param_target</span>]</span><br><span class="line">      <span class="attr">target_label:</span> <span class="string">instance</span></span><br></pre></td></tr></table></figure><h3 id="HTTP-监控-2xx-和-404-都认为是正常请求"><a href="#HTTP-监控-2xx-和-404-都认为是正常请求" class="headerlink" title="HTTP 监控 2xx 和 404 都认为是正常请求"></a>HTTP 监控 2xx 和 404 都认为是正常请求</h3><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;http_get_with_404&#x27;</span></span><br><span class="line">  <span class="attr">metrics_path:</span> <span class="string">/probe</span></span><br><span class="line">  <span class="attr">params:</span></span><br><span class="line">    <span class="attr">module:</span> [<span class="string">http_accept_404</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;https://test.com&#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">生产环境域名</span></span><br><span class="line">    <span class="bullet">-</span> <span class="attr">targets:</span> [<span class="string">&#x27;http://1.1.1.1:8888&#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">测试IP地址</span></span><br><span class="line">  <span class="attr">relabel_configs:</span></span><br><span class="line">    <span class="bullet">-</span> <span class="attr">source_labels:</span> [<span class="string">__address__</span>]</span><br><span class="line">      <span class="attr">target_label:</span> <span class="string">__param_target</span></span><br><span class="line">    <span class="bullet">-</span> <span class="attr">target_label:</span> <span class="string">__address__</span></span><br><span class="line">      <span class="attr">replacement:</span> <span class="string">blackbox-exporter.monitor.svc:9115</span></span><br><span class="line">    <span class="bullet">-</span> <span class="attr">source_labels:</span> [<span class="string">__param_target</span>]</span><br><span class="line">      <span class="attr">target_label:</span> <span class="string">instance</span></span><br></pre></td></tr></table></figure><h3 id="TCP-端口监控"><a href="#TCP-端口监控" class="headerlink" title="TCP 端口监控"></a>TCP 端口监控</h3><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></pre></td><td class="code"><pre><span class="line"><span class="bullet">-</span> <span class="attr">job_name:</span> <span class="string">port</span></span><br><span class="line">  <span class="attr">honor_timestamps:</span> <span class="literal">true</span></span><br><span class="line">  <span class="attr">params:</span></span><br><span class="line">    <span class="attr">module:</span></span><br><span class="line">    <span class="bullet">-</span> <span class="string">tcp_connect</span></span><br><span class="line">  <span class="attr">scrape_interval:</span> <span class="string">10s</span></span><br><span class="line">  <span class="attr">scrape_timeout:</span> <span class="string">10s</span></span><br><span class="line">  <span class="attr">metrics_path:</span> <span class="string">/probe</span></span><br><span class="line">  <span class="attr">scheme:</span> <span class="string">http</span></span><br><span class="line">  <span class="attr">follow_redirects:</span> <span class="literal">true</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;1.1.1.1:8662&#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">密码机-1</span></span><br><span class="line">    <span class="bullet">-</span> <span class="attr">targets:</span> [<span class="string">&#x27;2.2.2.2:8662&#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">密码机-2</span></span><br><span class="line">  <span class="attr">relabel_configs:</span></span><br><span class="line">  <span class="bullet">-</span> <span class="attr">source_labels:</span> [<span class="string">__address__</span>]</span><br><span class="line">    <span class="attr">separator:</span> <span class="string">;</span></span><br><span class="line">    <span class="attr">regex:</span> <span class="string">(.*)</span></span><br><span class="line">    <span class="attr">target_label:</span> <span class="string">__param_target</span></span><br><span class="line">    <span class="attr">replacement:</span> <span class="string">$1</span></span><br><span class="line">    <span class="attr">action:</span> <span class="string">replace</span></span><br><span class="line">  <span class="bullet">-</span> <span class="attr">source_labels:</span> [<span class="string">__param_target</span>]</span><br><span class="line">    <span class="attr">separator:</span> <span class="string">;</span></span><br><span class="line">    <span class="attr">regex:</span> <span class="string">(.*)</span></span><br><span class="line">    <span class="attr">target_label:</span> <span class="string">addr</span></span><br><span class="line">    <span class="attr">replacement:</span> <span class="string">$1</span></span><br><span class="line">    <span class="attr">action:</span> <span class="string">replace</span></span><br><span class="line">  <span class="bullet">-</span> <span class="attr">source_labels:</span> [<span class="string">__param_target</span>]</span><br><span class="line">    <span class="attr">separator:</span> <span class="string">;</span></span><br><span class="line">    <span class="attr">regex:</span> <span class="string">(.+):(.*)</span></span><br><span class="line">    <span class="attr">target_label:</span> <span class="string">port</span></span><br><span class="line">    <span class="attr">replacement:</span> <span class="string">$2</span></span><br><span class="line">    <span class="attr">action:</span> <span class="string">replace</span></span><br><span class="line">  <span class="bullet">-</span> <span class="attr">separator:</span> <span class="string">;</span></span><br><span class="line">    <span class="attr">regex:</span> <span class="string">(.*)</span></span><br><span class="line">    <span class="attr">target_label:</span> <span class="string">__address__</span></span><br><span class="line">    <span class="attr">replacement:</span> <span class="string">blackbox-exporter:9115</span></span><br><span class="line">    <span class="attr">action:</span> <span class="string">replace</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></pre></td><td class="code"><pre><span class="line">curl <span class="string">&quot;http://blackbox-exporter.monitor:9115/probe?target=http://a.test.com&amp;module=http_accept_404&quot;</span></span><br></pre></td></tr></table></figure><h2 id="PromQL-常用查询"><a href="#PromQL-常用查询" class="headerlink" title="PromQL 常用查询"></a>PromQL 常用查询</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></pre></td><td class="code"><pre><span class="line"><span class="comment"># 查询证书到期时间</span></span><br><span class="line">(probe_ssl_earliest_cert_expiry&#123;project=<span class="string">&quot;project1&quot;</span>,<span class="built_in">env</span>=<span class="string">&quot;prod&quot;</span>&#125; - time()) / 60 / 60 / 24</span><br><span class="line"></span><br><span class="line"><span class="comment"># 查询接口通不通</span></span><br><span class="line">probe_success&#123;project=<span class="string">&quot;project1&quot;</span>,<span class="built_in">env</span>=<span class="string">&quot;prod&quot;</span>&#125;</span><br><span class="line"></span><br><span class="line"><span class="comment"># 查询接口延迟，包括 tcp监控 http监控</span></span><br><span class="line">probe_duration_seconds&#123;project=<span class="string">&quot;project1&quot;</span>,<span class="built_in">env</span>=<span class="string">&quot;prod&quot;</span>&#125;</span><br></pre></td></tr></table></figure>]]>
    </content>
    <id>https://zahui.fan/posts/sxztsa/</id>
    <link href="https://zahui.fan/posts/sxztsa/"/>
    <published>2025-06-17T09:16:58.000Z</published>
    <summary>
      <![CDATA[<h2 id="blackbox-创建模块"><a href="#blackbox-创建模块" class="headerlink" title="blackbox 创建模块"></a>blackbox 创建模块</h2><p>对应的 blackbox exporter 的配置文件：</p>
<figure class="highlight yml"><table><tr><td]]>
    </summary>
    <title>使用blackbox-exporter做域名监控</title>
    <updated>2025-06-18T07:28:39.000Z</updated>
  </entry>
  <entry>
    <author>
      <name>张理坤</name>
    </author>
    <category term="数据库" scheme="https://zahui.fan/categories/%E6%95%B0%E6%8D%AE%E5%BA%93/"/>
    <category term="踩坑记录" scheme="https://zahui.fan/tags/%E8%B8%A9%E5%9D%91%E8%AE%B0%E5%BD%95/"/>
    <content>
      <![CDATA[<p>业务报错如下：</p><p><img src="https://s3.babudiu.com/iuxt/public/nes.svg" data-lazy-src="https://s3.babudiu.com/iuxt/images/20250609183441693.png" alt="image.png"></p><p>经过排查为 MySQL 字符集 utf8 ，当插入 emoji 表情包的时候，就会报错。</p><blockquote><p>用 python 查看这是个什么：<br> <code>b&#39;\xF0\x9F\x90\x92&#39;.decode(&#39;utf-8&#39;)</code><br> <img src="https://s3.babudiu.com/iuxt/public/nes.svg" data-lazy-src="https://s3.babudiu.com/iuxt/2025/08/fb70f46de93a4c206abd70ac6642dc46.png" alt="image.png"></p></blockquote><p>尝试将表转换成 utf8mb4 字符集</p><figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">ALTER</span> <span class="keyword">TABLE</span> vehicle_user_role <span class="keyword">CONVERT</span> <span class="keyword">TO</span> <span class="type">CHARACTER</span> <span class="keyword">SET</span> utf8mb4 <span class="keyword">COLLATE</span> utf8mb4_general_ci;</span><br></pre></td></tr></table></figure><p>结果导致 数据库 CPU 飙升</p><p>于是进行回滚操作：</p><figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">ALTER</span> <span class="keyword">TABLE</span> vehicle_user_role <span class="keyword">CONVERT</span> <span class="keyword">TO</span> <span class="type">CHARACTER</span> <span class="keyword">SET</span> utf8 <span class="keyword">COLLATE</span> utf8_general_ci;</span><br></pre></td></tr></table></figure><p>结果报错：</p><figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">ERROR <span class="number">1366</span> (HY000): Incorrect string <span class="keyword">value</span>: <span class="string">&#x27;\xF0\x9F\x90\x92&quot;&#125;&#x27;</span> <span class="keyword">for</span> <span class="keyword">column</span> <span class="string">&#x27;EXT&#x27;</span> <span class="keyword">at</span> <span class="type">row</span> <span class="number">333582</span></span><br></pre></td></tr></table></figure><p>原因是执行完这段时间已经有 emoji 数据写入到数据库了，找到这条数据：</p><figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">SELECT</span> <span class="operator">*</span> <span class="keyword">FROM</span> vehicle_user_role <span class="keyword">WHERE</span> HEX(`EXT`) <span class="keyword">LIKE</span> <span class="string">&#x27;%F09F9092%&#x27;</span> LIMIT <span class="number">1</span>;</span><br></pre></td></tr></table></figure><p>清理不正确的数据：</p><figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">UPDATE</span> vehicle_user_role <span class="keyword">SET</span> EXT <span class="operator">=</span> <span class="keyword">NULL</span> <span class="keyword">WHERE</span> ROLE_ID <span class="operator">=</span> <span class="string">&#x27;df169ce2c1dd4574b014cb184b970f8e&#x27;</span>;</span><br></pre></td></tr></table></figure><p>再次转换：</p><figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">ALTER</span> <span class="keyword">TABLE</span> vehicle_user_role <span class="keyword">CONVERT</span> <span class="keyword">TO</span> <span class="type">CHARACTER</span> <span class="keyword">SET</span> utf8 <span class="keyword">COLLATE</span> utf8_general_ci;</span><br></pre></td></tr></table></figure><p>这个时候数据库还原成原始的样子。</p><p>转换了表的字符集导致跨表查询的时候索引失效了，正确处理方式：不改表只转换字段的字符集：</p><figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">ALTER</span> <span class="keyword">TABLE</span> vehicle_user_role MODIFY <span class="keyword">COLUMN</span> EXT <span class="type">varchar</span>(<span class="number">500</span>) <span class="type">CHARACTER</span> <span class="keyword">SET</span> utf8mb4 <span class="keyword">COLLATE</span> utf8mb4_general_ci;</span><br></pre></td></tr></table></figure>]]>
    </content>
    <id>https://zahui.fan/posts/sxl41q/</id>
    <link href="https://zahui.fan/posts/sxl41q/"/>
    <published>2025-06-09T10:34:38.000Z</published>
    <summary>
      <![CDATA[<p>业务报错如下：</p>
<p><img src="https://s3.babudiu.com/iuxt/public/nes.svg" data-lazy-src="https://s3.babudiu.com/iuxt/images/20250609183441693.png" alt="image.png"></p>
<p>经过排查为 MySQL 字符集 utf8 ，当插入]]>
    </summary>
    <title>记一次MySQL字符集转换导致的故障</title>
    <updated>2025-08-15T15:23:33.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/"/>
    <content>
      <![CDATA[<p>双向认证是用户需要提供证书来访问服务器，没有证书的用户不允许访问服务器，并且在服务端可以实现吊销指定用户的证书来实现禁止用户访问。配置 https 双向认证会影响到使用 https 协议拉取和推送代码，以及 git lfs 的正常使用 (lfs 使用 https 协议)，ssh 协议使用代码仓库不受影响。</p><h2 id="配置双向认证"><a href="#配置双向认证" class="headerlink" title="配置双向认证"></a>配置双向认证</h2><p>我是用的自签名证书，自签名证书的文档可以查看 <a href="/posts/097e5b7c/">制作和使用自签名证书</a> 或者我的开源项目：<a href="https://github.com/iuxt/my_cert.git">https://github.com/iuxt/my_cert.git</a></p><h3 id="服务器上的-nginx-上配置"><a href="#服务器上的-nginx-上配置" class="headerlink" title="服务器上的 nginx 上配置"></a>服务器上的 nginx 上配置</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></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 example.com;</span><br><span class="line"></span><br><span class="line">    ssl_certificate /path/to/your/server.crt;</span><br><span class="line">    ssl_certificate_key /path/to/your/server.key;</span><br><span class="line"></span><br><span class="line">    ssl_client_certificate /path/to/your/ca.crt;        # 配置 CA 证书，用于验证客户端证书的签发者</span><br><span class="line">    ssl_verify_client on;                               # 启用客户端证书验证</span><br><span class="line">    ssl_crl /path/to/your/crl.pem;                      # 配置 CRL 文件路径，用于检查吊销的证书</span><br><span class="line"></span><br><span class="line">    location / &#123;</span><br><span class="line">        root /var/www/html;</span><br><span class="line">        index index.html;</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</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/images/20250604105943557.png" alt="image.png"></p><h2 id="操作系统信任-CA-证书"><a href="#操作系统信任-CA-证书" class="headerlink" title="操作系统信任 CA 证书"></a>操作系统信任 CA 证书</h2><h3 id="Windows"><a href="#Windows" class="headerlink" title="Windows"></a>Windows</h3><p>Windows 将证书导入到系统的个人分类下。</p><h3 id="macOS"><a href="#macOS" class="headerlink" title="macOS"></a>macOS</h3><p>macOS– 待补充。</p><h3 id="Linux"><a href="#Linux" class="headerlink" title="Linux"></a>Linux</h3><p>Debian 系 Linux：</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">sudo <span class="built_in">cp</span> cacert.crt /usr/local/share/ca-certificates/</span><br><span class="line">sudo update-ca-certificates</span><br></pre></td></tr></table></figure><p>RedHat 系 Linux：</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">sudo <span class="built_in">cp</span> cacert.crt /etc/pki/ca-trust/source/anchors/</span><br><span class="line">sudo update-ca-trust</span><br></pre></td></tr></table></figure><p>信任完成后，浏览器重启后再次打开 git 网页：<br>选择证书，点击确定，就可以正常打开页面了。<br><img src="https://s3.babudiu.com/iuxt/public/nes.svg" data-lazy-src="https://s3.babudiu.com/iuxt/images/20250604110355773.png" alt="image.png"></p><h2 id="Git-客户端配置"><a href="#Git-客户端配置" class="headerlink" title="Git 客户端配置"></a>Git 客户端配置</h2><p>上面的配置，浏览器已经可以正常携带证书来访问指定的服务了，但是 git 客户端还不行，需要对 git 仓库进行配置。</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="comment"># 需要全局配置，增加 --global 参数。会写入到 ~/.gitconfig 中。</span></span><br><span class="line">git config http.sslCert C:\Users\iuxt\OneDrive\keys\manage.crt</span><br><span class="line">git config http.sslkey C:\Users\iuxt\OneDrive\keys\manage.key</span><br></pre></td></tr></table></figure>]]>
    </content>
    <id>https://zahui.fan/posts/sxb6po/</id>
    <link href="https://zahui.fan/posts/sxb6po/"/>
    <published>2025-06-04T01:56:12.000Z</published>
    <summary>
      <![CDATA[<p>双向认证是用户需要提供证书来访问服务器，没有证书的用户不允许访问服务器，并且在服务端可以实现吊销指定用户的证书来实现禁止用户访问。配置 https 双向认证会影响到使用 https 协议拉取和推送代码，以及 git lfs 的正常使用 (lfs 使用 https 协议)，ssh 协议使用代码仓库不受影响。</p>
<h2 id="配置双向认证"><a href="#配置双向认证"]]>
    </summary>
    <title>使用双向认证增加git仓库安全性</title>
    <updated>2025-06-04T03:06:07.000Z</updated>
  </entry>
  <entry>
    <author>
      <name>张理坤</name>
    </author>
    <category term="监控" scheme="https://zahui.fan/categories/%E7%9B%91%E6%8E%A7/"/>
    <content>
      <![CDATA[<h2 id="定义"><a href="#定义" class="headerlink" title="定义"></a>定义</h2><p>部署在 Kubernetes 上的 Prometheus 是有自动发现机制的，可以自动监控 service 通不通、监控 ingress 上的域名通不通等等。</p><h2 id="HTTP-Get-监控"><a href="#HTTP-Get-监控" class="headerlink" title="HTTP Get 监控"></a>HTTP Get 监控</h2><h3 id="service-的-HTTP-Get-监控"><a href="#service-的-HTTP-Get-监控" class="headerlink" title="service 的 HTTP Get 监控"></a>service 的 HTTP Get 监控</h3><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></pre></td><td class="code"><pre><span class="line"><span class="bullet">-</span> <span class="attr">job_name:</span> <span class="string">&#x27;service_http_get&#x27;</span></span><br><span class="line"></span><br><span class="line">  <span class="comment"># service 需要添加注解</span></span><br><span class="line">  <span class="comment"># prometheus.io/http_get_path: /actuator/info</span></span><br><span class="line">  <span class="comment"># prometheus.io/http_get: &quot;true&quot;</span></span><br><span class="line">  <span class="comment"># prometheus.io/http_get_port: &quot;8080&quot;</span></span><br><span class="line"></span><br><span class="line">  <span class="attr">metrics_path:</span> <span class="string">/probe</span></span><br><span class="line">  <span class="attr">params:</span></span><br><span class="line">    <span class="attr">module:</span> [<span class="string">http_2xx</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">service</span></span><br><span class="line">  <span class="attr">relabel_configs:</span></span><br><span class="line">  <span class="bullet">-</span> <span class="attr">source_labels:</span> [<span class="string">__meta_kubernetes_service_annotation_prometheus_io_http_get</span>]</span><br><span class="line">    <span class="attr">action:</span> <span class="string">keep</span></span><br><span class="line">    <span class="attr">regex:</span> <span class="literal">true</span></span><br><span class="line"></span><br><span class="line">  <span class="bullet">-</span> <span class="attr">source_labels:</span> [<span class="string">__address__</span>, <span class="string">__meta_kubernetes_service_annotation_prometheus_io_http_get_port</span>, <span class="string">__meta_kubernetes_service_annotation_prometheus_io_http_get_path</span>]</span><br><span class="line">    <span class="attr">action:</span> <span class="string">replace</span></span><br><span class="line">    <span class="comment"># 正则解释：</span></span><br><span class="line">    <span class="comment"># 第一组([^:]+) - 匹配地址部分（直到冒号或结尾）</span></span><br><span class="line">    <span class="comment"># (:[0-9]+)? - 可选匹配端口部分</span></span><br><span class="line">    <span class="comment"># ;([0-9]+) - 匹配注解中的端口</span></span><br><span class="line">    <span class="comment"># ;(/.*)? - 匹配注解中的路径（可选）</span></span><br><span class="line">    <span class="attr">regex:</span> <span class="string">([^:]+)(:[0-9]+)?;([0-9]+);(/.*)?</span></span><br><span class="line">    <span class="attr">replacement:</span> <span class="string">http://$1:$3$4</span></span><br><span class="line">    <span class="attr">target_label:</span> <span class="string">__param_target</span></span><br><span class="line"></span><br><span class="line">  <span class="bullet">-</span> <span class="attr">target_label:</span> <span class="string">__address__</span></span><br><span class="line">    <span class="attr">replacement:</span> <span class="string">blackbox-exporter.monitor.svc:9115</span></span><br><span class="line"></span><br><span class="line">  <span class="bullet">-</span> <span class="attr">source_labels:</span> [<span class="string">__param_target</span>]</span><br><span class="line">    <span class="attr">target_label:</span> <span class="string">instance</span></span><br><span class="line"></span><br><span class="line">  <span class="comment"># 额外添加标签</span></span><br><span class="line">  <span class="bullet">-</span> <span class="attr">action:</span> <span class="string">labelmap</span></span><br><span class="line">    <span class="attr">regex:</span> <span class="string">__meta_kubernetes_service_label_(.+)</span></span><br><span class="line"></span><br><span class="line">  <span class="bullet">-</span> <span class="attr">source_labels:</span> [<span class="string">__meta_kubernetes_namespace</span>]</span><br><span class="line">    <span class="attr">target_label:</span> <span class="string">namespace</span></span><br><span class="line"></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">service_name</span></span><br><span class="line"></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">app</span></span><br><span class="line"></span><br></pre></td></tr></table></figure><h3 id="ingress-的-HTTP-Get-监控"><a href="#ingress-的-HTTP-Get-监控" class="headerlink" title="ingress 的 HTTP Get 监控"></a>ingress 的 HTTP Get 监控</h3><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></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;ingress_http_get&#x27;</span></span><br><span class="line"></span><br><span class="line">  <span class="comment"># ingress 需要添加注解才可被自动发现</span></span><br><span class="line">  <span class="comment"># prometheus.io/http_get_path: /actuator/info</span></span><br><span class="line">  <span class="comment"># prometheus.io/http_get: &quot;true&quot;</span></span><br><span class="line"></span><br><span class="line">  <span class="attr">metrics_path:</span> <span class="string">/probe</span></span><br><span class="line">  <span class="attr">params:</span></span><br><span class="line">    <span class="attr">module:</span> [<span class="string">http_2xx</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">ingress</span></span><br><span class="line">  <span class="attr">relabel_configs:</span></span><br><span class="line"></span><br><span class="line">  <span class="bullet">-</span> <span class="attr">source_labels:</span> [<span class="string">__meta_kubernetes_ingress_annotation_kubernetes_io_http_get</span>]</span><br><span class="line">    <span class="attr">action:</span> <span class="string">keep</span></span><br><span class="line">    <span class="attr">regex:</span> <span class="literal">true</span></span><br><span class="line"></span><br><span class="line">  <span class="bullet">-</span> <span class="attr">source_labels:</span> [<span class="string">__meta_kubernetes_ingress_scheme</span>,<span class="string">__address__</span>,<span class="string">__meta_kubernetes_ingress_annotation_kubernetes_io_http_get_path</span>]</span><br><span class="line">    <span class="attr">target_label:</span> <span class="string">__param_target</span></span><br><span class="line">    <span class="attr">regex:</span> <span class="string">(.+);(.+);(.*)</span></span><br><span class="line">    <span class="attr">replacement:</span> <span class="string">$&#123;1&#125;://$&#123;2&#125;$&#123;3&#125;</span></span><br><span class="line"></span><br><span class="line">  <span class="bullet">-</span> <span class="attr">target_label:</span> <span class="string">__address__</span></span><br><span class="line">    <span class="attr">replacement:</span> <span class="string">blackbox-exporter.monitor.svc:9115</span></span><br><span class="line"></span><br><span class="line">  <span class="bullet">-</span> <span class="attr">source_labels:</span> [<span class="string">__param_target</span>]</span><br><span class="line">    <span class="attr">target_label:</span> <span class="string">instance</span></span><br><span class="line"></span><br><span class="line">  <span class="comment"># 额外添加标签</span></span><br><span class="line">  <span class="bullet">-</span> <span class="attr">action:</span> <span class="string">labelmap</span></span><br><span class="line">    <span class="attr">regex:</span> <span class="string">__meta_kubernetes_ingress_label_(.+)</span></span><br><span class="line"></span><br><span class="line">  <span class="bullet">-</span> <span class="attr">source_labels:</span> [<span class="string">__meta_kubernetes_namespace</span>]</span><br><span class="line">    <span class="attr">target_label:</span> <span class="string">kubernetes_namespace</span></span><br><span class="line"></span><br><span class="line">  <span class="bullet">-</span> <span class="attr">source_labels:</span> [<span class="string">__meta_kubernetes_ingress_name</span>]</span><br><span class="line">    <span class="attr">target_label:</span> <span class="string">kubernetes_name</span></span><br><span class="line">  <span class="bullet">-</span> <span class="attr">source_labels:</span> [<span class="string">__meta_kubernetes_ingress_name</span>]</span><br><span class="line">    <span class="attr">target_label:</span> <span class="string">app</span></span><br><span class="line"></span><br></pre></td></tr></table></figure><h2 id="收集业务-Metrics"><a href="#收集业务-Metrics" class="headerlink" title="收集业务 Metrics"></a>收集业务 Metrics</h2><p>比如有的业务会暴露出 metrics，比如 Prometheus 的各种 exporter，一个一个接入比较麻烦，也可以利用 service 自动发现的形式接入 Prometheus</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></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="comment"># service 需要添加元数据 通常需要有 /metrics 接口返回 prometheus 数据格式</span></span><br><span class="line">  <span class="comment"># prometheus.io/path: /metrics</span></span><br><span class="line">  <span class="comment"># prometheus.io/port: &quot;8080&quot;</span></span><br><span class="line">  <span class="comment"># prometheus.io/scrape: &quot;true&quot;</span></span><br><span class="line"></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">relabel_configs:</span></span><br><span class="line">  <span class="bullet">-</span> <span class="attr">source_labels:</span> [<span class="string">__meta_kubernetes_service_annotation_prometheus_io_scrape</span>]</span><br><span class="line">    <span class="attr">action:</span> <span class="string">keep</span></span><br><span class="line">    <span class="attr">regex:</span> <span class="literal">true</span></span><br><span class="line">  <span class="bullet">-</span> <span class="attr">source_labels:</span> [<span class="string">__meta_kubernetes_service_annotation_prometheus_io_scheme</span>]</span><br><span class="line">    <span class="attr">action:</span> <span class="string">replace</span></span><br><span class="line">    <span class="attr">target_label:</span> <span class="string">__scheme__</span></span><br><span class="line">    <span class="attr">regex:</span> <span class="string">(https?)</span></span><br><span class="line">  <span class="bullet">-</span> <span class="attr">source_labels:</span> [<span class="string">__meta_kubernetes_service_annotation_prometheus_io_path</span>]</span><br><span class="line">    <span class="attr">action:</span> <span class="string">replace</span></span><br><span class="line">    <span class="attr">target_label:</span> <span class="string">__metrics_path__</span></span><br><span class="line">    <span class="attr">regex:</span> <span class="string">(.+)</span></span><br><span class="line">  <span class="bullet">-</span> <span class="attr">source_labels:</span> [<span class="string">__meta_kubernetes_service_annotation_prometheus_io_env</span>]</span><br><span class="line">    <span class="attr">action:</span> <span class="string">replace</span></span><br><span class="line">    <span class="attr">target_label:</span> <span class="string">env</span></span><br><span class="line">  <span class="bullet">-</span> <span class="attr">source_labels:</span> [<span class="string">__meta_kubernetes_service_annotation_prometheus_io_dept</span>]</span><br><span class="line">    <span class="attr">action:</span> <span class="string">replace</span></span><br><span class="line">    <span class="attr">target_label:</span> <span class="string">dept</span></span><br><span class="line">  <span class="bullet">-</span> <span class="attr">source_labels:</span> [<span class="string">__meta_kubernetes_service_annotation_prometheus_io_app</span>]</span><br><span class="line">    <span class="attr">action:</span> <span class="string">replace</span></span><br><span class="line">    <span class="attr">target_label:</span> <span class="string">app</span></span><br><span class="line">  <span class="bullet">-</span> <span class="attr">source_labels:</span> [<span class="string">__meta_kubernetes_service_annotation_prometheus_io_project</span>]</span><br><span class="line">    <span class="attr">action:</span> <span class="string">replace</span></span><br><span class="line">    <span class="attr">target_label:</span> <span class="string">project</span></span><br><span class="line">  <span class="bullet">-</span> <span class="attr">source_labels:</span> [<span class="string">__address__</span>, <span class="string">__meta_kubernetes_service_annotation_prometheus_io_port</span>]</span><br><span class="line">    <span class="attr">action:</span> <span class="string">replace</span></span><br><span class="line">    <span class="attr">target_label:</span> <span class="string">__address__</span></span><br><span class="line">    <span class="attr">regex:</span> <span class="string">([^:]+)(?::\d+)?;(\d+)</span></span><br><span class="line">    <span class="attr">replacement:</span> <span class="string">$1:$2</span></span><br><span class="line">  <span class="bullet">-</span> <span class="attr">action:</span> <span class="string">labelmap</span></span><br><span class="line">    <span class="attr">regex:</span> <span class="string">__meta_kubernetes_service_label_(.+)</span></span><br><span class="line"></span><br><span class="line">    </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_namespace</span>]</span><br><span class="line">    <span class="attr">action:</span> <span class="string">replace</span></span><br><span class="line">    <span class="attr">target_label:</span> <span class="string">kubernetes_namespace</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">action:</span> <span class="string">replace</span></span><br><span class="line">    <span class="attr">target_label:</span> <span class="string">kubernetes_service_name</span></span><br><span class="line">  <span class="bullet">-</span> <span class="attr">source_labels:</span> [<span class="string">__meta_kubernetes_pod_host_ip</span>]</span><br><span class="line">    <span class="attr">action:</span> <span class="string">replace</span></span><br><span class="line">    <span class="attr">target_label:</span> <span class="string">node_ip</span></span><br><span class="line">  <span class="bullet">-</span> <span class="attr">source_labels:</span> [<span class="string">__meta_kubernetes_pod_name</span>]</span><br><span class="line">    <span class="attr">action:</span> <span class="string">replace</span></span><br><span class="line">    <span class="attr">target_label:</span> <span class="string">pod_name</span></span><br></pre></td></tr></table></figure><p>在需要接入监控的 service 上配置注解即可实现自动接入，注解如下：</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></pre></td><td class="code"><pre><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">ops-kafka-exporter</span></span><br><span class="line">  <span class="attr">namespace:</span> <span class="string">kafka-exporter</span></span><br><span class="line">  <span class="attr">annotations:</span></span><br><span class="line">    <span class="attr">prometheus.io/scrape:</span> <span class="string">&#x27;true&#x27;</span></span><br><span class="line">    <span class="attr">prometheus.io/path:</span> <span class="string">/metrics</span></span><br><span class="line">    <span class="attr">prometheus.io/port:</span> <span class="string">&#x27;9308&#x27;</span></span><br><span class="line">    <span class="attr">prometheus.io/project:</span> <span class="string">ops</span></span><br><span class="line">    <span class="attr">prometheus.io/app:</span> <span class="string">ops-kafka</span></span><br><span class="line">    <span class="attr">prometheus.io/dept:</span> <span class="string">ep</span></span><br><span class="line">    <span class="attr">prometheus.io/env:</span> <span class="string">prod</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">protocol:</span> <span class="string">TCP</span></span><br><span class="line">      <span class="attr">port:</span> <span class="number">9308</span></span><br><span class="line">      <span class="attr">targetPort:</span> <span class="number">9308</span></span><br><span class="line">  <span class="attr">selector:</span></span><br><span class="line">    <span class="attr">app:</span> <span class="string">ops-kafka-exporter</span></span><br><span class="line">  <span class="attr">type:</span> <span class="string">ClusterIP</span></span><br></pre></td></tr></table></figure>]]>
    </content>
    <id>https://zahui.fan/posts/sw6yvo/</id>
    <link href="https://zahui.fan/posts/sw6yvo/"/>
    <published>2025-05-13T08:42:59.000Z</published>
    <summary>
      <![CDATA[<h2 id="定义"><a href="#定义" class="headerlink" title="定义"></a>定义</h2><p>部署在 Kubernetes 上的 Prometheus 是有自动发现机制的，可以自动监控 service 通不通、监控 ingress 上的域名通不通等等。</p>
<h2 id="HTTP-Get-监控"><a href="#HTTP-Get-监控"]]>
    </summary>
    <title>Prometheus自动监控K8S集群中的service</title>
    <updated>2025-05-27T02:36:08.000Z</updated>
  </entry>
  <entry>
    <author>
      <name>张理坤</name>
    </author>
    <category term="监控" scheme="https://zahui.fan/categories/%E7%9B%91%E6%8E%A7/"/>
    <content>
      <![CDATA[<p>比如一个 dashboard 里面有很多通用的数据，不想每个 panel 面板都手动修改一遍，可以定义个全局的变量，所有面板都调用这个变量，后续需要修改的时候，直接改变量即可。</p><h2 id="面板设置里添加变量"><a href="#面板设置里添加变量" class="headerlink" title="面板设置里添加变量"></a>面板设置里添加变量</h2><p>这里添加好了之后，先打开 show on dashboard 显示</p><p><img src="https://s3.babudiu.com/iuxt/public/nes.svg" data-lazy-src="https://s3.babudiu.com/iuxt/images/20250506163411627.png" alt="image.png"></p><p>然后选择自己需要的数据，保存的时候，勾选 update default variable values 保存当前选择的值<br><img src="https://s3.babudiu.com/iuxt/public/nes.svg" data-lazy-src="https://s3.babudiu.com/iuxt/images/20250506163204899.png" alt="image.png"><br>最后再把变量隐藏起来。</p><h2 id="在查询的时候调用变量"><a href="#在查询的时候调用变量" class="headerlink" title="在查询的时候调用变量"></a>在查询的时候调用变量</h2><figure class="highlight sql"><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></pre></td><td class="code"><pre><span class="line"><span class="keyword">SELECT</span></span><br><span class="line">    `<span class="keyword">desc</span>` <span class="keyword">AS</span> <span class="string">&#x27;说明&#x27;</span>,</span><br><span class="line">    CONVERT_TZ(<span class="type">time</span>, <span class="string">&#x27;+08:00&#x27;</span>, <span class="string">&#x27;+00:00&#x27;</span>) <span class="keyword">AS</span> <span class="string">&#x27;最近日期&#x27;</span>,</span><br><span class="line">    vin,</span><br><span class="line">    <span class="keyword">value</span> <span class="keyword">AS</span> <span class="string">&#x27;发生数量&#x27;</span></span><br><span class="line"><span class="keyword">FROM</span></span><br><span class="line">    granfana.metric</span><br><span class="line"><span class="keyword">WHERE</span></span><br><span class="line">    metric_name <span class="operator">=</span> <span class="string">&#x27;active_fail&#x27;</span></span><br><span class="line">    <span class="keyword">AND</span> vin <span class="keyword">IN</span> ($&#123;users&#125;)</span><br><span class="line"><span class="keyword">ORDER</span> <span class="keyword">BY</span></span><br><span class="line">    最近日期 <span class="keyword">DESC</span></span><br></pre></td></tr></table></figure><h2 id="如何调试"><a href="#如何调试" class="headerlink" title="如何调试"></a>如何调试</h2><p>点击面板设置上的 Query inspector 查询 里 可以看到原始的数据。<br><img src="https://s3.babudiu.com/iuxt/public/nes.svg" data-lazy-src="https://s3.babudiu.com/iuxt/images/20250506165823095.png" alt="image.png"></p>]]>
    </content>
    <id>https://zahui.fan/posts/svtyfb/</id>
    <link href="https://zahui.fan/posts/svtyfb/"/>
    <published>2025-05-06T08:04:22.000Z</published>
    <summary>
      <![CDATA[<p>比如一个 dashboard 里面有很多通用的数据，不想每个 panel 面板都手动修改一遍，可以定义个全局的变量，所有面板都调用这个变量，后续需要修改的时候，直接改变量即可。</p>
<h2 id="面板设置里添加变量"><a href="#面板设置里添加变量" class="headerlink"]]>
    </summary>
    <title>Grafana 查询SQL 自定义变量</title>
    <updated>2025-05-06T09:01:06.000Z</updated>
  </entry>
</feed>
