☰
使用 Helm 部署 GCP Night King:抢占式实例自动监听与复活服务实战指南
2026/10/7 14:33:57 网站建设 项目流程

【免费下载链接】charts

⚠️(OBSOLETE) Curated applications for Kubernetes

项目地址:https://gitcode.com/gh_mirrors/chart/charts
点击查看免费下载

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 正是利用这一机制实现"复活":

  1. 抢占式实例的关闭脚本向某个 Pub/Sub 主题发布消息(或由 GCP 预抢占通知触发);
  2. Night King 服务在 Kubernetes 集群内监听该 Pub/Sub 订阅上的消息;
  3. 一旦收到预抢占消息,服务在实例被终止后自动重新创建(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.yamlChart 元数据,版本1.0.4,appVersion1.0,标记deprecated: true
values.yaml全部默认值与参数注释
templates/deployment.yamlDeployment 主模板,含条件渲染与命令注入逻辑
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
replicaCountPod 副本数1
resources资源请求与限制nil(不设置)
projectIDGCE 项目 ID(GCE API 使用)必填参数
subscriptionName要监听的 Pub/Sub 订阅名称nil(不设置)
nodeSelectorPod 调度节点标签{}

所有参数均通过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: 128Mi
  • nodeSelector用于将 Pod 调度到带特定标签的节点,默认{}表示不限制。其引用注释指向 Kubernetes 节点选择官方文档。两个参数在模板中均通过toYaml原样渲染(见 deployment.yaml)。

配置如何抵达容器:源码级调用链

以源码为准,配置从 Helm values 到容器进程的完整链路如下:

  1. ConfigMap 承载配置:configmap.yaml 将projectID写入键project.id,将subscriptionName(若设置)写入键subscription.name,ConfigMap 名称由{{ template "gcp-night-king.fullname" . }}-config生成;
  2. 环境变量注入:Deployment 容器内定义PROJECT_ID与可选的SUBSCRIPTION_NAME两个环境变量,取值来源均为configMapKeyRef(引用上述 ConfigMap 的对应键),见 deployment.yaml;
  3. 命令行参数传递:容器启动命令固定为/usr/bin/nightking,随后根据配置追加参数(见 deployment.yaml):
/usr/bin/nightking -project $(PROJECT_ID) [-subscription-name $(SUBSCRIPTION_NAME)]
  1. 命名规则:资源名由 _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

项目地址:https://gitcode.com/gh_mirrors/chart/charts
点击查看免费下载

相关推荐

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询