离线 Kubernetes 制品与交付 Hands-on
验证:未记录
- 适用版本
- 未记录
- 验证范围
- 尚未登记验证记录。
本文缩写(英文全称与中文含义)
| 缩写 | 英文全称/名称 | 中文含义 |
|---|---|---|
| API | Application Programming Interface | 应用程序编程接口 |
| CA | Certificate Authority | 证书颁发机构 |
| CNI | Container Network Interface | 容器网络接口 |
| CPU | Central Processing Unit | 中央处理器 |
| CRD | Custom Resource Definition | Kubernetes 自定义资源定义 |
| CRI | Container Runtime Interface | 容器运行时接口 |
| CSI | Container Storage Interface | 容器存储接口 |
| DB | Database | 数据库 |
| DNS | Domain Name System | 域名系统 |
| GC | Garbage Collection | 垃圾回收 |
| GitOps | GitOps | 以 Git 保存期望状态、由自动化持续协调实际状态的运维方式 |
| JWKS | JSON Web Key Set | JSON Web 密钥集,常用于验证令牌签名 |
| KMS | Key Management Service | 密钥管理服务 |
| NTP | Network Time Protocol | 网络时间协议 |
| OCI | Open Container Initiative | 开放容器倡议及其镜像/运行时规范 |
| OS | Operating System | 操作系统 |
| PKI | Public Key Infrastructure | 公钥基础设施 |
| SSO | Single Sign-On | 单点登录 |
| TLS | Transport Layer Security | 传输层安全协议 |
场景:联网准备区制作可追溯制品包,经审批导入离线网络;离线集群通过内部 TLS registry/软件源更新。前置:自建集群、企业内部 registry/CA、skopeo/Helm、固定平台版本、签名验证工具。
1. 完整盘点制品#
kubeadm config images list --kubernetes-version "$K8S_VERSION" > control-plane-images.txt
helm template orders ./orders-chart -f staging-values.yaml > orders-rendered.yamlK8S_VERSION 使用精确 v1.N.P;orders-chart 来自真实业务交付仓库。镜像清单还包含 CNI/CSI、pause、DNS、Operator 运行时生成镜像、init/sidecar、Helm hook、Job、监控、备份、诊断及所有目标 CPU 架构。只 grep 渲染清单会漏掉动态镜像。
保存人工复核的 images.tsv,每行两列,以制表符分隔:源 repo@sha256:digest、目标 registry.internal/path:immutable-tag。另外封存 OS 包及依赖、containerd/runc/CNI binaries、Chart/CRD、CA、签名/attestation、漏洞 DB 和许可文件。
2. 联网准备与搬运#
在可同时访问两区受控中转 registry 的路径复制;真正物理隔离时使用经过检查的 OCI archive 介质导入。以下保存为 export-bundle.sh,在 Bash 中执行;任何镜像失败都中止,不生成“完成”的映射/校验清单:
set -euo pipefail
test ! -e bundle
mkdir -p bundle/images
while IFS=$'\t' read -r source_ref target_ref; do
test -n "$source_ref" && test -n "$target_ref" || exit 1
archive_id=$(printf '%s' "$source_ref" | shasum -a 256 | awk '{print $1}')
skopeo copy --all --preserve-digests "docker://$source_ref" "oci-archive:bundle/images/$archive_id.tar"
printf '%s\t%s\t%s\n' "$archive_id" "$source_ref" "$target_ref"
done < images.tsv > bundle/image-map.tsv
(cd bundle && shasum -a 256 image-map.tsv images/*.tar) > bundle/SHA256SUMS成功退出后,把 SHA256SUMS 按企业制品签名流程签名并经审批搬运整个 bundle;校验用的签名公钥通过独立可信渠道分发。映射文件也纳入签名保护,防止目标仓库被篡改。失败包不可搬运,重新执行前使用新空目录,避免遗留上次制品。镜像 archive 通常不自动包含 registry 中全部签名/referrer;另导出签名与 attestation,导入后再次执行实际验签,不能只凭 digest 相同宣称签名可用。
3. 离线导入#
先验证企业签名成功,再在 bundle 所在父目录执行以下 import-bundle.sh;校验失败必须停住,不能继续导入:
set -euo pipefail
(cd bundle && shasum -a 256 -c SHA256SUMS)
while IFS=$'\t' read -r archive_id source_ref target_ref; do
skopeo copy --all --preserve-digests "oci-archive:bundle/images/$archive_id.tar" "docker://$target_ref"
skopeo inspect "docker://$target_ref" --format '{{.Digest}}'
done < bundle/image-map.tsv逐项对照源 digest、平台架构和签名。registry 用 TLS,给节点、containerd、Helm、GitOps、webhook 都配置可信 CA;不使用全局 insecure_skip_verify。credentials 由节点凭据机制/Secret 管理,不写在映射表里。
4. 配置离线安装来源#
kubeadm 的 imageRepository 会影响镜像路径,特别是 CoreDNS。先对离线 kubeadm 配置执行 kubeadm config images list --config kubeadm.yaml,按其输出建立准确仓库映射,再执行 images pull;不能只替换 registry 域名猜路径。CRI sandbox image 配置也必须指向内部 pause 镜像。
Chart 打包保存到内部 OCI;把 values 中全部镜像来源改为内部仓库并固定 digest。Operator 的默认镜像通过其配置显式改写;证书签发/SSO/JWKS、DNS、时间同步、KMS、备份、扫描数据库更新同样需要离线路径。
5. 断外网验收与回退#
- 网络团队在隔离环境阻断外网,保留内部 DNS/NTP/registry/PKI;监测拒绝流量。
- 使用新节点/空缓存环境安装/扩容,避免旧镜像缓存掩盖缺项。
- 创建/更新真实业务,触发 hook、证书续期、备份恢复、Operator 子资源创建。
- 重建一个节点,确认所有镜像仍可拉取,离线验签成功;记录耗时和缺失访问。
- 保留上一完整 bundle、Chart/CRD 与镜像,按数据兼容性回退,不只缓存一个 API 镜像。
删除旧制品前检查所有集群与回滚窗口引用;registry GC 与保留策略需要独立验收。