精选文章
Gitleaks 工具调研报告
从 Cloudflare 11.18 全局崩溃事件深度剖析:分布式系统中的容错哲学与配置管理实践
Vibe Coding 实战指南:与 AI 共创、保持流畅、持续成长
Git Submodule 简明使用指南
Git Submodule(子模块)是一个强大的功能,它允许你将一个 Git 仓库作为另一个 Git 仓库的子目录。简单来说,就是将子仓库的特定版本嵌入到父仓库中,同时保持子仓库独立的版本控制。
这项功能在以下场景中特别有用:
- 项目依赖:当你的项目依赖于一个外部库或框架,而这个库本身也是一个 Git 仓库时
- 代码复用:当你有多个项目需要共享同一份代码(例如 UI 组件库)时
- 大型项目管理:将一个大型项目拆分成多个可独立维护的组件时
1. 添加子模块
使用 git submodule add 命令来添加子模块。你需要提供子模块的 Git 仓库 URL 和你希望在父仓库中存放它的路径。
Hugo 模板系统概述
Hugo 是一个以速度著称的静态网站生成器,其强大的主题(Theme)**系统是其核心魅力之一。一个好的主题不仅能让网站拥有美观的界面,更能通过其合理的**文件结构和查找机制,为开发者提供极大的灵活性和可维护性。本文将深入探讨 Hugo 主题的内部结构,并揭示其文件查找的奥秘。
Hugo 主题的“骨架”:约定优于配置
Hugo 主题的核心在于其遵循**约定优于配置(Convention over Configuration)**的原则。这意味着,虽然你不需要在配置文件中显式声明每个文件的用途,但将文件放置在特定的目录并赋予它们特定的名称,Hugo 就能自动识别并加载它们。这种机制大大简化了开发流程,同时保证了主题的规范性和可扩展性。
Kubernetes 二进制部署:从零搭建单 Master 集群
使用 kubeadm 部署 Kubernetes 集群很方便,但它隐藏了底层细节。通过二进制方式手动部署,可以深入理解每个组件的作用和协作方式。
本文在 etcd 集群 已部署的基础上,搭建单 Master 节点的 Kubernetes 集群。
架构概览
单 Master 架构中,Master 节点运行控制平面组件,Worker 节点运行工作负载:

核心组件
| 组件 | 运行位置 | 作用 |
|---|---|---|
| kube-apiserver | Master | 集群入口,所有操作的统一接口 |
| etcd | Master | 分布式键值存储,保存集群状态 |
| kube-controller-manager | Master | 控制循环,确保实际状态匹配期望状态 |
| kube-scheduler | Master | 将 Pod 调度到合适的 Node |
| kubelet | Worker | 管理 Pod 生命周期,汇报节点状态 |
| kube-proxy | Worker | 实现 Service 网络代理和负载均衡 |
组件协作流程
kubectl create deployment nginx --image=nginx
│
▼
kube-apiserver ──→ etcd(存储期望状态)
│
▼
controller-manager(创建 ReplicaSet → 创建 Pod)
│
▼
scheduler(选定 Node,写入 Pod.Spec.NodeName)
│
▼
kubelet(watch 到分配给自己的 Pod,拉起容器)
│
▼
kube-proxy(配置 iptables/IPVS 规则,实现 Service 访问)前置条件
| 条件 | 说明 |
|---|---|
| etcd 集群 | 已部署,参考 etcd 集群部署 |
| 操作系统 | Linux(本文以 Ubuntu 为例) |
| 容器运行时 | containerd 或 Docker 已安装,参考 Docker 入门 |
| 网络 | 节点间互通,关闭 swap |
关闭 swap
Kubernetes 默认要求关闭 swap:
ETCD安全高可用集群部署测试
以下是个人搭建etcd集群中的记录,首先使用这篇文章中介绍的脚本创建三个虚拟机,ubuntu-01、
ubuntu-02、ubuntu-03,在三台虚拟机中分别安装 etcd
sudo apt install etcd安装完成之后打开 /lib/systemd/system/etcd.service 这个service文件
[Unit]
Description=etcd - highly-available key value store
Documentation=https://etcd.io/docs
Documentation=man:etcd
After=network.target
Wants=network-online.target
[Service]
Environment=DAEMON_ARGS=
Environment=ETCD_NAME=%H
Environment=ETCD_DATA_DIR=/var/lib/etcd/default
EnvironmentFile=-/etc/default/%p
Type=notify
User=etcd
PermissionsStartOnly=true
#ExecStart=/bin/sh -c "GOMAXPROCS=$(nproc) /usr/bin/etcd $DAEMON_ARGS"
ExecStart=/usr/bin/etcd $DAEMON_ARGS
Restart=on-abnormal
#RestartSec=10s
LimitNOFILE=65536
[Install]
WantedBy=multi-user.target
Alias=etcd2.service这个是etcd的service文件,可以看到etcd的配置文件在/etc/defalut/目录中,名称应该是etcd,这个和传统的不一致,我们需要在/etc/etcd/目录中存放配置文件,有两种选择,修改这里的EnvironmentFile,或者把/etc/etcd目录中文件链接到 /etc/default 中,我这里选择第二种方式。
在Windows上快速创建虚拟机
上一篇文章,我们实现了在 Linux 中快速创建虚拟机,就是使用 cloud init 初始化虚拟机设置,然后使用脚本快速创建,上面的创建过程在 windows wsl2 中也是完全可行的,毕竟 wsl2 其实本质上也是运行了一台虚拟机,在虚拟机中,再创建虚拟机完全可行的,今天我们来探索一下在 windows 平台上自带的 hyper-v 上创建虚拟机,创建的过程和上一篇文章中的类似,也是使用 cloud init 搭配 脚本。
在Linux上快速创建虚拟机
今天我们来聊一聊,怎么在 KVM 上快速创建虚拟机,首先什么是 KVM 呢?
KVM 的全称是 Kernel-based Virtual Machine,即基于内核的虚拟机。它是一种内建于 Linux 内核的开源虚拟化技术。不过 KVM 只是一个内核模块,单独的 KVM 不能看作一个完整的虚拟机软件。好在 Linux 中还有另一个强大的工具 QEMU。QEMU 提供了完整的虚拟化能力,但原始的 QEMU 只提供软件模拟,性能不是很高。而当我们在 QEMU 中集成 KVM 后,就能获得接近裸机的性能,这正是我们想要的。
Redis8.0 新特性深度解析
1. 摘要
Redis 8.0 的发布标志着其发展历程中的一个重要里程碑,不仅带来了显著的性能提升和功能扩展,更体现了平台战略层面的重新定位。此版本最引人注目的变化包括:将先前独立的 Redis Stack 功能(如 JSON、时间序列、概率数据结构及查询引擎)整合进核心,统一命名为 Redis Open Source;引入全新的 Vector Set 数据结构(目前处于 Beta 阶段),显著增强了其在人工智能(AI)和机器学习(ML)领域,特别是向量相似性搜索方面的能力 ;实施了超过 30 项性能优化,涵盖命令延迟、吞吐量、复制效率和查询处理能力等多个维度 ;以及在许可模式上做出的重大调整,在保留原有 RSALv2 和 SSPLv1 的基础上,增加了 OSI 批准的 AGPLv3 选项 。
Server-Sent Events: 实现高效的实时Web通信
Server-Sent Events 概述
Server-Sent Events(SSE)是一种基于 HTTP 协议的服务器推送技术,它允许服务器以流的方式向客户端实时推送数据。与 WebSocket 等双向通信技术不同,SSE 专注于单向通信(从服务器到客户端),特别适合需要服务器主动推送数据的场景,如:
- 社交媒体的实时通知(评论、点赞、关注提醒)
- 股票价格、体育比分的实时更新
- 日志和事件流的实时监控
- 聊天应用中的消息提醒
SSE 与 WebSocket 的对比
| 特性 | Server-Sent Events | WebSocket |
|---|---|---|
| 通信方向 | 单向(服务器到客户端) | 双向 |
| 协议 | 标准 HTTP | WebSocket 协议(基于 HTTP 握手) |
| 实现复杂度 | 低,使用现有的 HTTP 基础设施 | 相对较高,需要特殊的服务器支持 |
| 重连机制 | 内置自动重连 | 需要手动实现 |
| 浏览器支持 | 所有现代浏览器(IE 需要 polyfill) | 所有现代浏览器 |
| 数据格式 | 文本(通常是 JSON) | 文本或二进制 |
| 适用场景 | 服务器频繁更新客户端 | 需要频繁双向数据交换 |
SSE 工作原理
SSE 的实现原理非常简单。客户端通过 JavaScript 的 EventSource 接口发起请求,服务器保持连接打开并定期发送事件。这种连接具有以下特点:
