【免费下载链接】charts
⚠️(OBSOLETE) Curated applications for Kubernetes
GCP Night King 是一个运行在 Kubernetes 集群中的服务,它通过订阅 GCP Pub/Sub 消息,监听抢占式(Preemptible)虚拟机实例的预抢占通知,并在实例被终止后自动重新创建(复活)它们。本指南以当前仓库中的stable/gcp-night-kingHelm Chart 为对象,完整讲解该 Chart 的安装、卸载、全部可配置参数及其底层模板实现,帮助你快速掌握如何在 GCP 环境下搭建抢占式实例的自动恢复能力。
GCP Night King 解决什么问题
在 Google Cloud Platform 中,抢占式实例(Preemptible VM)价格低廉但随时可能被系统回收。GCP 会在实例被抢占前约 30 秒发出预警,抢占式实例还可以配置关闭脚本(shutdown script)在被终止前完成状态清理或信号上报。GCP Night King 正是利用这一机制实现"复活":
- 抢占式实例的关闭脚本向某个 Pub/Sub 主题发布消息(或由 GCP 预抢占通知触发);
- Night King 服务在 Kubernetes 集群内监听该 Pub/Sub 订阅上的消息;
- 一旦收到预抢占消息,服务在实例被终止后自动重新创建(resurrect)该实例,实现无人值守的恢复。
根据原文档的 Chart Details 说明,本 Chart 会安装一个 K8s Deployment,该 Deployment 监听 Pub/Sub 订阅上的实例预抢占消息,并在被抢占实例终止后将其复活。该服务对应的上游实现为gcp-go-night-king(Go 语言版本),镜像发布在itamarost/gcp-night-king。
注意:本仓库已于 2020 年 11 月 13 日归档,所有 Chart 不再更新;且该 Chart 自身也标注为 deprecated(已弃用)。本文内容以当前仓库实际文件为准,适用于理解实现原理与历史部署方式。
Chart 文件结构与渲染流程
Chart 位于 stable/gcp-night-king,包含以下关键文件:
| 文件 | 作用 |
|---|---|
| Chart.yaml | Chart 元数据,版本1.0.4,appVersion1.0,标记deprecated: true |
| values.yaml | 全部默认值与参数注释 |
| templates/deployment.yaml | Deployment 主模板,含条件渲染与命令注入逻辑 |
| templates/configmap.yaml | 存放project.id与可选subscription.name的配置字典 |
| templates/_helpers.tpl | 资源命名辅助函数 |
| templates/NOTES.txt | 安装后的提示信息与未配置校验提示 |
整个 Chart 的配置流是:用户在helm install时通过--set传入projectID和subscriptionName→ 模板渲染阶段把这两个值写入 ConfigMap → Deployment 中容器通过configMapKeyRef以环境变量方式读取 → 再作为命令行参数传给/usr/bin/nightking进程。
快速安装(TL;DR)
最简安装只需提供 GCP 项目 ID,可直接通过gcloud命令动态获取:
$ helm install stable/gcp-night-king --set projectID=$( gcloud config get-value project )指定发布名称(release name)安装:
$ helm install --name my-release stable/gcp-night-king建议同时指定订阅名称,让服务监听你预先创建好的 Pub/Sub 订阅:
$ helm install --name my-release stable/gcp-night-king \ --set projectID=my-gcp-project \ --set subscriptionName=my-preemption-subscription配置参数详解
原文档的参数表完整如下,默认值均可在 values.yaml 中找到对应定义:
| 参数 | 描述 | 默认值 |
|---|---|---|
image.pullPolicy | 镜像拉取策略 | IfNotPresent |
image.repository | 容器镜像仓库 | itamarost/gcp-night-king |
image.tag | 镜像标签 | v1-golang |
replicaCount | Pod 副本数 | 1 |
resources | 资源请求与限制 | nil(不设置) |
projectID | GCE 项目 ID(GCE API 使用) | 必填参数 |
subscriptionName | 要监听的 Pub/Sub 订阅名称 | nil(不设置) |
nodeSelector | Pod 调度节点标签 | {} |
所有参数均通过helm install的--set key=value[,key=value]方式指定。
projectID:唯一的必填参数
projectID是本 Chart 中唯一强制要求的参数。在 values.yaml 中其默认值被设为占位字符串"MUST PROVIDE PROJECT ID",配合模板实现了一套"缺参保护"机制:
- 在 templates/deployment.yaml 首行,模板会判断
projectID是否仍为占位符:{{- if ne (printf "%s" .Values.projectID) "MUST PROVIDE PROJECT ID" }}。若用户没有传入真实项目 ID,整个 Deployment不会被渲染; - 同时 NOTES.txt 会检测到同样条件,并向用户输出错误提示,告知需要通过
helm upgrade补充参数:
$ helm upgrade my-release stable/gcp-night-king \ --set projectID=YOUR_PROJECT_ID也就是说,忘记传projectID时helm install本身不会失败,但集群中不会创建任何 Deployment,必须留意安装后的提示信息。
subscriptionName:可选参数与条件注入
subscriptionName是可选项。模板中对它做了两处条件判断(见 deployment.yaml 与 configmap.yaml):
- 仅在设置了该值的情况下,ConfigMap 才写入
subscription.name键; - 仅在设置了该值的情况下,容器启动命令才追加
-subscription-name参数,环境变量SUBSCRIPTION_NAME才会被注入。
不设置时,服务将使用默认订阅(NOTES.txt 中明确提示 "on the default subscription")。
镜像与副本参数
image.repository、image.tag、image.pullPolicy三者共同决定容器镜像来源与拉取策略,最终在 Deployment 模板中拼接为"{{ .Values.image.repository }}:{{ .Values.image.tag }}",并设置对应的imagePullPolicy。默认镜像itamarost/gcp-night-king:v1-golang即 Go 语言实现的 Night King 服务。replicaCount直接对应 Deployment 的spec.replicas,默认单副本即可满足监听任务需要。
resources 与 nodeSelector
resources默认不设置任何请求与限制。values.yaml 中的注释建议:通常不推荐强制指定默认资源,而是留给用户自行决定,这样有助于 Chart 运行在 Minikube 等资源受限环境。需要时可按注释模板取消注释并填写:
resources: limits: cpu: 100m memory: 128Mi requests: cpu: 100m memory: 128MinodeSelector用于将 Pod 调度到带特定标签的节点,默认{}表示不限制。其引用注释指向 Kubernetes 节点选择官方文档。两个参数在模板中均通过toYaml原样渲染(见 deployment.yaml)。
配置如何抵达容器:源码级调用链
以源码为准,配置从 Helm values 到容器进程的完整链路如下:
- ConfigMap 承载配置:configmap.yaml 将
projectID写入键project.id,将subscriptionName(若设置)写入键subscription.name,ConfigMap 名称由{{ template "gcp-night-king.fullname" . }}-config生成; - 环境变量注入:Deployment 容器内定义
PROJECT_ID与可选的SUBSCRIPTION_NAME两个环境变量,取值来源均为configMapKeyRef(引用上述 ConfigMap 的对应键),见 deployment.yaml; - 命令行参数传递:容器启动命令固定为
/usr/bin/nightking,随后根据配置追加参数(见 deployment.yaml):
/usr/bin/nightking -project $(PROJECT_ID) [-subscription-name $(SUBSCRIPTION_NAME)]- 命名规则:资源名由 _helpers.tpl 中的
gcp-night-king.name(Chart 名称,支持nameOverride覆盖)与gcp-night-king.fullname(Release.Name-Chart.Name拼接,截断至 63 字符)两个模板函数生成。
此外,Deployment 的 Pod 模板还带有checksum/config注解(见 deployment.yaml),其值是对 ConfigMap 渲染结果的 SHA-256 摘要。这意味着当你通过helm upgrade修改projectID或subscriptionName后,ConfigMap 内容变化会触发该注解变更,从而自动滚动更新 Pod,无需手动重启。
安装后的验证与配套配置
安装成功后,NOTES.txt 会输出服务的监听状态信息。若已设置订阅名称,提示为 "listening for Pub/Sub pre-emption messages on subscription {名称} in GCP project {项目ID}"。
请注意,Night King 服务只是"复活"链路中的接收端,要让整个方案真正生效,还需要在可复活的抢占式实例上配置关闭脚本(shutdown script),使其在被抢占时向 Night King 所监听的 Pub/Sub 订阅发送消息。此部分属于上游项目gcp-go-night-king的部署职责,与本 Chart 互补(NOTES.txt 中同样引用了这一配置步骤)。
使用kubectl可确认资源状态:
$ kubectl get deployment,configmap -l app=gcp-night-king卸载 Chart
卸载即删除该 release 对应的全部 Kubernetes 资源:
$ helm delete my-release该命令会移除 Chart 关联的所有 Kubernetes 组件并删除该 release。
升级与变更参数
若安装时遗漏projectID(或需要调整订阅名称、镜像版本等),可使用helm upgrade补充/修改参数:
$ helm upgrade my-release stable/gcp-night-king \ --set projectID=new-project-id \ --set subscriptionName=new-subscription-name由于 Deployment 带checksum/config注解,上述变更会自动触发 Pod 滚动更新,使新配置生效。
注意事项与局限性
- Chart 已弃用:Chart.yaml 中
deprecated: true,且所在仓库整体已归档(截至 2020-11-13),后续不再维护更新,生产环境使用前需自行评估; - 旧版 API:Deployment 模板使用
apps/v1beta1(见 deployment.yaml),该 API 版本在较新的 Kubernetes 集群中已不可用,若需在新集群部署,应先将 API 迁移为apps/v1并补充spec.selector字段; - 强制参数校验方式:
projectID的校验依赖占位符字符串比对,若显式传入"MUST PROVIDE PROJECT ID"这一字面值,也会被当作未配置处理; - 无 Service 与 Ingress:本 Chart 只创建 Deployment 与 ConfigMap(加 NOTES.txt),服务作为后台监听进程运行,不对外暴露端口,这是其设计使然,并非缺漏。
小结
stable/gcp-night-king是一个结构精简、职责单一的 Helm Chart:它把 GCP Night King 服务封装为 Kubernetes Deployment,通过 ConfigMap + 环境变量 + 命令行参数的三级传递完成配置注入,并以占位符比对的方式实现必填参数校验与条件渲染。掌握其安装命令、参数表与模板机制后,你可以快速在 GCP 集群中搭建抢占式实例的自动复活能力,也可以以此为参照理解类似"监听云平台事件并驱动资源自愈"类服务的 Helm 封装模式。
【免费下载链接】charts
⚠️(OBSOLETE) Curated applications for Kubernetes
相关推荐
Langflow GCP 实战:使用 Spot 抢占式实例在 Google Cloud 上部署 Langflow
Langflow GCP 实战:使用 Spot 抢占式实例在 Google Cloud 上部署 Langflow 本篇技术指南基于 Langflow 仓库中 s
人工智能大模型AI AgentRAG后端前端MCP 服务工作流自动化Ventoy多系统启动U盘指南,快速上手一次安装启动任意镜像
Ventoy多系统启动U盘指南,快速上手一次安装启动任意镜像 3个系统ISO、1根U盘、0次格式化,这就是 Ventoy 多系统启动U盘的工作方式:装一次引导框
操作系统固件开发工具Amphion云服务部署:AWS与GCP实践指南
Amphion云服务部署:AWS与GCP实践指南 引言:语音生成的云端挑战与解决方案 你是否正面临语音合成模型部署的困境?本地服务器算力不足、多用户并发访问响应
音频语音媒体生成深度学习
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考