我们的笔记

  • 友情链接
  • 关于

  • 新版 K3s CNI 目录变化导致 Istio 安装失败

    最近在研究 Istio,在最新正式版的 K3s v1.31.5+k3s1 版本下,安装最新正式版 Istio 1.24.3 时,一直卡在 ztunnel 安装这里,于是来发个牢骚。

    现象

    使用 Helm 安装 ztunnel 之后,发现 ztunnel 无法调度,报错 IP 池不足:failed to allocate for range 0: no IP addresses available in range set。事实上每个节点上调度的 Pod 相当少,IP 不足是不可能的。而且在这之后,其它 Pod 如果重新调度,也会报同样错误,说明集群网络可能出现问题了。

    调查

    任选一个节点,发现 /var/lib/cni/networks/cbr0 目录下已经整个 IP 池被占用,没有释放。参考一个 Issue:pod creation failure: “no IP addresses available in range set” · Issue #4682 · k3s-io/k3s,尝试将 IP 释放,释放后发现,如果再次尝试安装 ztunnel 就会导致 IP 快速被耗尽,而且 ztunnel 的报错信息中有 CNI 组件相关内容(忘记截图),因此考虑 K3s 中是否有其它不同的因素导致其工作异常。

    经过一番搜寻之后发现 K3s 还真的有一个相关的变化,CNI bin dir changes with K3s version · Issue #10869 · k3s-io/k3s 这里引入了一个 CNI 路径的变化,从 /var/lib/rancher/k3s/data/current/bin/ 变为了 /var/lib/rancher/k3s/data/cni/!

    一开始我看到 Rancher 当下的文档 Additional Steps for Installing Istio on RKE2 and K3s Clusters | Rancher 中提到的路径都是前者,就没有怀疑,看来问题就恰好出在这里。

    注意到 Istio 的 Helm Chart 中,有一个提交对此做出了适配:fix: fix k3s cniBinDir to static path (#54112) · istio/istio@7693f57 · GitHub,但是不幸的是还没有正式版的 Release,也就是说,当前安装的 Istio 1.24.3 仍然是旧的 CNI 路径,因此和较新版本的 K3s 不兼容。不过,我发现当下已经有 RC 版本(1.25.0-rc.0)的 Helm Chart 带上了这个变更,所以尝试清理 IP 池后,将 Istio 组件都更新到 1.25.0-rc.0,果然 ztunnel 成功运行了。

    引用

    Istio / Platform-Specific Prerequisites

    kubenet/kubelet leaks ips on docker restart · Issue #34278 · kubernetes/kubernetes

    kubenet ip泄漏 – xiaoqing blog

    「Bug」K8s 节点的 IP 地址泄漏,导致 IP 被耗尽 – 於清樂 – 博客园

    failed to allocate for range 0: no IP addresses available in range set: 172.20.xx.1-172.20.xx.254 – yuxiaoba – 博客园

    Containerd IP leakage · Issue #5768 · containerd/containerd

    Kubernetes-cni issue with 1.9.0 – no ip address available in range · Issue #57280 · kubernetes/kubernetes

    domain

    在

    云原生, 没用的知识

    于

    2025年3月3日

  • domain 的自言自语 2503

    开发者

    Bedtime Stories For Children: Storage Engines (pub-ver) – Google 幻灯片

    网络

    从流量控制算法谈网络优化 – 从 CUBIC 到 BBRv2 算法 | 亚马逊AWS官方博客

    BBR Testing Using iperf3

    AI

    Reverse Prompt Engineering for Fun and (no) Profit

    杂项

    Powercfg command-line options | Microsoft Learn
    最近发现有台 Windows 机器总是意外唤醒,一个个找唤醒设备有点麻烦,发现有命令行工具 powercfg 可以用。

    domain

    在

    自言自语

    于

    2025年3月1日

  • domain 的自言自语 2502

    开发者

    Rust can be faster than C

    BashFAQ/105 – Greg’s Wiki
    set -e 可能存在意外行为,需要小心处理。

    网络

    CNNIC费用分析

    居然还有 2 亿多 IPv4 地址未分配!-ipv4地址总数多少亿

    网络设备(特指 TP-Link)距离正确处理 IPv6 Fragmentation 还有多远 – 属于CYY自己的世界

    domain

    在

    自言自语

    于

    2025年2月1日

  • 为阿里云 RDS MySQL 开启 SSL,并使用自签证书

    最近发现阿里云 99 计划的数据库,竟然包含香港地区,于是又冲动消费了。整了一个给 K3s 玩,试试它的 HA 模式。不过现有的节点很多都不在阿里云内网,需要开放数据库的公网访问才可以。开放数据库公网访问必然要开启 SSL 了,不然数据直接在公网上面明文传输十分危险。

    问题

    一开始我直接在阿里云 RDS 控制台上启用 SSL,使用默认的云端证书,然后先用 Grafana 去尝试连接,发现无法成功校验证书,报错:

    Error: ✗ failed to connect to database: tls: failed to verify certificate: x509: certificate relies on legacy Common Name field, use SANs instead

    猜测默认的云端证书只有在 Common Name 字段带上了数据库连接地址,而 Go 1.15 之后需要从 Subject Alternative Names 中进行校验,综合考虑后决定使用自签证书。

    自签证书

    平时 OpenSSL 用得不多,于是直接使唤 AI 干活:

    openssl genpkey -algorithm RSA -out ca-key.pem
    openssl req -new -x509 -key ca-key.pem -out ca-cert.pem -days 3650 -subj "/CN=MySQL CA"
    
    openssl genpkey -algorithm RSA -out server-key.pem
    openssl req -new -key server-key.pem -out server-req.pem -subj "/CN=rm-foo.mysql.rds.aliyuncs.com"
    openssl x509 -req -in server-req.pem -CA ca-cert.pem -CAkey ca-key.pem -CAcreateserial -out server-cert.pem -days 3650 -extfile <(printf "subjectAltName=DNS:rm-foo.mysql.rds.aliyuncs.com")

    然后在 RDS 控制台上传生成的服务端证书就可以了。

    在 Grafana 上配置

    我们需要先将上面生成的 CA 证书先挂载到 Grafana 容器中,然后参考官方文档进行配置,使其可以经由 TLS 连接数据库。

    我的 Grafana 是使用官方的 Helm Chart 部署的,其提供了一个可以注入 ConfigMap 的配置项,因此我们先创建一个包含了 CA 的 ConfigMap:

    apiVersion: v1
    kind: ConfigMap
    metadata:
      creationTimestamp: null
      name: grafana-database-tls-ca
      namespace: monitoring
    data:
      certificates.crt: |
        -----BEGIN CERTIFICATE-----
        -----END CERTIFICATE-----

    然后在 values.yaml 中配置挂载它:

    extraConfigmapMounts:
      - name: database-tls-ca
        mountPath: /etc/grafana/ssl/
        subPath: certificates.crt
        configMap: grafana-database-tls-ca
        readOnly: true

    这样的话,CA 就已经被挂载到 Grafana 容器中了。接下来我们需要配置 Grafana 以开启 TLS,同样,这里也是在 values.yaml 中配置就行。

    grafana.ini:
      database:
        type: mysql
        host: rm-foo.mysql.rds.aliyuncs.com
        ssl_mode: true
        ssl_sni: rm-foo.mysql.rds.aliyuncs.com
        server_cert_name: rm-foo.mysql.rds.aliyuncs.com
        ca_cert_path: /etc/grafana/ssl
        user: $__file{/etc/secrets/grafana-database/username}
        password: $__file{/etc/secrets/grafana-database/password}

    如果配置没有问题的话,此时执行更新之后应该就可以了。

    在 K3s 上配置

    同样,官方文档给出了配置项。我们需要先把刚才的 CA 证书复制到 K3s server 服务器上,然后修改启动脚本。

    curl -sfL https://get.k3s.io | INSTALL_K3S_EXEC="--flannel-backend=wireguard-native --disable=servicelb --disable=traefik --disable=metrics-server" \
            sh -s - server \
            --datastore-endpoint="mysql://username:password@tcp(host:3306)/database" \
            --datastore-cafile="/usr/local/share/ca-certificates/mysql.crt" \
            --flannel-external-ip \
            --node-ip 1.2.3.4 \
            --kubelet-arg=node-ip=0.0.0.0

    因为配置变化,安装脚本会更新配置并重启 K3s。如果配置没有问题,K3s 会正常启动。

    后记

    强制指定用户使用加密连接

    如果全部的工作负载已经迁移至 TLS 连接,那么我们就可以配置数据库特定用户必须使用加密连接。

    ALTER USER k3s@'%' REQUIRE SSL;
    FLUSH PRIVILEGES;

    配置生效之后,我们可以重启工作负载进行验证。

    为什么不通过一些 workaround 来使用默认的云端证书

    为了行文的连贯性,我把这段放到了这里。你可能会想到几个问题:

    Q:为什么不直接 skip-verify?省得折腾半天。

    A:不安全,这不是我的风格。而且根据 K3s 文档,其至今仍然暂时无法跳过证书检查。虽然 K3s 的数据库读写垫片 kine 项目已经有人实现了 skip-verify 选项并且已经合入主干+发布,但是当下等待 K3s 支持还早,感兴趣的可以看下面的链接。

    k3s can’t utilize tls option with mysql external database · Issue #1093 · k3s-io/k3s · GitHub

    Add support for TLS skip verification by tuxillo · Pull Request #306 · k3s-io/kine · GitHub

    Q:为什么不使用 GODEBUG=x509ignoreCN=0 环境变量使其可以校验 CN 而不是 SANs?

    A:Go 从 1.15 开始校验 SANs 而不是 CN,从 1.17 开始将会移除这个选项,出于长远考虑我不会这么做。

    x509: certificate relies on legacy Common Name field, use SANs or temporarily enable Common Name matching with GODEBUG=x509ignoreCN=0 · Issue #775 · rancher/rke2 · GitHub

    引用

    Configure Grafana | Grafana documentation

    Cluster Datastore | K3s

    certificates – Provide subjectAltName to openssl directly on the command line – Information Security Stack Exchange

    How do I use SANs with openSSL instead of common name? – Stack Overflow

    domain

    在

    云原生, 没用的知识

    于

    2025年1月10日

  • domain 的自言自语 2501

    开发

    Go能实现AOP吗? – 掘金

    Complete list of environment variables on Windows 10, 11 – Pureinfotech

    运维

    Incident communication best practices | Atlassian

    腾讯云 4g 服务器实际可用内存只有 3.3g – V2EX
    kdump 有预留 128MB 内存,如果不需要可以考虑关闭。

    DIY 一个运维神器 Open IP-KVM – 知乎
    DIY PiKVM V2 – PiKVM Handbook

    Proxmox VE 8 换源 | fallen’s attic
    Proxmox VE 8 配置国内软件源并删除订阅弹窗 – Song`s Blog

    SSH ProxyCommand example: Going through one host to reach another server – nixCraft

    tls-san parameter won’t change · Issue #4149 · k3s-io/k3s
    kubernetes – How to add a domain to k3s certificate – Server Fault
    最近为 K3s 集群添加了入口域名来实现负载均衡,中途 tls-san 长时间未刷新,原因还未细究。

    网络

    排除指定连接的FastTrack加速 – YuS
    RouterOS 开启 fasttrack 后,如果有 mangle 表修改后的连接被 fasttrack,会导致连接异常,所以可以根据 connection mark 或地址等元素进行排除。

    domain

    在

    自言自语

    于

    2025年1月1日

  • SSH: no matching host key type found.

    最近在使用 SSH 连接服务器时有报错:

    Unable to negotiate with xx.xx.xx.xx port 22: no matching host key type found. Their offer: ssh-rsa,ssh-dss

    主要原因是服务端较旧,客户端较新,服务端提供的密钥算法在客户端均已经默认被禁用。其中:

    • ssh-rsa 在 8.2 版本默认被禁用:openssh.com/txt/release-8.2
    • ssh-dss 在 7.0 版本默认被禁用:openssh.com/txt/release-7.0

    这里只能进行一个 workaround,在连接时临时允许特定算法/密钥。

    ssh -o HostKeyAlgorithms=+ssh-rsa -o PubkeyAcceptedKeyTypes=+ssh-rsa user@host

    如果是 Git 推拉代码的场景,也是同理:

    GIT_SSH_COMMAND="ssh -oHostKeyAlgorithms=+ssh-rsa" git clone ssh://user@host/repo

    引用

    OpenSSH: Legacy Options

    web hosting – Unable to negotiate with XX.XXX.XX.XX: no matching host key type found. Their offer: ssh-dss – Stack Overflow

    Git error no matching host key type found. Their offer: ssh-rsa – Stack Overflow

    Allison

    在

    没用的知识

    于

    2024年12月25日

  • domain 的自言自语 2412

    云原生

    三摸 k3s: 正式部署 · Issue #320 · Bpazy/blog · GitHub

    Promtail never scrapes `journal` logs (using README suggestions in official helm chart) · Issue #9922 · grafana/loki

    开发

    coredns/plugin/template/README.md at master · coredns/coredns · GitHub
    可以根据正则提取并转换成解析记录,非常方便。

    GitHub – ACT-02/PingFangUI-VF: New PingFang UI font from iOS 18 / macOS 15 Sequoia. Processed by @alphaArgon.

    高德车载导航的差分更新优化实践 – 高德技术 – 博客园

    代码评审做个人?

    网络

    失控的PCDN:观察PCDN技术现状与案例分析

    Coping with the TCP TIME-WAIT state on busy Linux servers

    4.14 tcptwreuse 为什么默认是关闭的? | 小林coding

    tcp_tw_recycle and tcp_tw_reuse | Nyo’s Study Book

    安全

    sukka: “Go 1.23 默认为 crypto/tls 启用了实验性质…” – ACG.MN

    Go 1.23 默认为 crypto/tls 启用了实验性质的「后量子时代加密 Cipher」X25519Kyber768Draft00,导致通过 Go 1.23 内置的 TLS 实现发送的 TLS Client Hello 从典型的 252 bytes 激增到 1476 bytes。对于一些未正确配置的防火墙或 LB 来说,这会导致使用 Go 1.23 + Go 内置 TLS 实现的客户端 TLS 握手失败。
    目前已知的相关 issue 有:AWS 基于 Suricata 的防火墙会默认丢弃过长的 TLS Client Hello 导致 Go 1.23 编写的应用无法访问 AWS API( https://github.com/hashicorp/terraform-provider-aws/issues/39311 );AdGuardHome 及其其使用的 DNS 转发库 adguard/dnsproxy 无法和 DNSPod 公共 DNS 的 DoH 和 DoT 完成 TLS 握手(https://github.com/AdguardTeam/AdGuardHome/issues/7357 、 https://www.v2ex.com/t/1094021#reply0 )。

    Ending OCSP Support in 2025 – Let’s Encrypt

    CKS

    没赶上旧的考题,只能硬着头皮上了,不然马上就过期了😅。确实变化挺大,网上这些题库已经很多都不适用了,反而是那个 Killer.sh 的模拟题很多跟真题差不多。

    2024 CKS 题库

    云原生|kubernetes|2022年底cks真题解析(1-10)-阿里云开发者社区

    云原生|kubernetes|2022年底cks真题解析(11-16)-阿里云开发者社区

    吃瓜

    「10倍程序员」与「仁慈独裁者」 – 知乎

    离职!和“小猫补光灯”作者的一次聊天

    IMG_0001

    买房已经比租房划算了?

    domain

    在

    自言自语

    于

    2024年12月1日

  • domain 的自言自语 2411

    开发的日常

    groovy – IllegalArgumentException: Expected named arguments (Jenkins) – Stack Overflow
    最近在 Jenkins 上抄了个官方博客里的并行过程总是报错,改成这样能跑,但还没时间研究原因。

    Packet filtering and firewalls | Docker Docs
    使用 -p 参数暴露的端口,其使用 dnat 实现,故无法在 filter 表 input 链中直接拦截,Docker 提供了一个 DOCKER-USER 链用于管理此类规则。

    Linux

    grub2 – Set “older” kernel as default grub entry – Ask Ubuntu

    A kernel code of conduct enforcement action [LWN.net]

    GitHub – p8952/bocker: Docker implemented in around 100 lines of bash

    Debug

    一次 k8s coredns UDP 通信故障分析(conntrack 篇)

    网络

    Traceroute Isn’t Real | Gekk

    WireGuard 基础教程:wg-quick 路由策略解读 · 云原生实验室
    这个配合 ip rule 的实现,个人认为非常优雅。

    SOCKMAP – TCP splicing of the future (cloudflare.com)
    splice() performance for TCP socket forwarding — Netdev (spinics.net)
    8.10. NIC Offloads | Red Hat Product Documentation

    Playing along with NFTables – openSUSE admin – openSUSE Project Management Tool
    nftables 入门:从配置文件到端口转发 | Rachel’s Blog | Rachel030219 (rachelt.one)

    IPv6 Prefixes – MikroTik
    家宽固定 ipv6 前缀实现静态公网 – V2EX
    ROS 路由能给家宽固定 IPV6 前缀? – V2EX
    以前一直没搞懂为啥华为等光猫可以固定长时间一个 IPv6 前缀不变,现在才知道可以使用 Prefix Hint 使得网关获取到一个相对固定的前缀。

    中年男人

    Major Change Notice: New Package Manager – Release and security announcements – OpenWrt Forum

    无聊

    国行Nintendo Switch网络服务运营调整通知

    domain

    在

    自言自语

    于

    2024年11月1日

  • domain 的自言自语 2410

    云原生

    讓你的 Container Image 逃脫 Kubelet Image GC 的魔掌 | hwchiu learning note

    kubernetes – Insert multiline json string into helm template for base64 encoding – Stack Overflow
    非二进制的 secret,可以使用 stringData,更方便。

    Unlocking Advanced Image Management with ArgoCD and ArgoCD Image Updater | by Kittipat.Po | Medium

    CoreDNS image cannot be pulled when use –image-repository · Issue #2714 · kubernetes/kubeadm
    如果需要在自建集群上换镜像仓库,且遇到 CoreDNS 无法拉取的问题,可以配置 ClusterConfiguration 中的 imageRepository 和 dns.imageRepository。

    Troubleshooting Cilium deployed with Argo CD — Cilium 1.17.0-dev documentation
    Argo CD out of sync due to Cilium Identity | by Rojenshrestha | Medium
    使用 ArgoCD 时发现始终处于未同步状态(OutOfSync),查看 diff 发现有 cilium 资源不断被删除和重建,可以直接在 ArgoCD 中配置忽略。

    How to set public IP for flannel to use with `wireguard-native` backend? · k3s-io/k3s · Discussion #5911 · GitHub

    开发

    Rust编写的跨平台UI框架——Tauri正式发布2.0稳定版,是时候把“毒瘤”Electron换掉了 (qq.com)

    Jenkins CasC role strategy can’t get permissions working correctly – Stack Overflow

    Debug

    Get rid of Another update is currently in progress – WordPress Development Stack Exchange

    powershell – “Extend my Windows desktop onto this monitor” programmatically – Stack Overflow
    远程时,某远程软件限制只能一个桌面且不让切换,只好终端里切成复制显示…

    中年男人

    https://mt.lv/hex_october
    MikroTik 新款hEX E50UG – YuS (irouteros.com)
    RB750Gr3 的继承者发布了,感觉可以买几个玩玩。

    双十一固态硬盘购买推荐 V1.1:企业级、消费级旗舰、性价比型号,以及终极的洋垃圾灵车_哔哩哔哩_bilibili

    谁也成为不了中国的 YouTube-品玩 (pingwest.com)

    Infuse 8 – Now Available | Firecore

    仰望大佬

    Eric Zhang – Resume (ekzhang.com)

    无聊

    HTP 笑传:扔掉 UDP,试试并不特殊的低精度时间同步 – 翰林的小站 (hanlin.press)

    谨防恶作剧者!使用这个KEY激活Windows 10/11会导致系统循环崩溃只能重装 – 蓝点网 (landiannews.com)

    推荐一个 浏览器拓展 Wayback machine (nodeseek.com)
    不过为啥老是被打?

    STARSHIP – The Game (spacex.com)

    究竟怎样才能早起不困?🧐 (qq.com)

    小狗不懂什么是过节,只知道这几天都没人陪小狗玩了_哔哩哔哩_bilibili

    domain

    在

    自言自语

    于

    2024年10月1日

  • Hello,鸿蒙应用

    感觉鸿蒙应用文档很多,初学者看起来有点乱乱的,记录一下快速开发方法。

    开发者账号注册

    你需要提前注册好华为开发者联盟账号,否则在后续开发调试应用过程中无法完成自动签名、发布等操作

    安装IDE

    HUAWEI DevEco Studio下载链接

    Hello World

    新建Project,在应用中选择第一个模版项目

    真机调试

    准备好你的华为手机,使用USB数据线连接到电脑。

    • 打开开发者模式
    • 打开“USB调试”开关
    • 应用服务自动签名
    • 启动应用,编译完成即可在手机端看到效果

    基础知识

    应用名称修改

    1. 配置文件:src/resources/zh_CN/element/string.json
    2. 修改name为EntryAbility_label对应的value

    应用图标修改

    1. 配置文件:src/resources/base/media

    入口文件

    1. 配置文件:src/main/module.json5
    2. 查看 srcEntry 指向的文件
    3. 查看onWindowStageCreate方法中加载的页面为入口文件

    新建页面

    1. 配置文件:src/resources/base/profile/main_pages.json
    2. 在src/ets/pages目录下新建同名ets文件

    页面之间跳转

    1. 在A页面中注册按钮,绑定点击事件,使用router.pushUrl点击即跳转到第二个页面
    2. 在B页面中注册按钮,绑定点击事件,router.back()点击跳回A页面
    // Page A
    Button() {
      Text('Next')
        .fontSize(30)
        .fontColor('#FFFFFF')
        .fontWeight(FontWeight.Bold)
    }
    .type(ButtonType.Capsule)
    .backgroundColor('#409EFF')
    .width('40%')
    .height('5%')
    .onClick(() => {
      router.pushUrl({url: 'pages/Second'}).then(() => {
        console.info('Jumping to second page')
      }).catch((err) => {
        console.error(`Failed to jump to the second page. Code is ${err.code}, message is ${err.message}`)
      })
    // Page B
    Button() {
      Text('Back')
        .fontSize(25)
        .fontColor('#FFFFFF')
        .fontWeight(FontWeight.Bold)
    }
    .type(ButtonType.Normal)
    .backgroundColor('#409EFF')
    .width('40%')
    .height('5%')
    .onClick(() => {
      router.back()
    })

    常见问题

    真机运行报错:

    Failure[MSG_ERR_INSTALL_FAILED_NO_BUNDLE_SIGNATURE]

    解决:单击Open signing configs 或 通过File -> Project Structure -> Signing Config 重新登录

    Allison

    在

    鸿蒙应用

    于

    2024年9月5日

←上一页
1 2 3 4 … 10
下一页→

我们的笔记

Keep Coding

  • Mail
  • GitHub
  • Telegram
  • 首页
  • 友情链接
  • 关于

粤ICP备2021143753号-1

以 WordPress 设计