实现一个operator(1)

写在前面 kubebuilder 是一个集成工具,为了更好的理解k8s工作流程。这里使用k8s tools实现一个operator。 创建CRD Custom Resource 以Resource的角度来审视k8s,可以发现k8s实际上做的事情是对Resource的CRUD操作。 Custom Resource是一种用户定义的k8s resource数据,可以通过k8s api对定义的Resource进行CRUD操作。 对于resource本身而言,只是存储结构化的数据,如果期望资源数据改变时集群中状态发生对应变化,就需要有一个Controller来对数据变化感知,然后修改集群内的状态。 Custom Controller custom controller就是用户定义的controller。完成对customer resource内容变更的对应操作。 将Custom Resource 和Custom Controller结合起来,就是operator模式。 聚合API和独立API 官方文档很详细,引用一下 考虑 API 聚合的情况 优选独立 API 的情况 你的 API 是声明式的 。 你的 API 不符合声明式 模型。 你希望可以是使用 kubectl 来读写你的新资源类别。 不要求 kubectl 支持。 你希望在 Kubernetes UI (如仪表板)中和其他内置类别一起查看你的新资源类别。 不需要 Kubernetes UI 支持。 你在开发新的 API。 你已经有一个提供 API 服务的程序并且工作良好。 你有意愿取接受 Kubernetes 对 REST 资源路径所作的格式限制,例如 API 组和名字空间。(参阅 API 概述 ) 你需要使用一些特殊的 REST 路径以便与已经定义的 REST API 保持兼容。 你的资源可以自然地界定为集群作用域或集群中某个名字空间作用域。 集群作用域或名字空间作用域这种二分法很不合适;你需要对资源路径的细节进行控制。 你希望复用 Kubernetes API 支持特性 。 你不需要这类特性。 简单解释就是CRD方式可以使用k8s已有api,当k8s已有api不满足条件时,才使用聚合层api来扩展。 ...

十一月 13, 2024 · lidongqi

ollama自定义模型

有时候需要调整一些模型参数,可以使用ollama模型的自定义功能 以 qwen2.5-coder:32b 为例,修改上下文长度 # 修改modelfile ## 获取modelfile ollama show --modelfile qwen2.5-coder:32b > qwen2.5-coder-32b 修改配置 添加ctx长度,修改为32768,默认长度都是2048。 vi qwen2.5-coder-32b 文档末尾添加 PARAMETER num_ctx 32768 创建自定义model 使用ollama create创建新model即可 ollama create qwen2.5-coder-32b-ctx-max -f qwen2.5-coder-32b 完成以后ollama list即可看到新模型 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 再调用时qwen2.5-coder-32b-ctx-max 默认可以处理的上下文就是32k

十一月 12, 2024 · lidongqi

python防止反编译打包

cython cython是针对python和cython的的优化静态编译器。 主要作用是对python进行c扩展,其采用的方式是将python代码转换为c代码,然后将c代码编译为动态链接库(.so格式)。然后通过python或者c代码调用。 适用场景: 结构简单的原生python代码编译为静态链接库 使用cython编写代码 不适用场景: 已经编写好的python工程 > 完成度比较高的工程实用cython编译会有功能不支持,打包失败等问题。如果如数解决这些问题,则需要修改/重构代码。 pyinstaller 可以轻松被反编译,所以放弃该选择 nuitka 实现原理和cython基本一致,循序流程:python代码->c代码->动态连接文件->可执行程序。 安装 pip install nuitka 一些经验 对于桌面程序,打包一个文件 python -m nuitka main.py --standalone --onefile --follow-imports 对于后端应用,过程相对复杂了一些。主要有以下几个原因 standalone方式 后端程序依赖关系复杂,打包过程较慢 有以下库需要包含metadata,需要指定–include-distribution-metadata=packagename来包含metadata 非standalone 依赖关系复杂,有一些包需要手动添加。确定的方式基本上就是每次添加完成后验证当前二进制程序是否可以直接执行,否则继续查找问题,添加/删除依赖的package 注意使用的python版本和nuitka版本匹配。有时需要调整python、nuitka、使用的三方库版本,最好让三者保持稳定。 fastapi和asyncio是大部分问题的源头 过程简要记录 假设当前项目结构: - package1 - package2 - package3 - main.py 则对应的命令为: python -m nuitka main.py --include-package=package1 \ --include-package=package2 \ --include-package=package3 打包完成后会有main.bin文件输出。但根据项目的复杂程度,可能一次成功,也可能运行失败。 大部分问题都是fastapi和asyncio引起的。 比如运行时遇到如下问题: File "/opt/anaconda3/envs/packagetest/lib/python3.10/site-packages/httpx/_client.py", line 1674, in send response = await self._send_handling_auth( File "/opt/anaconda3/envs/packagetest/lib/python3.10/site-packages/httpx/_client.py", line 1702, in _send_handling_auth response = await self._send_handling_redirects( File "/opt/anaconda3/envs/packagetest/lib/python3.10/site-packages/httpx/_client.py", line 1739, in _send_handling_redirects response = await self._send_single_request(request) File "/opt/anaconda3/envs/packagetest/lib/python3.10/site-packages/httpx/_client.py", line 1776, in _send_single_request response = await transport.handle_async_request(request) File "/opt/anaconda3/envs/packagetest/lib/python3.10/site-packages/httpx/_transports/default.py", line 377, in handle_async_request resp = await self._pool.handle_async_request(req) File "/opt/anaconda3/envs/packagetest/lib/python3.10/site-packages/httpcore/_async/connection_pool.py", line 216, in handle_async_request raise exc from None File "/opt/anaconda3/envs/packagetest/lib/python3.10/site-packages/httpcore/_async/connection_pool.py", line 196, in handle_async_request response = await connection.handle_async_request( File "/opt/anaconda3/envs/packagetest/lib/python3.10/site-packages/httpcore/_async/connection.py", line 99, in handle_async_request raise exc File "/opt/anaconda3/envs/packagetest/lib/python3.10/site-packages/httpcore/_async/connection.py", line 76, in handle_async_request stream = await self._connect(request) File "/opt/anaconda3/envs/packagetest/lib/python3.10/site-packages/httpcore/_async/connection.py", line 122, in _connect stream = await self._network_backend.connect_tcp(**kwargs) File "/opt/anaconda3/envs/packagetest/lib/python3.10/site-packages/httpcore/_backends/auto.py", line 30, in connect_tcp return await self._backend.connect_tcp( File "/opt/anaconda3/envs/packagetest/lib/python3.10/site-packages/httpcore/_backends/anyio.py", line 116, in connect_tcp with anyio.fail_after(timeout): 从日志中可以看出,是调用anyio出了问题,说以这里将anyio添加到打包内容中: ...

十一月 10, 2024 · lidongqi

容器加密

OCI 容器运行时标准,Open Container Initiative containerd,cri-o,docker,rkt都是OCI的实现。 所以对镜像加密实际上是需要对OCI镜像进行处理。 # containerd containerd 支持对image的加解密具体说明参考containerd文档。 加密的镜像是包含加密blob(二进制对象)的OCI格式的镜像。 # 加密 ## imgcrypt ### install 需要提前准备好golang环境 git clone https://github.com/containerd/imgcrypt.git cd imgcrypt make sudo make install encrypt 创建RSA key openssl genrsa -out mykey.pem openssl rsa -in mykey.pem -pubout -out mypubkey.pem 创建加密镜像 # 这里使用已经安装好的containerd服务 sudo chmod 0666 /run/containerd/containerd.sock CTR="/usr/local/bin/ctr-enc" $CTR images pull --all-platforms docker.io/library/bash:latest 查看镜像层数 $CTR images layerinfo --platform linux/amd64 docker.io/library/bash:latest Pastedimage20241106181333.png 加密 $CTR images encrypt --recipient jwe:mypubkey.pem --platform linux/amd64 docker.io/library/bash:latest bash.enc:latest 查看镜像层数 ...

十一月 6, 2024 · lidongqi