onepassword-operator排障清单:Secret不生成、不更新、重启不生效的8类问题快速解决
【免费下载链接】onepassword-operatorThe 1Password Connect Kubernetes Operator provides the ability to integrate Kubernetes Secrets with 1Password. The operator also handles autorestarting deployments when 1Password items are updated.项目地址: https://gitcode.com/gh_mirrors/on/onepassword-operator
onepassword-operator(1Password Connect Kubernetes Operator)是一款把 1Password 凭据自动同步为 Kubernetes Secret、并在凭据更新时自动滚动重启相关 Deployment 的开源 Operator。本文面向新手与一线运维,给出一份实操排障清单,覆盖Secret 不生成、不更新、重启不生效等 8 类高频问题,帮你快速定位根因并修复,少走弯路。
🧭 排障前:先看懂它的 3 个核心机制
把这三个"运动部件"搞清楚,后面 90% 的问题都能自己定位:
- OnePasswordItem 控制器—— 监听
OnePasswordItem自定义资源(CR),按spec.itemPath从 Connect 拉取条目并生成同名 Secret。核心逻辑在internal/controller/onepassworditem_controller.go。 - Deployment 控制器—— 监听带
operator.1password.io/item-path注解的 Deployment,为其自动创建 Secret。核心逻辑在internal/controller/deployment_controller.go。 - Secret 轮询更新器—— 每隔
POLLING_INTERVAL(默认 600 秒=10 分钟)轮询一次,对比item-version注解与 1Password 中的实际版本,有变化就更新 Secret 并按需重启 Deployment。核心逻辑在pkg/onepassword/secret_update_handler.go。
理解这几个关键的环境变量 / 注解,是排障的前提:
| 配置项 | 默认值 | 作用 |
|---|---|---|
OP_CONNECT_HOST | 必填 | Operator 访问 Connect 的地址 |
OP_CONNECT_TOKEN | 必填 | Connect 鉴权 token |
POLLING_INTERVAL | 600 | 检查凭据更新的轮询间隔(秒) |
AUTO_RESTART | false | 是否自动滚动重启使用了 1Password Secret 的 Deployment |
WATCH_NAMESPACE | 全部命名空间 | 监听哪些命名空间(逗号分隔),留空=全集群 |
MANAGE_CONNECT | false | 是否自动部署一套默认 Connect |
💡 提示:所有注解键都以
operator.1password.io/为前缀,统一定义在pkg/onepassword/annotations.go。
问题1:Secret 根本没生成 —— 先查 Operator 与 Connect 是否就绪
症状:apply 了 OnePasswordItem 或 Deployment,但kubectl get secret查不到对应 Secret。
排查步骤:
- Operator Pod 是否 Running?
kubectl get pods -n <operator-ns>。若反复重启,多半是连不上 Connect——OP_CONNECT_HOST/OP_CONNECT_TOKEN没配好时,Operator 会直接退出(见cmd/main.go中connect.NewClientFromEnvironment)。 - CRD 是否已安装?
kubectl get crd onepassworditems.onepassword.com。CRD 未装时 OnePasswordItem 无法创建。 - 看 Operator 日志:
kubectl logs -n <ns> <operator-pod>,重点搜unable to create Connect client、Failed to retrieve item。
问题2:Secret 名字对不上 —— 名字被自动"清洗"了
症状:你以为 Secret 名叫My App DB,结果怎么都查不到。
原因:K8s Secret 名必须是合法的 DNS 子域名,Operator 会自动转换——转小写、空格替换为-、删除首尾非法字符、超过 253 字符则截断(见pkg/kubernetessecrets/kubernetes_secrets_builder.go的createValidSecretName)。
排查:用kubectl get secret列出全部 Secret 找"近似名";字段 key 也会同样被清洗,所以data里的键名可能和 1Password 里看到的略有出入。
问题3:itemPath 写错 / Vault 或 Item 找不到
症状:Operator 日志报is not an acceptable path,或No vaults found with identifier/No items found。
原因:
itemPath必须是vaults/<vault_id_or_title>/items/<item_id_or_title>四段格式(pkg/onepassword/items.go的ParseVaultAndItemFromPath严格校验)。- 用标题匹配时,若找不到任何同名 Vault/Item,会直接报错。
- 若存在多个同名 Vault/Item,Operator 会挑选最早创建的那个——你很可能连错了对象。
排查:核对路径拼写与分段;尽量用 ID 而非标题,避免同名歧义。
问题4:Secret 迟迟不更新 —— 轮询间隔 + 忽略标签
症状:在 1Password 里改了值,K8s Secret 却迟迟不变。
排查步骤:
- 记住更新不是实时的,最长要等一个
POLLING_INTERVAL(默认 600 秒=10 分钟)。想更快就调小该环境变量(cmd/main.go)。 - 检查 1Password 条目是否被打了
operator.1password.io:ignore-secret标签——一旦打上就会锁定,永不更新(pkg/onepassword/secret_update_handler.go的isItemLockedForForcedRestarts)。 - 观察 Secret 上
operator.1password.io/item-version注解是否随更新而递增,以此判断轮询是否生效。
问题5:Deployment 不自动重启 —— AUTO_RESTART 没配对
症状:Secret 明明更新了,但引用它的 Pod 没重启。
排查步骤:
- 自动重启需要四层里至少一层为 true:Operator 环境变量
AUTO_RESTART、命名空间注解、Deployment 注解、OnePasswordItem 注解,键统一为operator.1password.io/auto-restart。 - 值必须是字符串
"true"或"false",写错(如大小写/拼写不对)会被判为 false(utils.StringToBool)。 - 优先级从高到低:OnePasswordItem 注解 > Deployment 注解 > 命名空间注解 > Operator 环境变量(见
secret_update_handler.go中isSecretSetForAutoRestart等函数)。 - 确认 Deployment 确实通过 volume /
secretKeyRef/env引用了该 Secret(pkg/onepassword/deployments.go的GetUpdatedSecretsForDeployment)。
问题6:Operator Pod 起不来 / 命名空间没被监听
症状:Operator 处于 CrashLoop,或某些命名空间里的 OnePasswordItem 完全没反应。
排查:
- 若设置了
WATCH_NAMESPACE,就只监听指定命名空间,其余命名空间的资源会被忽略(cmd/main.go的getWatchNamespace)。想全集群生效就留空。 - RBAC:Operator 需要 secrets / deployments / namespaces / leases 等权限,详见
config/rbac/role.yaml。权限不足会触发 403。 - 若未单独部署 Connect,可设
MANAGE_CONNECT=true让 Operator 自动部署一套默认 Connect(config/manager/manager.yaml)。
问题7:用 status.conditions 精确定位错误
OnePasswordItem 状态里有一个Ready条件,失败时status.conditions[].message会写入具体错误信息(internal/controller/onepassworditem_controller.go的updateStatus)。
排查:kubectl describe onepassworditem <name>直接查看Ready: False及 Message,往往比翻日志更快锁定根因。
问题8:Secret 类型不可变 / 字段与文件同名冲突
症状:改了 Secret 类型报错;或某个文件字段一直没生效。
原因:
- Secret 的
type创建后不可修改,试图变更会报Cannot change secret type(ErrCannotUpdateSecretType,见kubernetes_secrets_builder.go)。 - 同一 1Password 条目中,若"文件字段"和"普通字段"同名,普通字段优先,文件内容会被忽略(
BuildKubernetesSecretData)。 - 值为空的字段不会写进 Secret。
✅ 一张速查表(收藏备用)
| 症状 | 最可能原因 | 快速动作 |
|---|---|---|
| Secret 没生成 | Connect 连不上 / CRD 没装 | 看 Operator Pod 日志 +kubectl get crd |
| Secret 名字找不到 | 名字被自动清洗 | kubectl get secret找近似名 |
| 报 "not an acceptable path" | itemPath 格式错 | 核对vaults/x/items/y |
| Secret 不更新 | 轮询未到 / 被 ignore 锁定 | 等满一个间隔 / 去掉 ignore 标签 |
| Pod 不重启 | AUTO_RESTART 未开或写错 | 四层注解设为"true" |
| 部分命名空间无效 | WATCH_NAMESPACE限制 | 留空以监听全部命名空间 |
| 想看具体根因 | — | kubectl describe onepassworditem |
| 改 Secret 类型失败 | type 不可变 | 删除后重建 Secret |
📚 关键源码索引(排障时对照阅读)
- 入口与环境变量解析:
cmd/main.go - OnePasswordItem 控制器(含状态/Ready 写入):
internal/controller/onepassworditem_controller.go - Deployment 控制器:
internal/controller/deployment_controller.go - 轮询更新与自动重启判定:
pkg/onepassword/secret_update_handler.go - 注解键统一前缀定义:
pkg/onepassword/annotations.go - Secret 构造与命名清洗规则:
pkg/kubernetessecrets/kubernetes_secrets_builder.go - 条目与 itemPath 解析:
pkg/onepassword/items.go - 判定 Deployment 是否引用了 Secret:
pkg/onepassword/deployments.go - CRD 类型定义(含
Ready状态结构):api/v1/onepassworditem_types.go
🔑 小结:绝大多数 onepassword-operator 故障都落在Connect 连通性、命名清洗、itemPath 格式、轮询间隔、AUTO_RESTART 分层配置、命名空间监听范围这六大根因上。按"看 Pod → 看日志 → 看 status.conditions"的顺序排查,基本都能快速定位。
【免费下载链接】onepassword-operatorThe 1Password Connect Kubernetes Operator provides the ability to integrate Kubernetes Secrets with 1Password. The operator also handles autorestarting deployments when 1Password items are updated.项目地址: https://gitcode.com/gh_mirrors/on/onepassword-operator
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考