<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/">
  <channel>
    <title>lidongqi</title>
    <link>https://lidongqi.github.io/</link>
    <description>Recent content on lidongqi</description>
    <generator>Hugo -- 0.137.0</generator>
    <language>zh</language>
    <lastBuildDate>Wed, 13 Nov 2024 16:33:24 +0800</lastBuildDate>
    <atom:link href="https://lidongqi.github.io/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>实现一个operator（1）</title>
      <link>https://lidongqi.github.io/posts/nginx-operator_1/</link>
      <pubDate>Wed, 13 Nov 2024 16:33:24 +0800</pubDate>
      <guid>https://lidongqi.github.io/posts/nginx-operator_1/</guid>
      <description>&lt;h1 id=&#34;写在前面&#34;&gt;写在前面&lt;/h1&gt;
&lt;p&gt;kubebuilder 是一个集成工具，为了更好的理解k8s工作流程。这里使用k8s tools实现一个operator。&lt;/p&gt;
&lt;h1 id=&#34;创建crd&#34;&gt;创建CRD&lt;/h1&gt;
&lt;h2 id=&#34;custom-resource&#34;&gt;Custom Resource&lt;/h2&gt;
&lt;p&gt;以Resource的角度来审视k8s，可以发现k8s实际上做的事情是对Resource的CRUD操作。&lt;/p&gt;
&lt;p&gt;Custom Resource是一种用户定义的k8s resource数据，可以通过k8s api对定义的Resource进行CRUD操作。&lt;/p&gt;
&lt;p&gt;对于resource本身而言，只是存储结构化的数据，如果期望资源数据改变时集群中状态发生对应变化，就需要有一个Controller来对数据变化感知，然后修改集群内的状态。&lt;/p&gt;
&lt;h2 id=&#34;custom-controller&#34;&gt;Custom Controller&lt;/h2&gt;
&lt;p&gt;custom controller就是用户定义的controller。完成对customer resource内容变更的对应操作。&lt;/p&gt;
&lt;p&gt;将Custom Resource 和Custom Controller结合起来，就是operator模式。&lt;/p&gt;
&lt;h2 id=&#34;聚合api和独立api&#34;&gt;聚合API和独立API&lt;/h2&gt;
&lt;p&gt;&lt;a href=&#34;https://kubernetes.io/zh-cn/docs/concepts/extend-kubernetes/api-extension/custom-resources/#should-i-add-a-cr-to-my-k8s-cluster&#34;&gt;官方文档&lt;/a&gt;很详细，引用一下&lt;/p&gt;
&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th&gt;&lt;/th&gt;
          &lt;th&gt;&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td&gt;考虑 API 聚合的情况&lt;/td&gt;
          &lt;td&gt;优选独立 API 的情况&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;你的 API 是&lt;a href=&#34;https://kubernetes.io/zh-cn/docs/concepts/extend-kubernetes/api-extension/custom-resources/#declarative-apis&#34;&gt;声明式的&lt;/a&gt;&lt;br&gt;&lt;br&gt;。&lt;/td&gt;
          &lt;td&gt;你的 API 不符合&lt;a href=&#34;https://kubernetes.io/zh-cn/docs/concepts/extend-kubernetes/api-extension/custom-resources/#declarative-apis&#34;&gt;声明式&lt;/a&gt;&lt;br&gt;&lt;br&gt;模型。&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;你希望可以是使用 kubectl 来读写你的新资源类别。&lt;/td&gt;
          &lt;td&gt;不要求 kubectl 支持。&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;你希望在 Kubernetes UI （如仪表板）中和其他内置类别一起查看你的新资源类别。&lt;/td&gt;
          &lt;td&gt;不需要 Kubernetes UI 支持。&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;你在开发新的 API。&lt;/td&gt;
          &lt;td&gt;你已经有一个提供 API 服务的程序并且工作良好。&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;你有意愿取接受 Kubernetes 对 REST 资源路径所作的格式限制，例如 API 组和名字空间。（参阅 &lt;a href=&#34;https://kubernetes.io/zh-cn/docs/concepts/overview/kubernetes-api/&#34;&gt;API 概述&lt;/a&gt;&lt;br&gt;&lt;br&gt;）&lt;/td&gt;
          &lt;td&gt;你需要使用一些特殊的 REST 路径以便与已经定义的 REST API 保持兼容。&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;你的资源可以自然地界定为集群作用域或集群中某个名字空间作用域。&lt;/td&gt;
          &lt;td&gt;集群作用域或名字空间作用域这种二分法很不合适；你需要对资源路径的细节进行控制。&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;你希望复用 &lt;a href=&#34;https://kubernetes.io/zh-cn/docs/concepts/extend-kubernetes/api-extension/custom-resources/#common-features&#34;&gt;Kubernetes API 支持特性&lt;/a&gt;&lt;br&gt;&lt;br&gt;。&lt;/td&gt;
          &lt;td&gt;你不需要这类特性。&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;简单解释就是CRD方式可以使用k8s已有api，当k8s已有api不满足条件时，才使用聚合层api来扩展。&lt;/p&gt;</description>
    </item>
    <item>
      <title>ollama自定义模型</title>
      <link>https://lidongqi.github.io/posts/ollama_new_model/</link>
      <pubDate>Tue, 12 Nov 2024 17:59:13 +0800</pubDate>
      <guid>https://lidongqi.github.io/posts/ollama_new_model/</guid>
      <description>&lt;p&gt;有时候需要调整一些模型参数，可以使用ollama模型的自定义功能
以 qwen2.5-coder:32b 为例，修改上下文长度
# 修改modelfile
## 获取modelfile&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;ollama show --modelfile qwen2.5-coder:32b &amp;gt; qwen2.5-coder-32b
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;修改配置&#34;&gt;修改配置&lt;/h2&gt;
&lt;p&gt;添加ctx长度，修改为32768，默认长度都是2048。&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;vi qwen2.5-coder-32b
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;文档末尾添加&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;PARAMETER num_ctx 32768
&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&#34;创建自定义model&#34;&gt;创建自定义model&lt;/h2&gt;
&lt;p&gt;使用ollama create创建新model即可&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;ollama create qwen2.5-coder-32b-ctx-max -f qwen2.5-coder-32b
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;完成以后ollama list即可看到新模型&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;qwen2.5-config % ollama list

NAME                                ID              SIZE      MODIFIED       

qwen2.5-coder-32b-ctx-max:latest    d4ab1461e7a9    19 GB     54 seconds ago    

bge-large:latest                    b3d71c928059    670 MB    7 days ago        

qwen2.5-coder:32b                   4bd6cbf2d094    19 GB     8 days ago        
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;再调用时qwen2.5-coder-32b-ctx-max 默认可以处理的上下文就是32k&lt;/p&gt;</description>
    </item>
    <item>
      <title>python防止反编译打包</title>
      <link>https://lidongqi.github.io/posts/python_package/</link>
      <pubDate>Sun, 10 Nov 2024 17:10:13 +0800</pubDate>
      <guid>https://lidongqi.github.io/posts/python_package/</guid>
      <description>&lt;h1 id=&#34;cython&#34;&gt;cython&lt;/h1&gt;
&lt;p&gt;&lt;a href=&#34;https://cython.org/&#34;&gt;cython&lt;/a&gt;是针对python和cython的的优化静态编译器。
主要作用是对python进行c扩展，其采用的方式是将python代码转换为c代码，然后将c代码编译为动态链接库（.so格式）。然后通过python或者c代码调用。
适用场景：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;结构简单的原生python代码编译为静态链接库&lt;/li&gt;
&lt;li&gt;使用cython编写代码
不适用场景：&lt;/li&gt;
&lt;li&gt;已经编写好的python工程
&amp;gt; 完成度比较高的工程实用cython编译会有功能不支持，打包失败等问题。如果如数解决这些问题，则需要修改/重构代码。&lt;/li&gt;
&lt;/ul&gt;
&lt;h1 id=&#34;pyinstaller&#34;&gt;pyinstaller&lt;/h1&gt;
&lt;p&gt;可以轻松被反编译，所以放弃该选择&lt;/p&gt;
&lt;h1 id=&#34;nuitka&#34;&gt;nuitka&lt;/h1&gt;
&lt;p&gt;实现原理和cython基本一致，循序流程：python代码-&amp;gt;c代码-&amp;gt;动态连接文件-&amp;gt;可执行程序。
安装&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;pip install nuitka
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;一些经验&#34;&gt;一些经验&lt;/h2&gt;
&lt;p&gt;对于桌面程序，打包一个文件&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;python -m nuitka main.py --standalone --onefile --follow-imports
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;对于后端应用，过程相对复杂了一些。主要有以下几个原因&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;standalone方式
&lt;ul&gt;
&lt;li&gt;后端程序依赖关系复杂，打包过程较慢&lt;/li&gt;
&lt;li&gt;有以下库需要包含metadata，需要指定&amp;ndash;include-distribution-metadata=packagename来包含metadata&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;非standalone
&lt;ul&gt;
&lt;li&gt;依赖关系复杂，有一些包需要手动添加。确定的方式基本上就是每次添加完成后验证当前二进制程序是否可以直接执行，否则继续查找问题，添加/删除依赖的package&lt;/li&gt;
&lt;li&gt;注意使用的python版本和nuitka版本匹配。有时需要调整python、nuitka、使用的三方库版本，最好让三者保持稳定。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;fastapi和asyncio是大部分问题的源头&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;过程简要记录&#34;&gt;过程简要记录&lt;/h2&gt;
&lt;p&gt;假设当前项目结构：&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;    - package1
    - package2
    - package3
    - main.py
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;则对应的命令为:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;python -m nuitka main.py --include-package&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;package1 &lt;span class=&#34;se&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;se&#34;&gt;&lt;/span&gt;    --include-package&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;package2 &lt;span class=&#34;se&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;se&#34;&gt;&lt;/span&gt;    --include-package&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;package3
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;打包完成后会有main.bin文件输出。但根据项目的复杂程度，可能一次成功，也可能运行失败。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;大部分问题都是fastapi和asyncio引起的。
比如运行时遇到如下问题：&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  File &lt;span class=&#34;s2&#34;&gt;&amp;#34;/opt/anaconda3/envs/packagetest/lib/python3.10/site-packages/httpx/_client.py&amp;#34;&lt;/span&gt;, line 1674, in send
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;nv&#34;&gt;response&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; await self._send_handling_auth&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  File &lt;span class=&#34;s2&#34;&gt;&amp;#34;/opt/anaconda3/envs/packagetest/lib/python3.10/site-packages/httpx/_client.py&amp;#34;&lt;/span&gt;, line 1702, in _send_handling_auth
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;nv&#34;&gt;response&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; await self._send_handling_redirects&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  File &lt;span class=&#34;s2&#34;&gt;&amp;#34;/opt/anaconda3/envs/packagetest/lib/python3.10/site-packages/httpx/_client.py&amp;#34;&lt;/span&gt;, line 1739, in _send_handling_redirects
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;nv&#34;&gt;response&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; await self._send_single_request&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;request&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  File &lt;span class=&#34;s2&#34;&gt;&amp;#34;/opt/anaconda3/envs/packagetest/lib/python3.10/site-packages/httpx/_client.py&amp;#34;&lt;/span&gt;, line 1776, in _send_single_request
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;nv&#34;&gt;response&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; await transport.handle_async_request&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;request&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  File &lt;span class=&#34;s2&#34;&gt;&amp;#34;/opt/anaconda3/envs/packagetest/lib/python3.10/site-packages/httpx/_transports/default.py&amp;#34;&lt;/span&gt;, line 377, in handle_async_request
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;nv&#34;&gt;resp&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; await self._pool.handle_async_request&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;req&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  File &lt;span class=&#34;s2&#34;&gt;&amp;#34;/opt/anaconda3/envs/packagetest/lib/python3.10/site-packages/httpcore/_async/connection_pool.py&amp;#34;&lt;/span&gt;, line 216, in handle_async_request
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    raise exc from None
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  File &lt;span class=&#34;s2&#34;&gt;&amp;#34;/opt/anaconda3/envs/packagetest/lib/python3.10/site-packages/httpcore/_async/connection_pool.py&amp;#34;&lt;/span&gt;, line 196, in handle_async_request
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;nv&#34;&gt;response&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; await connection.handle_async_request&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  File &lt;span class=&#34;s2&#34;&gt;&amp;#34;/opt/anaconda3/envs/packagetest/lib/python3.10/site-packages/httpcore/_async/connection.py&amp;#34;&lt;/span&gt;, line 99, in handle_async_request
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    raise exc
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  File &lt;span class=&#34;s2&#34;&gt;&amp;#34;/opt/anaconda3/envs/packagetest/lib/python3.10/site-packages/httpcore/_async/connection.py&amp;#34;&lt;/span&gt;, line 76, in handle_async_request
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;nv&#34;&gt;stream&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; await self._connect&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;request&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  File &lt;span class=&#34;s2&#34;&gt;&amp;#34;/opt/anaconda3/envs/packagetest/lib/python3.10/site-packages/httpcore/_async/connection.py&amp;#34;&lt;/span&gt;, line 122, in _connect
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;nv&#34;&gt;stream&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; await self._network_backend.connect_tcp&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;**kwargs&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  File &lt;span class=&#34;s2&#34;&gt;&amp;#34;/opt/anaconda3/envs/packagetest/lib/python3.10/site-packages/httpcore/_backends/auto.py&amp;#34;&lt;/span&gt;, line 30, in connect_tcp
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;return&lt;/span&gt; await self._backend.connect_tcp&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  File &lt;span class=&#34;s2&#34;&gt;&amp;#34;/opt/anaconda3/envs/packagetest/lib/python3.10/site-packages/httpcore/_backends/anyio.py&amp;#34;&lt;/span&gt;, line 116, in connect_tcp
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    with anyio.fail_after&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;timeout&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;从日志中可以看出，是调用anyio出了问题，说以这里将anyio添加到打包内容中：&lt;/p&gt;</description>
    </item>
    <item>
      <title>容器加密</title>
      <link>https://lidongqi.github.io/posts/%E5%AE%B9%E5%99%A8%E5%8A%A0%E5%AF%86/</link>
      <pubDate>Wed, 06 Nov 2024 15:11:16 +0800</pubDate>
      <guid>https://lidongqi.github.io/posts/%E5%AE%B9%E5%99%A8%E5%8A%A0%E5%AF%86/</guid>
      <description>&lt;h2 id=&#34;oci&#34;&gt;OCI&lt;/h2&gt;
&lt;p&gt;容器运行时标准，&lt;a href=&#34;https://github.com/opencontainers&#34;&gt;Open Container Initiative&lt;/a&gt;
containerd,cri-o,docker,rkt都是OCI的实现。
所以对镜像加密实际上是需要对OCI镜像进行处理。
# containerd
containerd 支持对image的加解密具体说明参考&lt;a href=&#34;https://github.com/containerd/containerd/blob/main/docs/cri/decryption.md&#34;&gt;containerd文档&lt;/a&gt;。
加密的镜像是包含加密blob(二进制对象)的OCI格式的镜像。
# 加密
## imgcrypt
### install
需要提前准备好golang环境&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;git clone https://github.com/containerd/imgcrypt.git
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nb&#34;&gt;cd&lt;/span&gt; imgcrypt
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;make
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo make install
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;encrypt&#34;&gt;encrypt&lt;/h3&gt;
&lt;p&gt;创建RSA key&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;openssl genrsa -out mykey.pem
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;openssl rsa -in mykey.pem -pubout -out mypubkey.pem
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;创建加密镜像&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# 这里使用已经安装好的containerd服务&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo chmod &lt;span class=&#34;m&#34;&gt;0666&lt;/span&gt; /run/containerd/containerd.sock
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nv&#34;&gt;CTR&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;/usr/local/bin/ctr-enc&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nv&#34;&gt;$CTR&lt;/span&gt; images pull --all-platforms docker.io/library/bash:latest
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;查看镜像层数&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nv&#34;&gt;$CTR&lt;/span&gt; images layerinfo --platform linux/amd64 docker.io/library/bash:latest
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;figure&gt;
&lt;img
src=&#34;../%E5%AE%B9%E5%99%A8%E5%8A%A0%E5%AF%86/dc6ba61292a2cf9ce405af7c985d08d628db30e4.png&#34;
title=&#34;wikilink&#34; alt=&#34;Pastedimage20241106181333.png&#34; /&gt;
&lt;figcaption
aria-hidden=&#34;true&#34;&gt;Pastedimage20241106181333.png&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;加密&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nv&#34;&gt;$CTR&lt;/span&gt; images encrypt --recipient jwe:mypubkey.pem --platform linux/amd64 docker.io/library/bash:latest bash.enc:latest
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;查看镜像层数&lt;/p&gt;</description>
    </item>
  </channel>
</rss>
