这一周好忙

新公司的网络居然可以直连谷歌,香港的出口IP,Zenlayer的线路哈哈,而且还能直接用Gemini神奇。

发现git默认生成的密钥对改成了ed25519,问了下AI如下:

ssh-keygen 是一个非常实用的命令行工具,用于生成 SSH (Secure Shell) 协议使用的密钥对。这个密钥对通常由一个私钥和一个公钥组成。它们是 SSH 安全通信的基石,允许用户在不传输密码的情况下安全地认证到远程服务器。


密钥对的核心概念

  • 公钥 (Public Key):
    • 这是您可以安全地共享给任何人的部分。
    • 您需要将它放在您想要连接的远程服务器上(通常在 ~/.ssh/authorized_keys 文件中)。
    • 公钥用于加密数据,并且可以验证私钥签名的数据。
    • 它不能用来解密数据或进行身份认证,只能用于验证私钥持有者的身份。
  • 私钥 (Private Key):
    • 这是您需要严格保密的部分。绝不能与任何人共享。
    • 它通常存储在您的本地计算机上(例如 ~/.ssh/id_rsa)。
    • 私钥用于解密由对应公钥加密的数据,并用于向远程服务器签名认证请求。
    • 如果私钥泄露,您的 SSH 连接安全就会受到威胁。

ssh-keygen 的基本用法

最简单的生成命令是:

ssh-keygen

执行这个命令后,ssh-keygen 会引导您完成以下几个步骤:

  1. 文件保存路径: 它会提示您选择密钥对的保存位置。默认情况下,私钥会保存在 ~/.ssh/id_rsa(对于 RSA 算法)或 ~/.ssh/id_ed25519(对于 Ed25519 算法),公钥则会是相同路径加上 .pub 后缀(例如 ~/.ssh/id_rsa.pub)。

    Enter file in which to save the key (/home/user/.ssh/id_rsa):
    

    如果您不输入任何内容直接回车,就会使用默认路径。如果您想生成多个密钥对用于不同目的,可以输入不同的文件名。

  2. 密码短语 (Passphrase):

    Enter passphrase (empty for no passphrase):
    Enter same passphrase again:
    

    这是非常重要的一步。

    • 作用: 为您的私钥加密。即使私钥文件被盗,没有密码短语也无法使用。这提供了额外的安全层。
    • 建议: 强烈建议设置一个强密码短语。虽然每次使用私钥时都需要输入密码短语会增加一点点不便,但它能极大地提升安全性。您可以使用 ssh-agent 来缓存密码短语,避免每次都输入。
    • 留空: 如果您留空(不设置密码短语),私钥将不加密,这意味着任何获得该私钥文件的人都可以直接使用它。在自动化脚本等特定场景下可能会留空,但请务必了解其安全风险。
  3. 密钥指纹和随机艺术图: 生成完成后,ssh-keygen 会显示密钥的指纹 (fingerprint) 和一个随机生成的艺术图 (randomart image)。这些信息用于视觉验证密钥的唯一性。

    Your identification has been saved in /home/user/.ssh/id_rsa
    Your public key has been saved in /home/user/.ssh/id_rsa.pub
    The key fingerprint is:
    SHA256:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx user@hostname
    The key's randomart image is:
    +---[RSA 3072]----+
    |      . .        |
    |     . +         |
    |    o +          |
    |   E o +         |
    |  . o + o .      |
    |   . + = + o     |
    |    . + O .      |
    |     . = .       |
    |      +          |
    +----[SHA256]-----+
    

ssh-keygen 的常用选项

ssh-keygen 提供了许多选项来定制密钥生成过程:

  • -t <type>:指定密钥类型。
    • rsa (默认):最常用的类型,通常足够安全。
    • dsa:较旧,不推荐使用。
    • ecdsa:椭圆曲线数字签名算法,通常提供与 RSA 相同安全级别但密钥更短。
    • ed25519:目前推荐的算法,基于 Edwards 曲线,速度快且安全性高,抗量子攻击特性更好。
    • 示例: ssh-keygen -t ed25519
  • -b <bits>:指定密钥的位数 (bits)。
    • 适用于 RSA、DSA、ECDSA。对于 Ed25519,位数是固定的,不需要指定。
    • RSA 建议至少 2048 位,更安全的选择是 3072 或 4096 位。
    • 示例: ssh-keygen -t rsa -b 4096
  • -f <filename>:指定密钥文件保存的路径和名称。
    • 示例: ssh-keygen -f ~/.ssh/my_webserver_key
  • -P <passphrase>:指定旧的密码短语。 (用于更改密码短语时)
  • -N <new_passphrase>:指定新的密码短语。 (用于更改密码短语时)
  • -C <comment>:为公钥添加注释。
    • 这个注释不会影响密钥的功能,但有助于您识别密钥的用途。
    • 默认注释是 user@hostname
    • 示例: ssh-keygen -t rsa -b 4096 -C "My key for production server"
  • -q:静默模式。 减少输出信息。
  • -p:改变现有私钥的密码短语。
    • 示例: ssh-keygen -p -f ~/.ssh/id_rsa
  • -y:从私钥中提取公钥。
    • 如果您不小心删除了 .pub 文件,可以用这个命令重新生成。
    • 示例: ssh-keygen -y -f ~/.ssh/id_rsa > ~/.ssh/id_rsa.pub

生成的密钥文件内容

  • 私钥文件 (id_rsaid_ed25519):

    -----BEGIN OPENSSH PRIVATE KEY-----
    b3BlbnNzaC1rZXktdjEAAAAABG5vbmUAAAAAZXNjZHNhLXNoYTItbmlzdHAyNTYAAA...
    -----END OPENSSH PRIVATE KEY-----
    

    这是一个 PEM 编码的文件,包含您的私钥信息。绝对不能泄露。

  • 公钥文件 (id_rsa.pubid_ed25519.pub):

    ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDFf... user@hostname
    

    或者对于 Ed25519:

    ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAICL... user@hostname
    

    公钥文件通常只有一行。它包含三个部分:

    1. 密钥类型: ssh-rsassh-ed25519
    2. 公钥本身: 一长串 Base64 编码的字符串。
    3. 注释: 默认是 user@hostname,或您用 -C 指定的注释。

密钥对的使用流程

  1. 生成密钥对: 在您的本地计算机上使用 ssh-keygen 生成私钥和公钥。
  2. 上传公钥: 将生成的公钥 (.pub 文件) 的内容复制到您想要连接的远程服务器的 ~/.ssh/authorized_keys 文件中。如果 ~/.ssh 目录或 authorized_keys 文件不存在,您需要手动创建它们,并确保它们有正确的权限(chmod 700 ~/.sshchmod 600 ~/.ssh/authorized_keys)。
  3. 安全连接: 从本地计算机使用 ssh user@remote_host 命令连接。SSH 客户端会自动查找并使用您的私钥进行身份认证。如果私钥有密码短语,SSH 客户端会提示您输入。

通过理解 ssh-keygen 及其生成的密钥对,您可以更安全、高效地管理您的 SSH 连接。

排查了一天的网络不通的问题,最后重启一下好了,额有些东西搞不出来就先睡一觉吧。

试了下 k3s 还是有点意思的,我以前以为只嵌入了控制面,才发现是全部都嵌入了,一个可执行文件就搞定了。

试用了一下WSL2,最大的败笔就是不能同时启动多个发行版,多个发行版默认还是共享网络的,对于分布式开发就很不舒服。

从 XML 到 JSON 再到 CBOR 尽管 Kubernetes API Server 使用 HTTPS 协议提供 RESTful API,但它确实使用了 Protocol Buffers (Protobuf) 来进行数据序列化。 同时 gRPC-Web 这可以说是将 Protobuf over HTTP 概念推广得最成功的项目之一。

排查一个服务连不上etcd的问题,最后发现是没有配置证书,首先要自己用证书去尝试,如果etcdctl没问题的话,就是应用的问题,最后还是靠chatgpt结局了:

2025-07-30 01:47:11.007657 I | embed: rejected connection from "10.40.242.88:47286" (error "tls: failed to verify client's certificate: x509: certificate signed by unknown authority (possibly because of \"crypto/rsa: verification error\" while trying to verify candidate authority certificate \"demo\")", ServerName "default-etcd-client.demo.svc")

helm 居然还会去检查资源有没有冲突:

Error: INSTALLATION FAILED: Unable to continue with install: StorageClass "local-path" in namespace "" exists and cannot be imported into the current release: invalid ownership metadata; label validation error: missing key "app.kubernetes.io/managed-by": must be set to "Helm"; annotation validation error: missing key "meta.helm.sh/release-name": must be set to "default"; annotation validation error: missing key "meta.helm.sh/release-namespace": must be set to "demo"

使用wsl安装的ubuntu 24 在pod挂载hostpath的遇到了一个问题:

inux mounts: Path /opt/kubelet/dev is mounted on / but it is not a shared or slave mount. 执行此命令mount --make-rshared /即可,解决方法见