<rss xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title>K8s - tag - 沐木</title><link>https://oldletter.cn/tags/k8s/</link><description>K8s - tag - 沐木</description><generator>Hugo -- gohugo.io</generator><language>zh-cn</language><lastBuildDate>Thu, 20 Jun 2024 00:00:00 +0000</lastBuildDate><atom:link href="https://oldletter.cn/tags/k8s/" rel="self" type="application/rss+xml"/><item><title>发版流程实战：从代码提交到生产上线的完整链路</title><link>https://oldletter.cn/posts/devops-01-release-workflow/</link><pubDate>Fri, 15 Mar 2024 00:00:00 +0000</pubDate><author>mumu</author><guid>https://oldletter.cn/posts/devops-01-release-workflow/</guid><description><![CDATA[<blockquote>
<p>作者：林 | 系列：DevOps 实战 | 适合读者：后端/运维/架构师</p></blockquote>
<hr>
<h2 id="一为什么需要一套规范的发版流程">一、为什么需要一套规范的发版流程</h2>
<p>很多团队的发版流程是&quot;人工操作 + 口头确认&quot;：开发本地打包、运维手动部署、群里喊一声&quot;发了&quot;。这种方式在团队小、服务少的时候还能凑合，但一旦服务超过 5 个、团队超过 10 人，各种问题就来了：</p>
<ul>
<li><strong>发错版本</strong>：分支没合并干净，把半成品发到生产</li>
<li><strong>回滚慢</strong>：出问题后找不到上一个稳定版本，或者回滚步骤不一致</li>
<li><strong>环境不一致</strong>：测试环境和生产环境配置不同，测试通过了生产挂了</li>
<li><strong>发版窗口长</strong>：从代码合并到上线要半天，错过业务窗口</li>
</ul>
<p>一套规范的发版流程并非为了&quot;流程化而流程化&quot;，重点是为了<strong>让发版可重复、可预测、可回滚</strong>。</p>
<hr>
<h2 id="二整体架构一览">二、整体架构一览</h2>
<p>一套完整的发版链路，通常包含以下环节：</p>
<div class="mermaid" id="id-2" data-mermaid-definition="Zmxvd2NoYXJ0IExSCiAgICBDb21taXRbIuS7o&#43;eggeaPkOS6pCJdIC0tPiBSZXZpZXdbIuS7o&#43;eggeWuoeafpSJdCiAgICBSZXZpZXcgLS0&#43;IEJ1aWxkWyJDSSDmnoTlu7rkuI7mtYvor5UiXQogICAgQnVpbGQgLS0&#43;IEFydGlmYWN0WyLkuI3lj6/lj5jliLblk4EiXQogICAgQXJ0aWZhY3QgLS0&#43;IFRlc3RbIua1i&#43;ivleeOr&#43;Wig&#43;mqjOivgSJdCiAgICBUZXN0IC0tPiBTdGFnZVsi6aKE5Y&#43;R5biD6aqM6K&#43;BIl0KICAgIFN0YWdlIC0tPiBBcHByb3ZhbFsi5Y&#43;R5biD5a6h5om5Il0KICAgIEFwcHJvdmFsIC0tPiBQcm9kWyLnlJ/kuqfngbDluqYiXQogICAgUHJvZCAtLT4gT2JzZXJ2ZXsi5oyH5qCH6L6&#43;5qCHIn0KICAgIE9ic2VydmUgLS0gIue7p&#43;e7rSIgLS0&#43;IENvbXBsZXRlWyLlrozmiJDlj5HluIMiXQogICAgT2JzZXJ2ZSAtLSAi5ZCmIiAtLT4gUm9sbGJhY2tbIuWbnua7muaIluWBnOatouaUvumHjyJd">flowchart LR
    Commit[&#34;代码提交&#34;] --&gt; Review[&#34;代码审查&#34;]
    Review --&gt; Build[&#34;CI 构建与测试&#34;]
    Build --&gt; Artifact[&#34;不可变制品&#34;]
    Artifact --&gt; Test[&#34;测试环境验证&#34;]
    Test --&gt; Stage[&#34;预发布验证&#34;]
    Stage --&gt; Approval[&#34;发布审批&#34;]
    Approval --&gt; Prod[&#34;生产灰度&#34;]
    Prod --&gt; Observe{&#34;指标达标&#34;}
    Observe -- &#34;继续&#34; --&gt; Complete[&#34;完成发布&#34;]
    Observe -- &#34;否&#34; --&gt; Rollback[&#34;回滚或停止放量&#34;]</div><p>每个环境的职责不同：</p>
<table>
  <thead>
      <tr>
          <th>环境</th>
          <th>用途</th>
          <th>部署触发方式</th>
          <th>数据</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>dev</td>
          <td>开发自测</td>
          <td>手动 / push 触发</td>
          <td>mock 数据</td>
      </tr>
      <tr>
          <td>test</td>
          <td>功能测试、集成测试</td>
          <td>合并到 develop 触发</td>
          <td>测试数据</td>
      </tr>
      <tr>
          <td>staging</td>
          <td>预发布验证，跟生产一致</td>
          <td>合并到 main / 手动</td>
          <td>生产数据脱敏副本</td>
      </tr>
      <tr>
          <td>prod</td>
          <td>线上服务</td>
          <td>打 tag / 手动审批</td>
          <td>真实数据</td>
      </tr>
  </tbody>
</table>
<hr>
<h2 id="三分支策略">三、分支策略</h2>
<h3 id="31-git-flow经典方案">3.1 Git Flow（经典方案）</h3>
<p>适合有明确版本发布节奏的项目：</p>]]></description></item><item><title>CI/CD 进阶：构建与发布分离，用 Release Manifest 管控生产发布</title><link>https://oldletter.cn/posts/devops-02-build-once-deploy-many/</link><pubDate>Thu, 20 Jun 2024 00:00:00 +0000</pubDate><author>mumu</author><guid>https://oldletter.cn/posts/devops-02-build-once-deploy-many/</guid><description><![CDATA[<blockquote>
<p>作者：林 | 系列：DevOps 实战 | 适合读者：后端/运维/DevOps 工程师</p></blockquote>
<hr>
<h2 id="一问题你的生产发布靠什么保证发的是测试通过的版本">一、问题：你的生产发布靠什么保证&quot;发的是测试通过的版本&quot;？</h2>
<p>很多团队的生产发布流程是这样的：</p>
<ol>
<li>测试在测试环境验证通过</li>
<li>开发或运维在生产流水线里<strong>手动填一个 IMAGE_TAG</strong></li>
<li>部署到生产</li>
</ol>
<p>问题来了，<strong>这个 IMAGE_TAG 是谁填的？填的对不对？怎么证明测试环境用的就是这个 tag？</strong></p>
<p>常见翻车场景：</p>
<ul>
<li>运维填错了 tag，把没测试过的版本发到生产</li>
<li>测试验证的是 commit abc1234，但生产发的是 def5678</li>
<li>出了问题想回滚，但不确定上一个稳定版本是哪个 tag</li>
<li>多人协作时，谁发的、发了什么、什么时候发的，全靠聊天记录</li>
</ul>
<p><strong>核心矛盾</strong>：生产发布的&quot;输入&quot;没有约束，任何人都能填任何 tag。</p>
<hr>
<h2 id="二解决方案release-manifest">二、解决方案：Release Manifest</h2>
<h3 id="21-核心思路">2.1 核心思路</h3>
<p>核心约束是一次构建、多环境部署，生产只提升已经验证的制品。</p>
<p>具体来说：</p>
<ol>
<li><strong>dev/test 流水线</strong>负责构建镜像、推送 ACR、发布测试环境</li>
<li>测试环境发布成功后，生成一份 <strong>release-manifest.json</strong>（发布清单）</li>
<li>测试人员验证通过后，把 manifest 状态标记为 <code>TEST_PASSED</code></li>
<li><strong>prod 流水线</strong>只接受一个输入：<code>RELEASE_ID</code></li>
<li>prod 流水线根据 <code>RELEASE_ID</code> 读取 manifest，<strong>只发布 manifest 里记录的镜像</strong></li>
</ol>
<div class="mermaid" id="id-2" data-mermaid-definition="Zmxvd2NoYXJ0IFRECiAgICBDb21taXRbIuS7o&#43;eggeaPkOS6pCJdIC0tPiBCdWlsZFsi5p6E5bu644CB5rWL6K&#43;V5bm25o6o6YCB5Yi25ZOBIl0KICAgIEJ1aWxkIC0tPiBNYW5pZmVzdFsi55Sf5oiQ5Y&#43;R5biD5riF5Y2VIl0KICAgIE1hbmlmZXN0IC0tPiBUZXN0WyLpg6jnvbLmtYvor5Xnjq/looMiXQogICAgVGVzdCAtLT4gVmVyaWZ5eyLpqozor4HpgJrov4cifQogICAgVmVyaWZ5IC0tICLlkKYiIC0tPiBSZWplY3RbIue7iOatouivpeWPkeW4g&#43;a4heWNlSJdCiAgICBWZXJpZnkgLS0gIuaYryIgLS0&#43;IEFwcHJvdmVbIuaJueWHhua4heWNlSJdCiAgICBBcHByb3ZlIC0tPiBQcm9kWyLmjIkgUkVMRUFTRV9JRCDpg6jnvbLnlJ/kuqciXQogICAgUHJvZCAtLT4gUmVjb3JkWyLorrDlvZXlrp7pmYXpg6jnvbLnu5PmnpwiXQ==">flowchart TD
    Commit[&#34;代码提交&#34;] --&gt; Build[&#34;构建、测试并推送制品&#34;]
    Build --&gt; Manifest[&#34;生成发布清单&#34;]
    Manifest --&gt; Test[&#34;部署测试环境&#34;]
    Test --&gt; Verify{&#34;验证通过&#34;}
    Verify -- &#34;否&#34; --&gt; Reject[&#34;终止该发布清单&#34;]
    Verify -- &#34;是&#34; --&gt; Approve[&#34;批准清单&#34;]
    Approve --&gt; Prod[&#34;按 RELEASE_ID 部署生产&#34;]
    Prod --&gt; Record[&#34;记录实际部署结果&#34;]</div><p><strong>关键约束</strong>：prod 不接受 IMAGE_TAG 输入，只接受 RELEASE_ID。镜像版本由 manifest 决定，不由人手填。</p>]]></description></item></channel></rss>