自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(53)
  • 收藏
  • 关注

原创 Go 基础:结构体与切片

结构体是 Go 语言中用来组合多个不同类型字段的复合数据类型。你可以把它理解为一个"模板"或"蓝图",用来描述一个事物的多个属性。​​// 定义一个结构体类型X intY int​结构体在内存中是连续分配的,字段按照声明顺序依次排列每个字段占据固定大小的内存空间结构体是值类型:赋值时会复制整个结构体的数据type关键字定义新类型struct关键字声明这是一个结构体大写字母开头的字段名(如XY)是导出的(可被其他包访问)小写字母开头的字段名只能在当前包内访问。

2026-06-29 01:28:56 302

原创 eBPF 入门:给 Linux 内核装插件

eBPF技术概述与应用实践 摘要:eBPF(Extended Berkeley Packet Filter)是一种革命性的内核可编程技术,能够在无需修改内核源码的前提下安全高效地扩展内核功能。本文系统梳理了eBPF的核心原理与技术架构,包括:1)技术演进历程,从经典BPF网络包过滤发展到通用内核虚拟机;2)核心工作机制,基于验证器、JIT编译器和辅助函数实现安全沙箱;3)典型应用场景,覆盖性能观测、网络优化、安全控制三大领域;4)开发实践方法,通过BCC和libbpf-bootstrap框架快速构建eBPF

2026-06-22 20:30:20 531

原创 MySQL 部署与升级

为什么要用低权限 mysql 用户运行服务:防止 MySQL 服务被入侵后,攻击者直接拿到服务器 root 权限,是生产环境的标准安全规范。下创建服务文件的软链接,系统进入多用户运行模式时,自动启动该目录下的所有服务。:多版本容易冲突,升级回滚困难,不符合生产环境「可回滚、可追溯」的运维原则。为什么客户端也要配置 socket 路径:MySQL 客户端默认查找。:保留字冲突、废弃函数与语法、旧时间类型、认证插件变更、系统变量变更。,服务端指定到数据目录下后,路径不一致会导致本地连接失败。

2026-06-22 14:56:47 361

原创 Go 语言基础1

defer语句会将其后的函数调用延迟执行,等到包裹它的函数即将返回前才执行。// 输出:// hello// world结构体是将多个不同类型的字段打包成一个整体的自定义类型,用于描述一个实体的多个属性。X intY int。

2026-06-17 10:04:20 331

原创 k8s etcd备份恢复

上下文 = 一套连接集群的完整登录配置套餐,包含三个核心信息:要连接的集群地址登录用的用户身份(权限)默认操作的命名空间通俗理解:你的电脑可以同时连接多个 K8s 集群(测试、开发、生产),上下文就相当于 "切换登录的集群 + 账号",告诉 kubectl:你现在要操作哪个集群、用什么身份。kubeadm 部署的单 Master 集群中,etcd 默认是运行在 Master 节点上的静态 Pod仅监听本地回环地址:etcd 的启动参数默认就是。

2026-04-27 16:56:39 594

原创 角色与内容集合:自动化配置的标准化复用机制

角色通过约定式的目录结构,实现了配置的模块化拆分,解决了大 playbook 的维护问题,通过变量优先级与调用方式的设计,实现了配置的灵活适配。内容集合通过命名空间与独立分发的机制,解决了核心模块的版本管理与命名冲突问题,实现了内容的独立更新与分发。RHEL 系统角色基于这两个机制,实现了跨 RHEL 版本的标准化配置,降低了企业跨版本自动化的维护成本。这两个机制共同构成了 Ansible 大规模自动化的基础,为企业的自动化运维提供了标准化的复用与分发体系。

2026-04-23 18:42:49 531

原创 配置加载混淆(vars_files与from_yaml)

工具作用适用场景限制vars_files提前加载本地 YAML 文件你提前就准备好本地配置文件的静态场景只能加载本地提前存在的文件,无法处理动态内容from_yaml动态解析任意 YAML 字符串运行时才拿到的动态内容:接口返回、远程文件读取等没有限制,只要是 YAML 格式的字符串就能解析这俩不是谁替代谁的关系,而是完全不同场景的互补工具:如果你提前就有本地的配置文件,用vars_files简单高效如果你是运行时才拿到的动态 YAML 内容,用from_yaml来解析。

2026-04-23 17:29:30 397

原创 Ansible拆分大型Playbook

在 Ansible 的使用场景中,当自动化任务从单台服务器的简单配置,扩展到数十台服务器的复杂业务部署时,单文件 Playbook 的局限性会逐渐显现:文件长度超过千行,修改维护成本升高;不同项目间的通用任务无法直接复用;多人协作时的代码冲突概率提升。为解决这类问题,Ansible 提供了文件拆分能力,支持将大型 Playbook 拆解为多个独立的小文件,再通过导入或包含的方式将其组合为完整的执行流程。

2026-04-23 17:19:58 585

原创 Ansible文件部署

Jinja2 是一款面向 Python 的模板引擎,Ansible 将其集成进来,实现了动态配置的生成能力:运维人员只需要编写一份模板文件,在其中定义变量和逻辑,Ansible 在部署时会自动根据当前受管主机的信息,渲染生成适配该主机的最终配置文件,一份模板即可适配所有主机,大幅降低了配置的维护成本。

2026-04-22 21:05:52 713

原创 Ansible实施任务控制

【代码】Ansible实施任务控制。

2026-04-22 20:26:30 497

原创 Ansible Playbook

无合适的正规模块时,可使用三个特殊模块直接运行命令,

2026-04-22 17:38:43 382

原创 Ansible介绍

组件名称定义说明控制节点安装 Ansible 的主机,所有 Ansible 命令均在此节点执行受管主机被 Ansible 管理的主机,无需安装 Ansible,仅需满足连接与运行环境要求Module(模块)Ansible 最小执行单元,Ansible 内置大量现成模块,可完成各类运维操作,如 yum 模块用于软件安装,user 模块用于用户管理Task(任务)单次调用模块的操作,是 Play 中的最小执行项Play针对一组主机的一组任务的集合,用于完成某一类主机的配置。

2026-04-22 17:18:25 283

原创 Ansible变量与事实

Ansible 自动帮你收集主机的系统信息(内存、系统、IP 这些),存成变量,你可以根据这些信息自动调整任务,比如 CentOS 用 dnf,Ubuntu 用 apt,不用手动写。自己加的系统信息,比如自己应用的版本,Ansible 会自动收集,但是要记住规则:文件要放到目录下扩展名必须是.fact格式只能是 INI 或者 JSON!不能用 YAML!我之前踩过这个坑,写了 YAML 的文件,结果收集不到,搞了半天。

2026-04-21 20:46:51 411

原创 K8s控制平面升级

控制平面(Master 节点):可以理解成集群的 “大脑”,负责管整个集群的状态:比如调度 Pod、维护集群配置、提供 API 接口,核心组件有,还有存数据的 etcd。工作节点(Worker 节点):就是真正跑你业务 Pod 的机器,上面跑kubelet来管理本地的 Pod。先升级控制平面,再升级工作节点。因为控制平面要向下兼容旧版本的工作节点,保证你升控制平面的时候,旧版本的工作节点还能正常工作,业务不会断。

2026-04-18 16:21:04 365

原创 K8s访问控制

Kubernetes 的访问控制,是集群安全的基础,从身份管理,到权限管控,再到网络隔离,这一套体系下来,就能把你的集群的安全管好,避免误操作、避免非法访问,让你的生产集群更安全。

2026-04-18 15:42:02 479

原创 K8s Secret :敏感数据管理的正确姿势

如果你的敏感数据是文件,比如 SSH 私钥、证书,那你可以把 Secret 挂载成容器里的文件,应用直接读文件就能拿到数据,这个方式比环境变量更安全,因为环境变量会被子进程继承,很容易泄露,而文件就不会有这个问题。:很多人以为 Secret 里的数据是加密的,其实不是,它只是做了个 Base64 编码,任何人只要能拿到你的 Secret,一秒就能解码拿到明文,Secret 的安全靠的是权限控制,不是编码。:就算是 Secret 的配置,也别传到公共仓库,会泄露你的敏感数据,最好单独存在本地。

2026-04-17 00:19:54 384

原创 ConfigMap

正式环境一律用 YAML 管理 ConfigMap,纳入 git 版本控制,别用命令行乱建,不然配置丢了你都不知道。敏感配置永远用 Secret,别用 ConfigMap,安全第一。配置文件用 Volume 挂载,启动参数用环境变量,按需选择,别搞混了。需要热更新的配置,一定要用 Volume 挂载,不然改了配置不生效。

2026-04-16 23:36:09 375

原创 K8s存储卷入门

默认的容器里,存储是跟容器绑定的:容器跑着的时候,你能往里面写文件,但是一旦容器崩了、删了,这些文件就全没了 —— 你要是用容器跑个数据库,重启之后数据全没了还有个常见的需求:同一个 Pod 里的两个容器,要共享文件。比如一个容器跑应用,生成日志,另一个容器跑日志收集工具,要把日志传到远程存储,这俩容器得能读到同一份日志文件才行。。容器删了,只要卷还在,数据就还在;同时,卷能被多个容器挂载,实现文件共享。

2026-04-13 17:48:03 784

原创 从HTTP到K8s探针:彻底搞懂HTTPGet健康检查

很多人搞不懂的配置,其实也非常好理解:它和你用 curl 的时候加的参数,是完全一模一样的东西。那 kubelet 发出去的 HTTP 请求,就会自动带上这个请求头,就和你在终端里执行下面这条 curl 命令的效果,100% 完全一样curl -H "Custom-Header: Awesome" http://容器IP:80/health你可能会问,好好的为什么要加这个东西?因为有些服务的健康检查接口,做了特殊的限制: 比如有些服务要求,只有带了。

2026-04-13 15:27:11 360

原创 Kubernetes服务发现

有 NodePort、LoadBalancer 了,为什么还要搞个 Ingress?直到开始部署多个服务,才明白:用 NodePort 的话,每个服务要开一个不同的端口,我有 10 个服务,就要记 10 个端口,太麻烦了用 LoadBalancer 的话,每个服务要一个独立的公网 IP,10 个服务就要 10 个 IP,成本太高了而 Ingress,就是解决这个问题的:它可以让你用一个公网 IP,管理所有的服务的请求,转发到 A 服务的请求,转发到 B 服务test.com/a。

2026-04-12 20:00:13 450

原创 K8s控制器学习难点

学完这六个控制器,我最大的感受就是,K8s 的设计真的特别清晰,不同的场景用不同的控制器,把不同的能力拆分开:无状态应用用 Deployment有状态应用用 StatefulSet节点级组件用 DaemonSet一次性任务用 Job定时任务用 CronJob搞懂这些,K8s 的应用部署就基本通了,希望我的踩坑总结能帮到同样在学习的朋友~

2026-04-12 18:05:41 550

原创 kubernetes Pod难点

Pod 一直卡 Init?别慌,查看 Init 容器的日志,看看初始化任务哪里出错了,改了就好。进入容器改了内容,重启就没了?因为你改的是容器的临时可写层,镜像本身没变,容器重建就会丢,要永久改的话,要么改镜像,要么用持久化存储。Pod 删了又回来?大概率是静态 Pod,别用 kubectl 删了,去节点上把配置文件删掉才行。别啥容器都往一个 Pod 里塞!只有紧密耦合的才放一起,独立的程序分开做 Pod。。

2026-04-12 15:15:19 357

原创 K8s 标签

完整标签键(冒号前)值(冒号后)用途versionv1.1.0标记应用版本releasestable标记版本状态(正式版 / 测试版)env: devenvdev标记运行环境(开发 / 生产)app: nginxappnginx标记应用名称标签是key: value的键值对,冒号前是「分类的维度(键)」,冒号后是「分类的具体值(值)」;键分「可选前缀 + 必须名称」,值规则宽松,核心作用是给资源打标记、方便筛选和批量管理;

2026-04-11 11:19:26 698

原创 K8s 不部署源代码、不构建应用

CD 工具(比如 Argo CD、Jenkins)从 Harbor 拉取更新 K8s 的 Deployment YAML,把镜像版本改成K8s 收到更新请求后,执行滚动更新拉取新镜像创建新 Pod,启动容器销毁旧 Pod确保最终运行的 Pod 数量符合期望这里 K8s 只做「运行容器」的事,完全不关心镜像怎么来的。K8s 是「容器的运行平台」,不是「代码的构建平台」。它只负责运行已经打包好的容器,不负责把代码变成容器的过程。

2026-04-10 18:35:42 522 1

原创 一个 Pod 从无到有的完整创建过程

K8s 的,是一个的抽象。它代表 “一台虚拟机”,里面有独立的网络、存储。:运行在这台 “虚拟机” 里的。一个 Pod 里至少有一个业务容器,通常还会有一个pause基础容器来共享网络命名空间。。前面的控制流程都是在处理 “房子”,最后一步才是在房子里启动 “家具”。

2026-04-10 01:30:00 975

原创 CGroup 资源限制原理

摘要: CGroup(控制组)是Linux内核的资源管理机制,用于解决容器资源限制问题。Namespace仅提供视图隔离,无法限制资源使用,而CGroup通过子系统(如memory、cpu)为进程组设置资源上限(如内存100M、CPU 50%),防止单个容器耗尽宿主机资源,确保系统稳定性。实验通过创建内存控制组并限制为100M,验证了CGroup对进程内存占用的有效管控。Docker和K8s的资源限制(如--memory、--cpus)均基于CGroup实现,与Namespace共同构成容器技术的核心支柱。

2026-04-09 23:30:00 412

原创 手工模拟一个容器

光有隔离(Namespace)还不够,容器还要有独立的文件视图和网络设备,这才是完整的 “手工容器”。你会发现,虽然用了--pid隔离,但如果不挂载新的 proc,执行ps -ef还是能看到宿主机进程。原理/proc目录是内核给进程看的资源列表。操作:效果:重新执行ps -ef你只能看到自己的 bash 进程了!PID 命名空间彻底生效。“进程本质上是 /proc 挂载点中的文件描述符”。容器需要独立的网络,但又要能和宿主机通信。所以用Veth Pair(虚拟网线)。原理。

2026-04-09 19:00:34 591

原创 OCI 镜像标准 ↔ Docker 镜像分层原理

容器镜像是一个分层存储的归档文件(通常为 Tar 格式),包含运行容器所需的所有静态文件和元数据。其核心设计遵循开放容器倡议(OCI)标准,主要包含以下两部分容器镜像不是 Docker 发明的,而是有全球统一的行业标准(OCI 标准),Docker 只是这个标准的一个实现。核心对应:Docker 镜像完全遵循 OCI 标准OCI 标准定义了容器镜像的本质:分层存储的归档文件,由layer.tar(分层文件)、(分层索引)、(运行配置)组成;

2026-04-07 18:20:58 443 5

原创 K8s 容器启动全流程:从 kubelet 到 Linux 内核

kubelet 只负责 "我要启动一个容器",至于底层用什么运行时、怎么启动,kubelet 完全不关心,只要你符合 CRI 标准,就能对接,这也是 K8s 能支持这么多容器运行时的原因。这也是容器为什么这么轻量的原因:容器不是虚拟化,它就是一个被内核隔离、限制的普通进程,所有能力都是内核早就有的,Docker/CRI-O 只是把这些能力打包成了好用的工具而已。runc 启动完容器内的进程之后,容器就正式运行起来了,这时候它就是一个独立的、被隔离的进程,有自己的环境,跑我们的业务应用。

2026-04-07 16:00:13 535

原创 NFS 自动挂载:autofs 与 systemd.automount

autofs 是通用方案,支持复杂场景(多共享、通配符),但需要理解「主 + 子」映射文件的层级;systemd.automount 是极简方案,仅支持单共享,无需额外安装,改 fstab 即可;无论哪种方案,挂载选项优先加 soft(避免服务器断网卡死),sync(保证数据同步)。

2026-04-01 19:17:15 436

原创 Linux 启动过程

如果没有 initramfs 的支撑,内核启动后根本无法识别系统盘,直接卡在 “找不到根文件系统” 的致命阶段。很多人对 “内核启动” 有基础认知,却极易忽略 initramfs(临时初始化文件系统)的核心作用,甚至系统启动失败后,都想不到问题根源出在这里。新手重置 root 密码时,往往只记得核心的 “改密码” 步骤,却忽略 SELinux 安全上下文的自动重标记,导致重启后密码修改无效、无法登录系统。这一步是重置密码的 “收尾关键”,跳过则必然导致密码修改无效,这也是 90% 新手踩坑的核心点。

2026-04-01 17:50:08 565

原创 SELinux

SELinux 给进程、文件、端口等所有资源分配的一个身份标签核心字段type(类型)——SELinux 策略主要通过type来判断访问是否合法。httpd进程的类型是httpd_t,网站根目录文件的类型是,只有这两个类型匹配时,httpd才能读取网站文件。查看方式ls -Zps -Z端口上下文:给自定义端口打标签,让服务能监听文件上下文:给自定义目录设置安全类型(如前文/custom示例)模块策略:用从日志生成策略模块,解决特殊拦截场景。

2026-03-30 17:30:00 360

原创 Linux管理基本存储重难点

操作差异记1点:GPT创建分区时可以给分区起名字(如mkpart usersdata xfs 2048s 1000MB),MBR不能起名,只能选primary(主分区)或logical(逻辑分区)。创建Swap后忘记激活,或者没写入fstab,导致重启后Swap失效;:创建分区时,开始位置固定填2048s(2048个扇区),这是标准的分区对齐方式,能最大化硬盘性能,不用记其他数值,直接用2048s即可。:删除分区后,忘记删除/etc/fstab中对应的挂载配置,导致开机时系统找不到分区,报错无法启动。

2026-03-30 13:10:04 193

原创 Linux 日志系统最容易混淆的核心难点:journal 与 rsyslog 到底啥关系

journald管「全量采集 + 高速检索」,rsyslog管「分类归档 + 文本存储」默认 journal 日志存在内存,重启就丢,必须配置才会持久化到磁盘排查实时问题用journalctl,回溯历史问题看/var/log下的文本日志。

2026-03-27 20:30:00 227

原创 使用正则表达式匹配文本

正则表达式是,用于在文本(日志、配置文件、命令输出)中快速查找、筛选符合规则的内容,结合grep命令是系统管理中的核心工具,vim/less 等工具也支持正则表达式。

2026-03-27 15:59:50 348

原创 shell脚本中的循环和条件结构

纯命令组合的脚本无法处理和,Bash 提供了for循环(处理重复任务)和if/then系列条件结构(处理分支判断),并通过和实现脚本的逻辑控制,是脚本从 “简单命令组合” 到 “智能程序” 的核心。

2026-03-26 21:15:00 335

原创 编写简单的shell

空格等),默认会被 shell 解析为特殊含义,若需使用字符的。表示将输出从 STDOUT 重定向到 STDERR。,便于日志分离(正常信息和错误信息分开存储)。命令直接输出,内容会显示在终端,例。(原始含义),需通过。

2026-03-26 17:01:15 252

原创 Linux 文件系统

Linux 用于管理存储设备上数据的组织方式,RHEL 9 有明确的文件系统使用规范:本地默认:XFS(高性能,适合企业级本地存储)兼容支持:ext4(经典 Linux 文件系统,向下兼容)可移动介质:exFAT(RHEL 9 新增,解决 U 盘 / 移动硬盘跨系统兼容问题)集群共享:GFS2(多节点服务器集群的共享磁盘管理,支持并发访问)(mount point):Linux 中目录是文件系统的访问入口,将文件系统关联到目录的操作叫挂载,该目录即为挂载点。

2026-03-23 20:39:40 423 1

原创 系统负载与性能排查

负载 = 等待 CPU 的进程数(R 状态) + 等待 I/O 的进程数(D 状态) 的排队长度。uptime 或 w 命令能看到 3 个数字:load average: 0.45, 0.32, 0.28第一个:1 分钟平均负载第二个:5 分钟平均负载第三个:15 分钟平均负载。

2026-03-19 20:32:54 29

原创 特殊权限(SUID / SGID / Sticky)与默认权限:umask

只对可执行文件有效运行时以文件所有者身份执行,不是以当前用户身份。

2026-03-19 20:06:31 46

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除