作者归档:songtianlun

【转】k8s 认知路线

From V

以下内容转载自 https://www.v2ex.com/t/968514#r_13557021

k8s 这个东西真的内容太多了,没有啥系统性的资料,里面各种知识点真的没法说,太多了,最好的就是看官方文档,并且结合工作当中的实践慢慢积累,才能由浅入深,只是看文档想掌握深点,个人感觉很困难。

如果你不是专做这行,只是把它当作你应用部署的底层平台的话可以给你个简单的流程做参考:
1 、云服务商买一套,或者自己搭建个 k8s 环境
2 、运行起来一套简单的前后端分离服务,这里主要练习的是多个镜像启动多个不同的 workload ,然后怎么能互相访问对接,这个环节能掌握清楚 workload service ingress 都是干嘛的,该怎么用,怎么关联
3 、你会发现当你测试环境发生重启,或者 pod 重建后,数据库数据都没了,这会你就应该研究数据持久化了,pv pvc 的概念就出来了
5 、然后你又创建了个前端服务,想修改个前端页面的配置文件参数,比如网页的 title ,其他都一模一样,但是每个服务一个镜像,太麻烦了,容器里直接修改,重建就没了,配置文件放 pv pvc ,太小题大做,这会 configmap 出现了。连接数据库的配置文件,密钥明文,太 low 了,secret 出现了
6 、前端页面镜像有 bug ,必须要重打镜像了,cicd 出现了,你是选择 docker build 还是 jenkins ,新的知识又增加了
7 、更新 workload 的镜像,问题又来了,服务会不会受损,多副本就不会受损吗?如何优雅终止,健康检查,无损更新?
8 、服务高峰期怎么应对,手动扩副本数太傻,hpa 来了

如果你想深点,做些 k8s 运维或者技术支持的,那么除了上面的必须熟悉,下面的东西必知必会
1 、清楚 k8s 的工作逻辑,master 的三大件是干嘛的,kubelet ,kube-proxy ,coredns 都是干嘛的,比如执行个创建或查询一个 workload ,系统组件之间怎么通讯的,创建一个 pod 后,容器网络和外界是怎么打通的,k8s 资源调度和分配逻辑是什么
2 、自己搭建一套 k8s 集群,多 master 的最好,master 和 worker 节点分开(一定是自己搭建,不要购买云服务商现成的容器服务,自己搭建过程你会收获不少东西)
3 、熟练使用 kubectl 命令进行各种查询分析
4 、清楚 rbac 的功能和使用

剩下的太多太多了,说不完了,
等你发现 k8s 了解差不多了,发现总得有个监控吧,prometheus 出现了
流量治理,服务分析也得有吧,istio 来了
日志得持久化保存下吧,els 来了
学了那么多了,得给老板展示下漂亮帅气的监控吧,得研究 grafana 了。
服务都上 k8s 了,集群越来越重要,万一哪天 etcd 崩了怎么办,备份总得有吧,etcd 原理和备份恢复得研究下吧。
想自建镜像仓库了? harbor 研究下。
这个云平台太贵了,业务想换个云平台,集群要迁移,velero 走起
想给 pod 限速了,想给集群加审计了。。。。

References

OpenFOAM 两大分支的详细比较

OpenFOAM 的两个主要分支源自同一项目,但在 2011 年后走上了不同的发展道路。下面详细比较这两个版本的历史、版本发布情况、技术差异和适用场景。

历史背景

分叉原因

  • OpenFOAM 最初由 Henry Weller 和他的团队在 20 世纪 90 年代开发
  • 2004 年成立了 OpenCFD Ltd 公司商业化 OpenFOAM
  • 2011 年,SGI (Silicon Graphics International) 收购了 OpenCFD Ltd
  • 2012 年,ESI Group 从 SGI 购买了 OpenCFD Ltd
  • 这一系列收购后,原开发团队的一部分成立了 OpenFOAM Foundation,分叉了代码库

版本发布历史

OpenFOAM Foundation 版本

  • 命名规则:使用版本号(如 v2106, v2212)
  • 发布频率:通常每年 1-2 次大版本
  • 版本轨迹
    • v2.0.0(2011 年,首个独立版本)
    • v2.3.0(2014 年)
    • v4.0(2016 年)
    • v7(2019 年)
    • v9(2021 年)
    • v10(2022 年)
    • v11(2023 年)

OpenFOAM+ (plus) 版本

  • 命名规则:使用年份+月份(如 v1906, v2206)
  • 发布频率:每年 2 次,通常在 6 月和 12 月
  • 版本轨迹
    • v3.0+(2015 年)
    • v1606+(2016 年)
    • v1806+(2018 年)
    • v2006(2020 年)
    • v2206(2022 年)
    • v2312(2023 年)

技术差异

1. 代码结构与架构

Foundation 版本:

  • 更倾向于学术风格的代码组织
  • 更保守的代码重构,保持架构稳定性
  • 强调基础功能和核心求解器的可靠性

OpenFOAM+:

  • 更多工业应用导向的架构调整
  • 积极重构代码以提高性能
  • 增加了更多用户友好的界面和工具

2. 功能差异

功能领域 Foundation 版本 OpenFOAM+
网格生成 基础 snappyHexMesh 增强版 snappyHexMesh 和额外的网格工具
并行化 基础 MPI 支持 更好的负载平衡和分区技术
湍流模型 全面但更侧重基础模型 更多工业验证的高级模型
动态网格 基础功能 增强的动态网格功能和FSI(流固耦合)能力
多相流 VOF 等基本方法 增强的多相流模型和界面捕捉方法
预处理 基础工具 扩展的预处理工具和导入选项
后处理 基础 ParaView 集成 增强的可视化和数据分析工具
GPU 支持 有限 一些商业版本中有更好的支持

3. 具体技术特点差异

Foundation 版本独有或更强的特点:

  • 更纯粹的开源哲学
  • 更严格的代码审查流程
  • 更面向基础研究的算法实现

OpenFOAM+ 独有或更强的特点:

  • 扩展的几何处理功能
  • 商业CAD系统接口
  • 更广泛的物理建模能力
  • “Catalyst” 实时可视化
  • 针对云计算的一些优化

开发社区与发行形式

OpenFOAM Foundation 版本

  • 维护方式:由 OpenFOAM Foundation 维护,是一个非营利组织
  • 社区特点:更多学术和研究人员参与
  • 许可证:GPL v3
  • 发行形式:完全开源
  • 文档:开源文档,社区支持

OpenFOAM+

  • 维护方式:由 ESI Group 拥有的 OpenCFD Ltd 维护
  • 社区特点:更多工业用户和开发者
  • 许可证:GPL v3(核心代码),某些工具可能有不同许可
  • 发行形式:开源核心,加上一些专有扩展
  • 文档:更全面的官方文档,一些商业培训和支持

适用场景对比

OpenFOAM Foundation 版本适合

  • 学术研究和基础科学应用
  • 需要彻底理解和可能修改核心算法的用户
  • 教育环境和学习 CFD 的学生
  • 预算有限的小型组织和个人用户

OpenFOAM+ 更适合

  • 工业应用和生产环境
  • 需要现成解决方案的工程师
  • 有商业支持需求的用户
  • 处理复杂几何和多物理场问题

安装和使用差异

OpenFOAM Foundation 版本

  • Linux 为主要平台
  • 通过源代码构建或官方打包的二进制包安装
  • 较少的依赖项,更简单的安装流程
  • 更灵活的构建选项

OpenFOAM+

  • 更广泛的平台支持(Linux, Windows, macOS)
  • 提供更多预编译二进制包
  • Docker 镜像和虚拟机模板
  • 一些接口需要额外许可的商业软件

互操作性

两个版本之间的案例通常可以互相运行,但可能需要一些调整:

  • 某些字典文件的语法可能略有不同
  • 有些高级功能在另一个版本中可能不可用
  • 编译的自定义代码可能需要修改才能在另一版本上运行

总结建议

选择 OpenFOAM Foundation 版本的理由:

  • 追求纯粹开源体验
  • 主要用于学术研究
  • 希望更深入理解 CFD 原理和实现
  • 有能力自己扩展功能

选择 OpenFOAM+ 的理由:

  • 需要更多工业优化的功能
  • 重视用户友好性和易用工具
  • 需要商业级支持选项
  • 处理复杂工程应用

两个版本都在继续积极开发,并且相互借鉴一些想法。很多用户根据具体项目需求在两个版本间切换,或者同时安装两个版本以获取各自的优势。

第一个 CUDA 程序之矩阵运算计算效能对比

这是一个使用 CUDA 进行编程的实际例子,对比 CPU 和 GPU 在执行矩阵乘法时的性能差异。

运行效果

(base) root@gpu-1095cf160ec353b4e35a9-1-zqa76jnvthlx:~/data/CUDA/first# ./gpu_matrix_mult
GPU 执行时间: 0.000475046 秒
(base) root@gpu-1095cf160ec353b4e35a9-1-zqa76jnvthlx:~/data/CUDA/first# ./cpu_matrix_mult 
CPU 执行时间: 14.3784 秒

程序实例

示例:矩阵乘法

矩阵乘法是一个非常适合用 GPU 加速的计算密集型任务。我们将实现一个简单的矩阵乘法,分别在 CPU 和 GPU 上运行,并比较它们的执行时间。

1. CPU 实现 (C++)

#include 
<iostream>
#include 
<vector>
#include 
<chrono>

// CPU 矩阵乘法
std::vector
<float> cpuMatrixMult(const std::vector<float>& a, const std::vector<float>& b, int n) {
    std::vector
<float> c(n * n, 0.0f);
    for (int i = 0; i < n; ++i) {
        for (int j = 0; j < n; ++j) {
            for (int k = 0; k < n; ++k) {
                c[i * n + j] += a[i * n + k] * b[k * n + j];
            }
        }
    }
    return c;
}

int main() {
    int n = 1024; // 矩阵大小
    std::vector
<float> a(n * n, 1.0f);
    std::vector
<float> b(n * n, 1.0f);

    // 计时开始
    auto start = std::chrono::high_resolution_clock::now();
    std::vector
<float> c = cpuMatrixMult(a, b, n);
    auto end = std::chrono::high_resolution_clock::now();
    std::chrono::duration
<double> duration = end - start;

    std::cout << "CPU 执行时间: " << duration.count() << " 秒" << std::endl;

    return 0;
}

编译和运行 CPU 代码:

g++ cpu_matrix_mult.cpp -o cpu_matrix_mult
./cpu_matrix_mult

2. GPU 实现 (CUDA)

#include 
<iostream>
#include 
<vector>
#include 
<chrono>
#include <cuda_runtime.h>

// CUDA 核函数
__global__ void gpuMatrixMultKernel(const float* a, const float* b, float* c, int n) {
    int row = blockIdx.y * blockDim.y + threadIdx.y;
    int col = blockIdx.x * blockDim.x + threadIdx.x;

    if (row < n && col < n) {
        float sum = 0.0f;
        for (int k = 0; k < n; ++k) {
            sum += a[row * n + k] * b[k * n + col];
        }
        c[row * n + col] = sum;
    }
}

// GPU 矩阵乘法
std::vector
<float> gpuMatrixMult(const std::vector<float>& a, const std::vector<float>& b, int n) {
    std::vector
<float> c(n * n, 0.0f);
    float *dev_a, *dev_b, *dev_c;

    // 分配 GPU 内存
    cudaMalloc((void**)&dev_a, n * n * sizeof(float));
    cudaMalloc((void**)&dev_b, n * n * sizeof(float));
    cudaMalloc((void**)&dev_c, n * n * sizeof(float));

    // 将数据从 CPU 复制到 GPU
    cudaMemcpy(dev_a, a.data(), n * n * sizeof(float), cudaMemcpyHostToDevice);
    cudaMemcpy(dev_b, b.data(), n * n * sizeof(float), cudaMemcpyHostToDevice);

    // 定义线程块和网格大小
    int blockSize = 32;
    dim3 blockDim(blockSize, blockSize);
    dim3 gridDim((n + blockSize - 1) / blockSize, (n + blockSize - 1) / blockSize);

    // 计时开始
    auto start = std::chrono::high_resolution_clock::now();

    // 调用 CUDA 核函数
    gpuMatrixMultKernel<<<gridDim, blockDim>>>(dev_a, dev_b, dev_c, n);

    // 等待 GPU 完成
    cudaDeviceSynchronize();

    auto end = std::chrono::high_resolution_clock::now();
    std::chrono::duration
<double> duration = end - start;

    // 将结果从 GPU 复制回 CPU
    cudaMemcpy(c.data(), dev_c, n * n * sizeof(float), cudaMemcpyDeviceToHost);

    // 释放 GPU 内存
    cudaFree(dev_a);
    cudaFree(dev_b);
    cudaFree(dev_c);

    std::cout << "GPU 执行时间: " << duration.count() << " 秒" << std::endl;

    return c;
}

int main() {
    int n = 1024; // 矩阵大小
    std::vector
<float> a(n * n, 1.0f);
    std::vector
<float> b(n * n, 1.0f);

    gpuMatrixMult(a, b, n);

    return 0;
}

编译和运行 CUDA 代码:

  1. 安装 CUDA Toolkit: 确保你已经安装了 CUDA Toolkit,并且设置了正确的环境变量。
  2. 编译:
    nvcc gpu_matrix_mult.cu -o gpu_matrix_mult
  3. 运行:
    ./gpu_matrix_mult

    3. 性能对比分析

通常情况下,你会发现 GPU 的执行时间远小于 CPU 的执行时间,尤其是在矩阵大小 n 较大时。这是因为 GPU 具有大量的并行处理单元,可以同时处理矩阵中的多个元素。

影响性能的因素:

  • 矩阵大小: 矩阵越大,GPU 的优势越明显。
  • GPU 架构: 不同的 GPU 架构具有不同的性能。
  • 线程块大小: 合适的线程块大小可以提高 GPU 的利用率。
  • 内存传输: CPU 和 GPU 之间的数据传输会影响整体性能。

总结

这个例子展示了如何使用 CUDA 加速矩阵乘法。通过将计算任务转移到 GPU 上,可以显著提高程序的性能。请注意,实际的加速效果取决于你的硬件和具体的实现方式。 5

希望这个例子能帮助你入门 CUDA 编程!

Archlinux KDE Apache JMeter 配置高分屏缩放

ArchLinux 下安装 jmeter 很简单:

yay -S jmeter

但是在现代高分辨率显示器下 GUI 的字体和图标都很小 :

JMeter 缩放前

TL;DR

查阅文档后发现只需带有一个参数运行即可:

JVM_ARGS="-Dsun.java2d.uiScale=200%" jmeter

也可以把这个参数写入启动脚本中:

➜  which jmeter    
/usr/bin/jmeter  
➜  sudo vi /usr/bin/jmeter
#! /bin/sh
...
JVM_ARGS="-Dsun.java2d.uiScale=200%"
...

再启动就可以了:

JMeter 缩放后

KDE 下效果还不错。

其他平台处理方法类似,注入变量启动即可。

References

解决 gitlab-runner 移除残留文件 permission denied

最近使用遇到一些问题:

Running with gitlab-runner 17.10.0 (67b2b2db)
  on wz-arm64-host-runner8 Q3NRHTCy, system ID: s_a7d2f872e9b4
Preparing the "shell" executor 00:00
Using Shell (bash) executor...
Preparing environment 00:00
Running on xxx-runner8...
Getting source from Git repository 00:01
Fetching changes with git depth set to 50...
重新初始化已存在的 Git 仓库于 /home/gitlab-runner/builds/Q3NRHTCy/0/cloud/xxx-top/.git/
Checking out 2356a4c2 as detached HEAD (ref is release/2.6)...
warning: 删除 xxx/xxx/xxx/xxx/xxx-1.0/Makefile 失败: 权限不够
Cleaning up project directory and file based variables 00:00
ERROR: Job failed: exit status 1

最后发现是某一级路径的所有者被改变为 root 导致无法删除,造成该现象的原因未知。通过查阅资料和文档,在 gitlab-runner 的配置文件增加一行 pre_get_sources_script 解决:

[root@wz-kylin-v10-gfb-runner8 ~]# cat /etc/gitlab-runner/config.toml 
...

[session_server]
  session_timeout = 1800

[[runners]]
  ...
  pre_get_sources_script = "sudo chown -R gitlab-runner:gitlab-runner ."
  ...

References

nginx-ingress 配置路由 302

demo ingress

这个实例中,实现将 访问 https://image.frytea.com/Avatar.jpg 请求302到 https://image.frytea.com/i/Avatar.jpg

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: app
  namespace: imagehost
  annotations:
    cert-manager.io/cluster-issuer: "dnspod-cluster-issuer"
    nginx.ingress.kubernetes.io/configuration-snippet: |
      location = /Avatar.jpg {
        return 301 https://image.frytea.com/i/Avatar.jpg$is_args$args;
      }
spec:
  ingressClassName: nginx
  tls:
  - hosts:
      - image.frytea.com
      - imagehost-cdn.frytea.com
      - cdn-imagehost.frytea.com
    secretName: image-frytea-com-tls
  rules:
  - host: image.frytea.com
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: app
            port:
              name: web

直接配置会提示报错:

➜  imagehost git:(main) ✗ kubectl apply -f ingress.yaml  
Error from server (BadRequest): error when applying patch:  
{"metadata":{"annotations":{"kubectl.kubernetes.io/last-applied-configuration":"{\"apiVersion\":\"networking.k8s.io/v1\",\"kind\":\"Ingress\",\"metadata\":{\"annotati  
ons\":{\"cert-manager.io/cluster-issuer\":\"dnspod-cluster-issuer\",\"nginx.ingress.kubernetes.io/configuration-snippet\":\"location = /Avatar.jpg {\\n  return 301 ht  
tps://image.frytea.com/i/Avatar.jpg$is_args$args;\\n}\\n\"},\"name\":\"app\",\"namespace\":\"imagehost\"},\"spec\":{\"ingressClassName\":\"nginx\",\"rules\":[{\"host\  
":\"image.frytea.com\",\"http\":{\"paths\":[{\"backend\":{\"service\":{\"name\":\"app\",\"port\":{\"name\":\"web\"}}},\"path\":\"/\",\"pathType\":\"Prefix\"}]}},{\"ho  
st\":\"imagehost-cdn.frytea.com\",\"http\":{\"paths\":[{\"backend\":{\"service\":{\"name\":\"app\",\"port\":{\"name\":\"web\"}}},\"path\":\"/\",\"pathType\":\"Prefix\  
"}]}},{\"host\":\"cdn-imagehost.frytea.com\",\"http\":{\"paths\":[{\"backend\":{\"service\":{\"name\":\"app\",\"port\":{\"name\":\"web\"}}},\"path\":\"/\",\"pathType\  
":\"Prefix\"}]}}],\"tls\":[{\"hosts\":[\"image.frytea.com\",\"imagehost-cdn.frytea.com\",\"cdn-imagehost.frytea.com\"],\"secretName\":\"image-frytea-com-tls\"}]}}\n",  
"nginx.ingress.kubernetes.io/configuration-snippet":"location = /Avatar.jpg {\n  return 301 https://image.frytea.com/i/Avatar.jpg$is_args$args;\n}\n","nginx.ingress.k  
ubernetes.io/rewrite-rule":null}}}  
to:  
Resource: "networking.k8s.io/v1, Resource=ingresses", GroupVersionKind: "networking.k8s.io/v1, Kind=Ingress"  
Name: "app", Namespace: "imagehost"  
for: "ingress.yaml": error when patching "ingress.yaml": admission webhook "validate.nginx.ingress.kubernetes.io" denied the request: annotation group ConfigurationSn  
ippet contains risky annotation based on ingress configuration

这个错误来自于 Nginx Ingress Controller 自带的一个叫做 “Admission Webhook” 的安全校验机制。它的作用是在你创建或更新 Ingress 资源时进行检查,防止应用不安全或可能导致问题的配置。 很多 Nginx Ingress Controller 的默认安装配置或者管理员策略禁用限制 configuration-snippetserver-snippet 这类强大的注解

开启 Snippet 注释

使用 helm 部署的 nginx-ingress ,首先修改 Values.yaml 中的内容,启动

controller:
  allowSnippetAnnotations: true

将配置应用到集群:

helm upgrade --install ingress-nginx ingress-nginx  \
    --repo https://kubernetes.github.io/ingress-nginx  \
    --namespace ingress-nginx --create-namespace -f vaules.yaml

之后调整 ConfigMap

kubectl -n ingress-nginx edit cm ingress-nginx-controller

增加两行:

...
apiVersion: v1
data:
  allow-snippet-annotations: "true"
  annotations-risk-level: Critical
  use-forwarded-headers: "true"
kind: ConfigMap
...

其中 :

  • annotations-risk-level: Critical: 设置 Webhook 接受的最高风险门槛,确保 Snippets(作为 Critical 风险注解)在被评估时不会因为风险等级过高而被直接拒绝,从而让 allow-snippet-annotations 的设置能够生效
  • use-forwarded-headers: "true": 告诉 Nginx Ingress Controller 信任并使用由其上游代理(通常是你的云服务商提供的负载均衡器,如 AWS ELB/ALB/NLB, GCP Load Balancer, Azure Load Balancer 等)设置的 X-Forwarded-*Forwarded HTTP 头部信息,来确定原始客户端的真实信息

再重启所有 nginx controller

kubectl rollout restart -n ingress-nginx daemonset ingress-nginx-controller

之后在尝试 apply 上面的 demo 就可以成功了。

References

常见 S3 存储服务多维度横评(附1TB存储传输成本)

之前看到猫猫大佬的 对象存储服务商价格对比:1TB存储与1TB流量基准分析 这篇文章很有启发。正好最近在探索物美价廉、稳定可靠的 S3 数据存储方案,将自己熟悉的、网上常见的一些提供 S3 的厂商服务做个整理,按照 1TB 数据存储和传输成本为指标做一个横评表格。希望给选购 S3 服务需求的人们有一些启发。

本文默认忽略了几大云厂商,如 AWS/Azure/GCP/Aliyun/Tencent,一方面几大巨头的成本较高,常人难以承受,故暂时排除。国内几大云厂商的 S3 计费规则相对复杂,出站流量普遍偏高,故暂时排除。

除了使用现成的 S3 服务,找一些稳定的 NVMe VPS 自建 Minio 也是不错的选择,可以做到超低价,但风险相对较高,大家自行探索,不在本文探讨范围内。

下面首先分标题整理各大厂商的存储和传输成本计费规则,最后整理一份汇总表格供大家参考。

各大厂商价格政策

Cloudflare R2

价格:

Standard storage Infrequent Access storage Free
Storage  存储 $0.015 / GB-month $0.01 / GB-month 10 GB-month / month
Class A Operations $4.50 / million requests $9.00 / million requests 1 million requests / month
Class B Operations $0.36 / million requests $0.90 / million requests 10 million requests / month
Data Retrieval (processing) None $0.01 / GB
Egress (data transfer to Internet) Free 1 Free 1 Free 1

区域:

Hint Hint description
wnam Western North America
enam Eastern North America
weur Western Europe
eeur Eastern Europe
apac Asia-Pacific
oc Oceania

References: https://developers.cloudflare.com/r2/pricing/ https://developers.cloudflare.com/r2/reference/data-location/

Cloudflare R2 不愧赛博大善人,提供 10GB 的免费存储空间,出站流量免费。区域主要有美国、欧洲和亚洲。

Backblaze B2

计费方式有两种:

  • 按量计费云存储(Pay-As-You-Go Cloud Storage):$6/TB/month 起。
  • B2 保留容量捆绑包(B2 Reserve Capacity Bundles):$1,560/20TB/year 起。 流量费用: 每月提供 3 倍的平均每月存储数据量免费传输,额外流出数据按每 GB 0.01 美元。

区域方面:

Backblaze currently has data centers in Sacramento, California; Stockton, California; Phoenix, Arizona; Reston, Virginia; Amsterdam, Netherlands; and Toronto, Ontario.

创建账号时就需要选择存储区域,可选 US East region, the US West region, the EU Central region, or the Canada East region

References: https://www.backblaze.com/cloud-storage/pricing https://www.backblaze.com/docs/cloud-storage-data-regions

根据官网价格工具计算,每存储 1TB 数据,每年需耗费 72 usd(6usd/m),提供 3TB 免费数据传输。若存储 2TB 数据,每年需耗费 144 usd,以此类推。

Wasabi

计费方式同样有两种:

  • 按量计费(Pay-As-You-Go):$6.99/TB/month 起。
  • 预留容量存储(Reserved Capacity Storage):针对超大规模存储,暂时忽略。
North America EMEA APAC
Wasabi Object Storage $6.99 TB/mo
($.0068 GB/mo)
Ingress Data Transfer = Free
Egress Data Transfer = Free

API Requests = Free*
$6.99 TB/mo
($.0068 GB/mo)
Ingress Data Transfer = Free
Egress Data Transfer = Free

API Requests = Free*
$6.99 TB/mo
($.0068 GB/mo)
Ingress Data Transfer = Free
Egress Data Transfer = Free

API Requests = Free*
Wasabi Cloud NAS $8.99 TB/mo
($.0088 GB/mo)
Ingress Data Transfer = Free
Egress Data Transfer = Free

API Requests = Free*
$8.99 TB/mo
($.0088 GB/mo)
Ingress Data Transfer = Free
Egress Data Transfer = Free

API Requests = Free*
$8.99 TB/mo
($.0088 GB/mo)
Ingress Data Transfer = Free
Egress Data Transfer = Free

API Requests = Free*

可知 Wasbi 在 North America, EMEA, APAC 几个区域提供服务,上下行流量免费,存储费用按量计费。即存储 1TB 数据每月需耗费 6.99USD,但是按照官网计算器,每年的费用是 83 USD。

根据官网可知, Wasbi 为用户免费提供为期 30天的 1 TB 存储空间,无需绑定信用卡。

References: https://wasabi.com/pricing https://wasabi.com/pricing/faq https://docs.wasabi.com/v1/docs/signing-up-for-wasabi

DigitalOcean Spaces

简单且可扩展的与 S3 兼容的对象存储,内置内容分发网络(CDN),用于存储、分发、备份和归档任意数量的网页内容、图片、媒体和静态文件,以支持您的 web 应用。

DigitalOcean 提供的 Spaces S3 服务,计费从 $5 每月开始,包含 250 GiB 存储,1 TiB 出站流量,额外的空间按照 $0.02/GiB 收取,额外的出站则按照 $0.01/GiB 收取。

因此,以 1TiB 的存储容量为例,每个月用户需要额外购买(1024 GiB – 250 GiB)= 774 GiB 的存储空间。这部分额外存储的费用为 774 GiB * $0.02/GiB = $15.48 每月 ,存储 1TiB 数据的总开销为 $5.00 + $15.48 = $20.48 每月。

在区域方面,根据官网信息,可提供 NYC3 AMS3 SFO2 SFO3 SGP1 LON1 FRA1 TOR1 BLR1 SYD1 这些区域的 Space S3 存储服务。

References: https://www.digitalocean.com/pricing/spaces-object-storage https://docs.digitalocean.com/products/spaces/details/availability/

Hetzner

直接提供 $5.99/monthly 的基础价格,包含 1TB 的数据存储和 1TB 的数据传输,额外的数据传输按照 $ 1.20 /TB 收取。额外的数据存储方面,似乎都是整数倍的递增。如存储 2TB 的数据则需收取 $11.98/monthly

区域方面,在 Falkenstein, DE (FSN1), Helsinki, FI (HEL1), and Nuremberg, DE (NBG1) 这些区域可用。

References: https://www.hetzner.com/storage/object-storage/

Scaleway Object Storage

Type of consumption Price Approx. per month
Multi-AZ Standard Object Storage €0.00002/GB /hour ~€0.0146/GB/month
One Zone – IA Object Storage €0,0000165/GB/hour ~€0.012/GB/month
Requests Included
Ingress Included
Bucket websites feature Free
Egress fees* – inter regional or to Internet 75 GB free every month,
then €0.01/GB
Archiving objects: Object Storage (Standard) → Cold Storage (Glacier) Free

根据官方的这份计费表格,可以看出,Scaleway 采用弹性计费,提供多区域和单区域两种。分别计算存储并出站 1TB 数据的费用为:

Type 1 TB 存储费用 1TB 传输费用
多区域 1000 * 0.0146 = €14.6/TB/M (1000-75) * 0.01 = €9.25/TB/M
单区域 1000 * 0.012 = €12/TB/M

注:GB 默认按照 1000 进制,GiB 默认按照 1024 进制,若无明确标出则默认按 GB 计算。

区域方面,支持这些:

  • Amsterdam, The Netherlands:
    • Region: nl-ams
  • Paris, France:
    • Region: fr-par
  • Warsaw, Poland:
    • Region: pl-waw

References: https://www.scaleway.com/en/pricing/storage/ https://www.scaleway.com/en/docs/object-storage/quickstart/

Vultr

提供四种对象存储规格:Standard、Premium、Performance 和 Accelerated,存储价格各不相同。整理表格如下:

Standard Premium Performance Accelerated
1TB Prices $18.00/month $36.00/month $50.00/month $100.00/month
additional $0.018/GB $0.036/GB $0.05/GB $0.1/GB

传输费用方面,套餐默认带有 1TB,额外的费用为 $10 per additional TB transferred

区域方面,登录后台查看,可以选择这些区域:US New York, US Chicago, US Los Angeles, NL Amsterdam, AU Sydney,GB London,SG Singapore, JP Tokyo, IN Bangalore

References: https://www.vultr.com/pricing/#object-storage

Linode Object Storage

Storage $/Mo Outbound Transfer Objects / Cluster*
250 GB $5 1 TB 1 Billion
500 GB $10 1 TB 1 Billion
1 TB $20 1 TB 1 Billion
5 TB $100 1 TB 1 Billion
10 TB $200 1 TB 1 Billion
50 TB $1,000 1 TB 1 Billion
100 TB $2,000 1 TB 1 Billion
500 TB $10,000 1 TB 1 Billion
1 PB $20,000 1 TB 1 Billion

$0.02 / GB Additional Storage,  $0.005 / GB Additional Outbound Transferred

官网提供了以上这份表格,可以看出存储并传输 1Tb 数据对应套餐为 $20/M.

区域方面,登录后在开通界面可以看到,North America, Europe Asia, South America, Oceania 这些区域均提供。

References: https://www.linode.com/products/object-storage/ https://www.linode.com/pricing/#object-storage

OVH Object Storage

OVH 在 12 个 US 区域提供 S3 存储,价格区别主要在 Local Zone 还是其他区域,两种类型分别以一个机房为例摘取官网价格:

United States (Vint Hill)

Name Price
Data storage $0.00001111 /GB/hour
Incoming internal traffic Included
Incoming public traffic Included
Outgoing internal traffic Included
Outgoing public traffic $0.011 /GB

Outgoing public traffic is offered free until February 28, 2025, in all our Local Zones.

United States (Los Angeles) Local Zone

Name Price
Data storage $0.00003042 /GB/hour
Outgoing public traffic $0.0122 /GB

Outgoing public traffic is offered free until February 28, 2025, in all our Local Zones.
出站公共流量在所有本地区域将免费提供至 2025 年 2 月 28 日。

针对单区域和多区域存储和传输 1TB 数据价格整理如下(仅供参考):

类型 1TB 存储价格 1TB 传输价格
Other Zone 0.00001111 * 1000 * 24 * 31 = $8.27/TB/M 0.011 * 1000 = $11.0/TB
Local Zone 0.00003042 * 1000 * 24 * 31 = $22.63/TB/M 0.0122 * 1000 = $12.2/TB

References: https://us.ovhcloud.com/public-cloud/object-storage/ https://us.ovhcloud.com/public-cloud/prices/

汇总表格

厂商 免费额度 区域 存储费用政策 流量费用政策 1TB 存储成本 1TB 流量成本 1TB 合计费用
Cloudflare R2 10GB 存储/月
100万 Class A 操作/月
1000万 Class B 操作/月
北美东西部
欧洲东西部
亚太
大洋洲
Standard: $0.015/GB/月
IA: $0.01/GB/月
出站流量免费 约 $15/月 $0 约 $15/月
Backblaze B2 美国东西部
欧洲中部
加拿大东部
$6/TB/月
($0.006/GB/月)
提供3倍存储量的免费流量
超出部分 $0.01/GB
$6/月 $0
(3TB免费额度足够)
$6/月
($72/年)
Wasabi 30天1TB试用
(不需信用卡)
北美
欧洲中东非洲
亚太
$6.99/TB/月
($0.0068/GB/月)
入站和出站免费 $6.99/月 $0 $6.99/月
($83/年)
DigitalOcean Spaces 250GB存储
1TB出站流量
(基础套餐内)
美国(NYC3,SFO2,SFO3)
欧洲(AMS3,LON1,FRA1)
亚太(SGP1,BLR1,SYD1)
加拿大(TOR1)
基础套餐$5/月
额外存储$0.02/GB
基础套餐包含1TB流量
额外流量$0.01/GB
$20.48/月 已包含在基础套餐中 $20.48/月
Hetzner 德国(Falkenstein,Nuremberg)
芬兰(Helsinki)
$5.99/TB/月 包含1TB流量
额外流量$1.20/TB
$5.99/月 已包含在基本套餐中 $5.99/月
Scaleway 75GB出站流量/月 荷兰(Amsterdam)
法国(Paris)
波兰(Warsaw)
多区域:€0.0146/GB/月
单区域:€0.012/GB/月
75GB/月免费
额外€0.01/GB
多区域:€14.6/月
单区域:€12/月
€9.25/月
(除了免费的75GB)
多区域:约€23.85/月
单区域:约€21.25/月
Vultr 美国(纽约,芝加哥,洛杉矶)
荷兰(阿姆斯特丹)
澳大利亚(悉尼)
英国(伦敦)
新加坡
日本(东京)
印度(班加罗尔)
Standard:$18/TB/月
Premium:$36/TB/月
Performance:$50/TB/月
Accelerated:$100/TB/月
包含1TB流量
额外$10/TB
Standard:$18/月 已包含在基本套餐中 Standard:$18/月
Linode Object Storage 北美
欧洲
亚洲
南美
大洋洲
$20/TB/月
额外存储$0.02/GB
包含1TB流量
额外流量$0.005/GB
$20/月 已包含在基本套餐中 $20/月
OVH Object Storage
(2025年2月28日前出站公共流量免费)
美国(多区域) 普通区域:约$8/TB/月
($0.00001111/GB/小时)
本地区域:约$22/TB/月
($0.00003042/GB/小时)
普通区域:$0.011/GB
本地区域:$0.0122/GB
(目前均免费到2025年2月)
普通区域:约$8/月
本地区域:约$22/月
$0
(限时免费)
普通区域:约$8/月
本地区域:约$22/月
(限时优惠中)

其他流行的S3兼容存储服务

By Claude 3.7 sonnet

除了提到的这些服务商外,还有以下几家值得考虑的S3兼容存储提供商:

  1. Amazon S3 – 作为对象存储的鼻祖,仍然是最流行的选择之一

    • 存储费用: 标准存储约$0.023/GB/月(美国区域)
    • 流量费用: 入站免费,出站第一个1GB免费,之后按阶梯定价
    • 免费额度: 免费套餐提供5GB存储和20,000个GET请求
  2. Google Cloud Storage – 谷歌的对象存储解决方案

    • 存储费用: 标准存储约$0.02/GB/月
    • 流量费用: 入站免费,站内免费,出站按区域定价
    • 免费额度: 5GB存储和5GB出站流量
  3. Microsoft Azure Blob Storage – 微软的对象存储服务

    • 存储费用: 标准存储约$0.018/GB/月(热访问层)
    • 流量费用: 入站免费,站内免费,出站按区域定价
    • 免费额度: 5GB存储和免费入站数据传输
  4. Alibaba Cloud OSS (Object Storage Service) – 阿里云的对象存储服务

    • 存储费用: 标准存储约$0.018/GB/月
    • 流量费用: 入站免费,出站按区域计费
    • 全球多区域覆盖,包括中国大陆
  5. IBM Cloud Object Storage

    • 存储费用: 标准存储约$0.02/GB/月
    • 流量费用: 入站免费,出站按区域定价
    • 全球多区域覆盖
  6. OVH Object Storage

    • 存储费用: €0.01/GB/月起
    • 流量费用: 入站免费,出站按区域定价
    • 区域: 欧洲,北美,亚太

这些服务在性能、价格和地区覆盖方面各有优势,适合不同的使用场景。选择时应考虑存储需求、访问模式、地理位置和预算等因素。

总结

按需选择,也可考虑自建方案,实际费用以出账站单为准。

References

k8s 触发 pod 重新拉取镜像平滑升级的方法

下面介绍更新 Deployment 以重新拉取相同标签镜像的方法,不要只会杀 pod 触发了,个人最喜欢方法二

当镜像名称和标签都没有变化,但需要重新拉取镜像时(比如镜像内容已更新但标签保持不变),可以采用以下方法:

方法一:修改 Pod 模板以触发重新部署

为 Deployment 的 Pod 模板添加或更新一个注释(annotation)来触发滚动更新:

kubectl patch deployment [deployment-name] -p \
  "{\"spec\":{\"template\":{\"metadata\":{\"annotations\":{\"kubectl.kubernetes.io/restartedAt\":\"$(date +%s)\"}}}}}"

这会添加或更新一个时间戳注释,使 Kubernetes 认为 Pod 模板已更改,从而触发重新部署。

方法二:强制重启 Deployment

kubectl rollout restart deployment/[deployment-name]

这是 Kubernetes 1.15 及更高版本提供的便捷命令,效果与方法一类似。

方法三:修改 imagePullPolicy

确保容器的 imagePullPolicy 设置为 Always,这样每次 Pod 重启都会重新拉取镜像:

kubectl patch deployment [deployment-name] -p '{"spec":{"template":{"spec":{"containers":[{"name":"[container-name]","imagePullPolicy":"Always"}]}}}}'

设置后,可以使用方法一或方法二触发重新部署。

方法四:删除 Pod(不推荐)

手动删除 Pod,让 Deployment 控制器创建新的 Pod:

kubectl delete pod -l app=[your-app-label]

注意: 此方法不推荐用于生产环境,因为它可能导致服务中断。

最佳实践建议

  1. 始终使用唯一标签:最好的做法是为每个新版本的镜像使用唯一标签,如使用 Git commit SHA 或时间戳。

  2. 设置 Always 拉取策略:在 Deployment 中设置:

    spec:
      template:
        spec:
          containers:
          - name: your-container
            image: your-image:tag
            imagePullPolicy: Always
  3. 对于生产环境:推荐使用前两种方法(添加注释或使用 rollout restart),它们符合 Kubernetes 的声明式设计理念,并且会进行受控的滚动更新。

使用 kubectl rollout restart deployment/[deployment-name] 是最简单且符合 Kubernetes 最佳实践的方式。

Linux CPU 运行模式及功耗分析

本文第一章节主要内容转载自:linux cpu 运行模式

CPU动态节能技术用于降低服务器功耗,通过选择系统空闲状态不同的电源管理策略,可以实现不同程度降低服务器功耗,更低的功耗策略意味着CPU唤醒更慢对性能 影响更大。

对于对时延和性能要求高的应用,建议关闭CPU的动态调节功能,禁止 CPU休眠,并把CPU频率固定到最高。

类型

通常建议在服务器BIOS中修改电源管理为Performance,如果发现CPU模式为conservative或者powersave,可以使用cpupower设置CPU Performance模式,效果也是相当显著的。

几种模式如下:

  • performance: 顾名思义只注重效率,将CPU频率固定工作在其支持的最高运行频率上,而不动态调节。
  • userspace:最早的cpufreq子系统通过userspace governor为用户提供了这种灵活性。系统将变频策略的决策权交给了用户态应用程序,并提供了相应的接口供用户态应用程序调节CPU 运行频率使用。也就是长期以来都在用的那个模式。可以通过手动编辑配置文件进行配置
  • powersave: 将CPU频率设置为最低的所谓“省电”模式,CPU会固定工作在其支持的最低运行频率上。因此这两种governors 都属于静态governor,即在使用它们时CPU 的运行频率不会根据系统运行时负载的变化动态作出调整。这两种governors 对应的是两种极端的应用场景,使用performance governor 是对系统高性能的最大追求,而使用powersave governor 则是对系统低功耗的最大追求。
  • ondemand: 按需快速动态调整CPU频率, 一有cpu计算量的任务,就会立即达到最大频率运行,等执行完毕就立即回到最低频率;ondemand:userspace是内核态的检测,用户态调整,效率低。而ondemand正是人们长期以来希望看到的一个完全在内核态下工作并且能够以更加细粒度的时间间隔对系统负载情况进行采样分析的governor。 在 ondemand governor 监测到系统负载超过 up_threshold 所设定的百分比时,说明用户当前需要 CPU 提供更强大的处理能力,因此 ondemand governor 会将CPU设置在最高频率上运行。但是当 ondemand governor 监测到系统负载下降,可以降低 CPU 的运行频率时,到底应该降低到哪个频率呢? ondemand governor 的最初实现是在可选的频率范围内调低至下一个可用频率,例如 CPU 支持三个可选频率,分别为 1.67GHz、1.33GHz 和 1GHz ,如果 CPU 运行在 1.67GHz 时 ondemand governor 发现可以降低运行频率,那么 1.33GHz 将被选作降频的目标频率。
  • conservative: 与ondemand不同,平滑地调整CPU频率,频率的升降是渐变式的,会自动在频率上下限调整,和ondemand的区别在于它会按需分配频率,而不是一味追求最高频率;

图片

常用命令

查看当前的模式

cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor

查看所有逻辑CPU

watch -n -1 "cat /sys/devices/system/cpu/cpu*/cpufreq/scaling_governor" 

查看所有逻辑CPU当前运行的频率

watch -n -1 "cat /sys/devices/system/cpu/cpu*/cpufreq/cpuinfo_cur_freq"

查看频率信息

cpupower frequency-info

调整频率

cpupower frequency-set -g performance

分析样例

上文给出的内容可能部分已经过时,下面给一个在我的 ArchLinux + Asus Zenbook UX3450x 上的实际运行结果,并附上 Claude 给出的分析报告:

输出

$ sudo cpupower monitor
[sudo] songtianlun 的密码:
intel-rapl/intel-rapl:0
0
intel-rapl/intel-rapl:0/intel-rapl:0:0
0
intel-rapl/intel-rapl:0/intel-rapl:0:1
0
    | Nehalem                   || Mperf              || RAPL               || Idle_Stats                
 CPU| C3   | C6   | PC3  | PC6   || C0   | Cx   | Freq  || pack | core | unco  || POLL | C1E  | C6   | C10   
  12|  0.00| 47.66|  0.00|  0.00||  7.20| 92.80|  2194||23628906|15290855|1354305||  0.07|  7.80|  9.83| 75.30
  13|  0.00|  0.00|  0.00|  0.00|| 33.04| 66.96|  2775||23628906|15290855|1354305||  0.01| 14.97| 52.19|  0.00
  14|  0.00| 33.27|  0.00|  0.00||  5.01| 94.99|  2344||23628906|15290855|1354305||  0.01|  8.17| 34.95| 52.03
  15|  0.00| 47.03|  0.00|  0.00||  4.06| 95.94|  2371||23628906|15290855|1354305||  0.00|  5.45| 24.07| 66.59
  16|  0.00| 16.66|  0.00|  0.00||  4.80| 95.20|  2046||23628906|15290855|1354305||  0.00| 11.45| 41.66| 42.28
  17|  0.00| 52.60|  0.00|  0.00||  3.45| 96.55|  1971||23628906|15290855|1354305||  0.01|  6.34|  8.76| 81.57
  18|  0.00|  0.00|  0.00|  0.00||  7.24| 92.76|  2042||23628906|15290855|1354305||  0.01| 14.95| 78.06|  0.00
  19|  0.00|  1.14|  0.00|  0.00||  5.56| 94.44|  2274||23628906|15290855|1354305||  0.00|  9.09| 70.10| 15.47
   1|  0.00|  1.03|  0.00|  0.00|| 23.08| 76.92|  3295||23628906|15290855|1354305||  0.02| 18.70|  8.31| 50.08
   2|  0.00|  1.03|  0.00|  0.00||  2.40| 97.60|  3081||23628906|15290855|1354305||  0.01|  0.21|  2.09| 95.32
   3|  0.00|  1.65|  0.00|  0.00|| 32.88| 67.12|  3675||23628906|15290855|1354305||  0.02| 17.54|  8.86| 40.85
   4|  0.00|  1.65|  0.00|  0.00||  4.20| 95.80|  2809||23628906|15290855|1354305||  0.00| 11.68|  1.47| 82.74
   0|  0.00|  0.00|  0.00|  0.00||  7.20| 92.80|  2894||23628906|15290855|1354305||  0.01|  5.83| 13.04| 74.08
   5|  0.00|  0.00|  0.00|  0.00|| 20.27| 79.73|  3067||23628906|15290855|1354305||  0.05| 22.37| 21.72| 35.85
   6|  0.00|  0.09|  0.00|  0.00|| 19.44| 80.56|  2724||23628906|15290855|1354305||  0.01| 21.37| 30.71| 28.68
   7|  0.00|  0.09|  0.00|  0.00||  4.29| 95.71|  2592||23628906|15290855|1354305||  0.01|  0.76|  0.95| 94.03
   8|  0.00|  0.18|  0.00|  0.00|| 15.50| 84.50|  2535||23628906|15290855|1354305||  0.02| 11.31| 22.62| 50.75
   9|  0.00|  0.18|  0.00|  0.00||  1.68| 98.32|  2181||23628906|15290855|1354305||  0.00|  0.46|  5.16| 92.74
  10|  0.00|  1.09|  0.00|  0.00|| 20.15| 79.85|  2530||23628906|15290855|1354305||  0.02| 16.76|  9.28| 54.03
  11|  0.00|  1.09|  0.00|  0.00||  0.03| 99.97|  2482||23628906|15290855|1354305||  0.00|  0.04|  0.00| 99.92
  20|  0.00|  0.02|  0.00|  0.00||  1.53| 98.47|   956||23628906|15290855|1354305||  0.00|  0.20|  0.48| 97.99
  21|  0.00| 99.51|  0.00|  0.00||  0.11| 99.89|   589||23628906|15290855|1354305||  0.00|  0.05|  0.10| 99.74

分析报告

概述

该报告基于 cpupower monitor 命令的输出,显示了系统 CPU 的电源管理和性能状态。数据显示一个拥有多核 CPU(22个核心,编号从0到21)的系统,监控了 C-states(CPU 电源状态)、性能指标、功耗数据和空闲统计信息。

主要发现

CPU 利用率

  • 整体系统 CPU 大部分处于空闲状态,多数核心的 C0(活跃状态)时间比例较低
  • 核心 3 和 13 的活跃度最高,分别为 32.88% 和 33.04% 的 C0 时间
  • 核心 11 几乎完全空闲,C0 时间仅为 0.03%

C-states(CPU 电源状态)分布

  • 多数核心大量时间处于深度睡眠状态(C6 或 C10)
  • 核心 21 在 C6 状态的时间最高,达到 99.51%
  • 许多核心在 C10(最深睡眠状态)的时间比例很高,如核心 11 的 C10 时间为 99.92%

CPU 频率

  • 平均 CPU 频率在 956MHz 到 3675MHz 之间变化
  • 核心 3 运行频率最高,达到 3675MHz
  • 核心 20 和 21 频率最低,分别为 956MHz 和 589MHz

详细分析

性能活跃度(C0 状态)

CPU 活跃度(C0 状态)从高到低排序的前五名:

  1. 核心 13: 33.04%
  2. 核心 3: 32.88%
  3. 核心 1: 23.08%
  4. 核心 5: 20.27%
  5. 核心 10: 20.15%

电源状态分布

大多数核心在多种空闲状态之间分布:

  • C1E 状态:轻度睡眠,节电较少但唤醒快
  • C6 状态:深度睡眠,关闭核心电源,节电显著
  • C10 状态:最深度睡眠,最大化省电

核心 21 处于 C6 状态的时间高达 99.51%,表明这个核心几乎完全处于深度睡眠状态。

功耗数据

RAPL(运行平均功率限制)数据显示:

  • 处理器包(package)功耗:23628906 (单位可能是微瓦)
  • 核心功耗:15290855
  • 非核心功耗:1354305

核心频率分布

频率最高的核心:

  1. 核心 3: 3675MHz
  2. 核心 1: 3295MHz
  3. 核心 2: 3081MHz

频率最低的核心:

  1. 核心 21: 589MHz
  2. 核心 20: 956MHz

结论

这个系统显示典型的现代处理器电源管理行为,大部分核心大多数时间处于低功耗状态。系统工作负载主要集中在少数几个核心上(如核心 3、13),而其他核心则保持在各种节能状态。这种行为对于优化功耗和热量管理非常有利,特别是在轻负载情况下。

核心 21 的极低频率(589MHz)和极高的 C6 占用率(99.51%)可能表明该核心被操作系统识别为效率较低的核心,因此优先使用其他核心进行任务分配,或者系统正在积极管理功耗限制。

References