作者小头像 Lv.1
32 成长值

个人介绍

这个人很懒,什么都没有留下

感兴趣或擅长的领域

暂无数据
个人勋章
TA还没获得勋章~
成长雷达
20
12
0
0
0

个人资料

个人介绍

这个人很懒,什么都没有留下

感兴趣或擅长的领域

暂无数据

达成规则

发布时间 2026/10/23 10:31:41 最后回复 yd_229207802 2026/10/24 23:04:28 版块 开发者空间
41 11 0
他的回复:
从三个层面回答:调谐循环、Informer 机制、水平触发设计。一、调谐循环(Reconcile Loop)控制器的核心是一个不断运行的循环:读取期望状态(etcd 中的 spec)→ 读取实际状态(集群中真实的 Pod 等)→ 比较差异 → 执行操作消除差异 → 回到第一步。这个循环不关心"发生了什么变化",只关心"当前状态是否等于期望状态"。比如 Deployment 期望 3 个副本,实际 2 个就创建 1 个;实际 4 个就删 1 个。无论中间经历了什么事件,最终都收敛到期望状态。二、Informer 机制控制器不可能每秒轮询 API Server 获取全量资源列表。Informer 机制解决此问题:1. Reflector 通过 Watch(长连接)监听资源变更事件,首次全量 List 建立基线,之后只处理增量事件;2. Delta FIFO 队列将事件去重后放入队列;3. Local Store 在内存中维护资源本地副本,控制器读本地缓存而非请求 API Server;4. ResourceEventHandler 将资源变更事件的 key 入队,Reconcile 循环取出处理。整个机制让"感知变化"成本从 O(全量资源) 降到 O(变更数量)。三、为何水平触发而非边缘触发边缘触发只在"事件发生时"响应一次,错过就永远错过。水平触发只要"状态不满足条件"就持续触发,直到满足为止。K8s 选择水平触发的原因:1. 事件可能丢失——Watch 断连重连期间的事件可能漏掉,水平触发在下次 Reconcile 时发现状态不对会重新处理;2. 操作可能失败——创建 Pod 失败了,水平触发在下次循环会重试;3. 最终一致性好推理——控制器只需看当前状态和期望状态的差值,逻辑简单且幂等。这正是声明式系统的核心:用户只声明"我要 3 个副本",控制器负责不管中间发生什么,最终都收敛到 3 个。
发布时间 2026/10/23 10:48:10 最后回复 yd_254320880 2026/10/24 19:46:02 版块 开发者空间
156 35 0
发布时间 2026/10/23 10:53:36 最后回复 yd_226289576 2026/10/23 11:19:32 版块 开发者空间
13 2 0
他的回复:
建议按"安全优先、由外到内"的顺序操作:第一步:改 SSH 远程端口(必须先做)默认 22 端口会被全球扫描器持续爆破。编辑 /etc/ssh/sshd_config 把 Port 22 改成高位端口(如 50022),同时安全组放行新端口、关闭 22。改完 systemctl restart sshd,用新端口重新连接确认能登录后再继续。第二步:禁用密码登录、改用密钥(必须)在 sshd_config 设 PasswordAuthentication no、PubkeyAuthentication yes。先把公钥放到 ~/.ssh/authorized_keys,确认密钥能登录后再禁密码。同时禁止 root 直接登录(PermitRootLogin no),用普通用户 + sudo。第三步:配置安全组(必须)安全组只放行需要的端口:SSH(新端口)、Web 服务端口(80/443)。不要放行所有端口,不要对 0.0.0.0/0 开放数据库端口(3306/5432/6379 等),数据库只对内网或本机开放。第四步:系统更新 + 防火墙(建议)yum/apt update 升级系统补丁。配置 firewalld 或 ufw 作为第二道防线。第五步:创建普通用户 + 配置 sudo(建议)不要长期用 root 操作。useradd 创建普通用户,加入 wheel/sudo 组,日常用普通用户登录,需要特权时 sudo。第六步:设置时区 + 监控告警(可后做)timedatectl set-timezone Asia/Shanghai。在华为云控制台给 ECS 配置监控告警(CPU、内存、磁盘使用率阈值告警)。顺序上最关键的是:先改端口再禁密码,每一步都确认能重新登录后再继续,避免把自己锁在外面。
发布时间 2026/10/23 10:41:39 最后回复 yd_226289576 2026/10/23 10:58:43 版块 开发者空间
29 3 0
他的回复:
根因分析:容器默认时区是 UTC(+00:00),北京时间是 UTC+8,所以日志时间戳正好慢 8 小时。TZ 环境变量"时灵时不灵"的原因是:Alpine 用 musl libc,默认不带时区数据库(tzdata),光设 TZ=Asia/Shanghai 但 /usr/share/zoneinfo 下没有对应文件,musl 会静默回退到 UTC,所以不生效。方案一:Pod 级 volumeMount 挂载宿主机时区(推荐,无需改镜像)在 Deployment 模板里给每个容器加两个挂载:将 /etc/localtime 和 /usr/share/zoneinfo 以 readOnly 方式从 hostPath 挂载进来。宿主机一般已装 tzdata,容器直接复用,零镜像改动。K8s 1.28 + containerd 完全支持。方案二:Dockerfile 安装 tzdata + 设 TZ(改镜像,适合 Alpine)Alpine 加 RUN apk add --no-cache tzdata,再设 ENV TZ=Asia/Shanghai。glibc 镜像(debian/ubuntu/centos)通常已自带 tzdata,只需 ENV TZ=Asia/Shanghai 即可。方案三:Mutating Webhook 全局注入(一次配置,永久生效)写一个 Admission Webhook,自动给所有 Pod 注入上面的 volumeMount,新应用无需任何改动。社区有现成实现如 k8s-tz,部署后全集群 Pod 自动统一时区。应用层兜底:Java:-Duser.timezone=Asia/Shanghai;Go:import _ "time/tzdata" 把时区库编进二进制;Python:用 zoneinfo,镜像里装 tzdata。几个坑:1. 只改 TZ 不重启 Pod 不生效,改完要滚动重启;2. alpine 的 apk add tzdata 不要在后面层删掉 /usr/share/zoneinfo;3. 确认日志采集器(filebeat/fluent-bit)自己的时区;4. 对账数据建议统一存 UTC,展示层再转北京时间。