Helm Charts 实战:使用 stable/ghost Chart 在 Kubernetes 上部署 Ghost 博客平台

发布时间:2026/10/8 7:05:30
Helm Charts 实战:使用 stable/ghost Chart 在 Kubernetes 上部署 Ghost 博客平台
【免费下载链接】charts⚠️(OBSOLETE) Curated applications for Kubernetes项目地址https://gitcode.com/gh_mirrors/chart/charts点击查看免费下载Ghost 是当前最灵活的开源内容管理系统之一本指南围绕 Kubernetes 官方 Charts 仓库中的stable/ghostHelm Chart当前版本 9.1.13应用版本 3.9.0展开完整讲解其在 Kubernetes 集群上的安装、卸载、参数配置、外部数据库接入、持久化与升级流程。读完本文你将掌握该 Chart 的全部可配置项及其底层模板实现原理能够独立完成一次可生产化的 Ghost 博客部署并理解向 Bitnami 仓库迁移的正确路径。一、Chart 概览Ghost、MariaDB 与弃用说明stable/ghostChart 使用 Helm 包管理器在 Kubernetes 集群上启动一个 Ghost 部署。它同时打包了 Bitnami MariaDB Chart子依赖用于满足 Ghost 应用的数据库需求——也就是说默认安装时会一并创建 MariaDB 数据库实例无需你额外准备数据库。该 Chart 由 Bitnami 维护曾在 Helm 官方stable仓库中长期更新。需要注意当前 Chart 已被标记为弃用deprecated这一点在 Chart.yaml 中有明确声明deprecated: true安装后的 NOTES.txt 提示信息也会在首屏输出弃用与迁移说明。由于stable仓库整体进入弃用时间线Bitnami 维护的 Ghost Helm Chart 已迁移至bitnami/charts安装方式与当前 Chart 几乎一致只是把stable/chart换成bitnami/chart$ helm repo add bitnami https://charts.bitnami.com/bitnami $ helm install my-release bitnami/ghost # Helm 3 $ helm install --name my-release bitnami/ghost # Helm 2如果已经存在基于stable仓库的部署需要迁移到 bitnami 仓库时可以执行$ helm repo add bitnami https://charts.bitnami.com/bitnami $ helm upgrade my-release bitnami/ghost说明Chart 相关的 Issue 与 PR 已转移至bitnami/charts本文以当前仓库内的stable/ghost版本为事实依据展开讲解其参数与模板结构对迁移后的 Bitnami Chart 同样具有参考价值。二、前置条件安装本 Chart 前需要确认集群满足以下条件Kubernetes 1.12Helm 2.11 或 Helm 3.0-beta3底层基础设施支持 PVPersistent Volume供应若要对 Deployment 进行水平扩容需要 ReadWriteMany 卷支持此外从 requirements.yaml 可以看到 Chart 声明了一个mariadb依赖版本7.x.xcondition: mariadb.enabledHelm 安装时会自动解析该子依赖。三、安装与卸载3.1 安装以 release 名称my-release安装 Chart$ helm install my-release stable/ghost该命令会以默认配置将 Ghost 部署到 Kubernetes 集群中。参数总览一节列出了安装过程中可以自定义的全部参数。提示使用helm list可以查看当前所有 release。3.2 卸载卸载/删除my-release部署$ helm delete my-release该命令会移除 Chart 关联的所有 Kubernetes 组件并删除该 release。注意卸载操作默认会保留 PVCPersistentVolumeClaim如需彻底清理数据卷需另行处理。四、参数总览与默认值下表完整列出 Ghost Chart 的可配置参数及其默认值与 README.md 保持一致ParameterDescriptionDefaultglobal.imageRegistry全局 Docker 镜像仓库nilglobal.imagePullSecrets全局 Docker 镜像仓库 Secret 名称数组[]不给 Pod 添加 image pull secretsglobal.storageClass动态供应使用的全局存储类nilimage.registryGhost 镜像仓库docker.ioimage.repositoryGhost 镜像名bitnami/ghostimage.tagGhost 镜像标签{TAG_NAME}当前 values.yaml 中为3.9.0-debian-10-r0image.pullPolicy镜像拉取策略IfNotPresentimage.pullSecretsdocker-registry Secret 名称数组[]nameOverride部分覆盖ghost.fullname模板会保留 release 名前缀nilfullnameOverride完全覆盖ghost.fullname模板nilvolumePermissions.image.registry卷权限 init 容器镜像仓库docker.iovolumePermissions.image.repository卷权限 init 容器镜像名bitnami/minidebvolumePermissions.image.tag卷权限 init 容器镜像标签bustervolumePermissions.image.pullPolicy卷权限 init 容器镜像拉取策略AlwaysghostHostGhost 主机名用于生成应用 URLnilghostPort应用 URL 使用的端口为nil时默认取service.portnilghostProtocol应用 URL 使用的协议http 或 httpshttpghostPath应用 URL 使用的路径nilghostUsername应用用户userexample.comghostPassword应用密码随机生成ghostEmail管理员邮箱userexample.comghostBlogTitleGhost 博客名称Users BlogsmtpHostSMTP 主机nilsmtpPortSMTP 端口nilsmtpUserSMTP 用户nilsmtpPasswordSMTP 密码nilsmtpFromAddressSMTP 发件地址nilsmtpServiceSMTP 服务nilallowEmptyPassword是否允许数据库空密码yeslivenessProbe.enabled是否启用存活探针truelivenessProbe.initialDelaySeconds存活探针初始延迟秒120livenessProbe.periodSeconds存活探针执行周期秒3livenessProbe.timeoutSeconds存活探针超时秒5livenessProbe.failureThreshold判定失败所需的最小连续失败次数6livenessProbe.successThreshold判定成功所需的最小连续成功次数1readinessProbe.enabled是否启用就绪探针truereadinessProbe.initialDelaySeconds就绪探针初始延迟秒30readinessProbe.periodSeconds就绪探针执行周期秒3readinessProbe.timeoutSeconds就绪探针超时秒5readinessProbe.failureThreshold判定失败所需的最小连续失败次数6readinessProbe.successThreshold判定成功所需的最小连续成功次数1securityContext.enabled是否启用安全上下文truesecurityContext.fsGroup容器的组 ID1001securityContext.runAsUser容器的用户 ID1001service.typeKubernetes Service 类型LoadBalancerservice.portService HTTP 端口80service.nodePorts.httpKubernetes http 节点端口service.externalTrafficPolicy是否保留客户端源 IPClusterservice.loadBalancerIPGhost Service 的 LoadBalancerIPservice.annotationsService 注解ingress.enabled是否启用 Ingress 资源falseingress.annotationsIngress 注解[]ingress.certManager是否为 cert-manager 添加注解falseingress.hosts[0].nameGhost 安装的主机名ghost.localingress.hosts[0].pathURL 结构中的路径/ingress.hosts[0].tls是否在 Ingress 中启用 TLS 后端falseingress.hosts[0].tlsHostsIngress 记录的 TLS 主机数组为nil时默认取ingress.hosts[0].namenilingress.hosts[0].tlsSecretTLS Secret证书ghost.local-tls-secretingress.secrets[0].nameTLS Secret 名称nilingress.secrets[0].certificateTLS Secret 证书nilingress.secrets[0].keyTLS Secret 密钥nilexternalDatabase.host外部数据库主机localhostexternalDatabase.port外部数据库端口3306externalDatabase.user外部数据库已有用户名bn_ghostexternalDatabase.password上述用户的密码externalDatabase.database已有数据库名bitnami_ghostmariadb.enabled是否安装 MariaDB使用外部数据库时设为 falsetruemariadb.rootUser.passwordMariaDB 管理员密码nilmariadb.db.name要创建的 MariaDB 数据库名bitnami_ghostmariadb.db.user要创建的 MariaDB 数据库用户bn_ghostmariadb.db.password数据库用户密码随机 10 位字母数字字符串persistence.enabled是否使用 PVC 启用持久化truepersistence.storageClassGhost 卷的 PVC 存储类nil使用 alpha 存储注解persistence.accessModeGhost 卷的 PVC 访问模式ReadWriteOncepersistence.sizeGhost 卷的 PVC 存储请求8Gipersistence.path卷挂载路径供其他镜像使用/bitnamiresourcesCPU/内存资源请求与限制Memory:512MiCPU:300mnodeSelectorPod 调度的节点选择器{}affinity节点/Pod 亲和性映射{}注意上述参数映射到 bitnami/ghost 镜像中定义的环境变量。另外对比 README 与当前 values.yaml有两处细微差异值得留意就绪探针在 values.yaml 中的实际默认值为periodSeconds: 5、timeoutSeconds: 3image.tag的实际默认值为3.9.0-debian-10-r0。以 values.yaml 为准进行覆写最稳妥。4.1 两个必须注意的运维要点必须设置ghostHost要保证 Ghost 应用功能正常应通过ghostHost参数指定 FQDN推荐或 Ghost Service 的公网 IP。这一要求在 NOTES.txt 中有硬性校验如果安装时没有提供可解析的主机安装输出会给出 ERROR 提示并引导你完成helm upgrade补全配置。预留固定 IP可选可以通过ghostLoadBalancerIP参数为 Ghost Service 分配保留 IP但该特性仅对少数云厂商可用例如 GKE。在 GKE 上预留公网 IP 的方式$ gcloud compute addresses create ghost-public-ip将预留的 IP 地址作为ghostLoadBalancerIP参数的值传给helm install即可完成绑定。4.2 通过 --set 指定参数使用helm install的--set keyvalue[,keyvalue]参数可以覆盖任意配置项。例如$ helm install my-release \ --set ghostUsernameadmin,ghostPasswordpassword,mariadb.mariadbRootPasswordsecretpassword \ stable/ghost以上命令将 Ghost 管理员账号的用户名和密码分别设置为admin和password同时把 MariaDBroot用户的密码设置为secretpassword。4.3 通过 YAML 文件指定参数也可以编写一个 YAML 文件例如 values.yaml 的副本来批量覆写参数$ helm install my-release -f values.yaml stable/ghost提示可以直接使用 Chart 自带的 values.yaml 作为默认值参照在其基础上修改后传入。另外仓库中还提供了 values.schema.json它为ghostUsername、ghostPassword、ghostHost、persistence.size、mariadb、externalDatabase、resources等字段声明了 JSON Schema 约束包括表单渲染、滑块范围等元数据这是为了配合 Kubeapps 等 Helm UI 工具生成可视化部署表单——这也印证了该 Chart 支持通过 Kubeapps 进行部署与管理。五、镜像标签策略滚动标签Rolling Tags与不可变标签Immutable Tags在生产环境中强烈建议使用不可变标签。滚动标签如latest、不带具体修订号的版本标签存在一个隐患如果同一标签被更新为不同的镜像你的部署会在不通知的情况下随之自动变化。Bitnami 会在主容器发布新版本、出现重大变更或发现严重漏洞时发布新 Chart 并同步更新容器镜像。从 NOTES.txt 的模板逻辑可以看到Chart 安装后会自动检测image.tag是否为滚动标签通过正则-r\d$|sha256:判断是否带修订号如果是则输出 WARNING 提示用户避免在生产环境使用滚动标签。因此请务必为image.tag指定类似3.9.0-debian-10-r0这样带修订号的不可变标签。六、使用外部数据库有时你可能希望 Ghost 连接集群外的数据库而不是在集群内安装一个例如使用云厂商的托管数据库服务或为所有应用统一使用一台数据库服务器。为此Chart 允许通过externalDatabase参数指定外部数据库凭据同时用mariadb.enabled选项关闭内置 MariaDB。例如使用以下参数mariadb.enabledfalse externalDatabase.hostmyexternalhost externalDatabase.usermyuser externalDatabase.passwordmypassword externalDatabase.databasemydatabase从 deployment.yaml 的模板逻辑可以看到这一机制的实现细节当mariadb.enabled为true时MARIADB_HOST、MARIADB_PORT_NUMBER、GHOST_DATABASE_NAME、GHOST_DATABASE_USER分别取自 mariadb 子 Chart 的 Service 名称与mariadb.db.*配置GHOST_DATABASE_PASSWORD则通过secretKeyRef从 mariadb 的 Secretmariadb-password中引用当mariadb.enabled为false时这五个环境变量全部改取externalDatabase.*的值。也就是说values.yaml 中externalDatabase段的所有字段只在mariadb.enabledfalse时生效。七、持久化Bitnami Ghost 镜像将 Ghost 的数据与配置存放在容器内/bitnami/ghost和/bitnami/apache路径下。Chart 使用 PersistentVolumeClaimPVC保证数据在多次部署间不丢失该方案已确认可在 GCE、AWS 和 minikube 上工作。通过 pvc.yaml 模板可以看到PVC 使用persistence.accessMode默认ReadWriteOnce与persistence.size默认8Gi创建并通过ghost.storageClasshelper见 _helpers.tpl处理存储类当global.storageClass或persistence.storageClass定义时写入storageClassName值为-时写入空的storageClassName禁用动态供应未定义时交由集群默认 provisioner 决定AWS 为 gp2、GKE 等为 standard。需要说明的细节是模板中的 deployment.yaml 将 PVC 挂载到/bitnami/ghost而persistence.path默认/bitnami主要用于卷权限 init 容器——当securityContext.enabled为false时Chart 会注入名为volume-permissions的 init 容器执行chmod -R grwX {{ .Values.persistence.path }}来修正持久卷挂载点的组写权限确保非 root 用户1001可正常读写。若想禁用持久化可将persistence.enabled设为false此时 deployment.yaml 会改用emptyDir卷。八、升级指南8.1 升级到 9.0.0Helm 会基于对象的 GroupVersionKindGVK即 groupapps、versionv1、kindDeployment进行查找。从 Kubernetes 的角度看变更 GVK 属于兼容性破坏行为因此无法对这类对象进行原地的 in-place 升级。早期版本的 Helm 3 在执行该查找时存在缺陷现已修复以符合规范。在 9.0.0 版本中Deployment 资源的apiVersion更新为apps/v1顺应旧 API 的弃用导致兼容性破坏因此以主版本号标记这一变更。从 _helpers.tpl 可以看到当前模板会依据集群版本动态选择 Deployment 的 apiVersionKubernetes 低于 1.14 时使用extensions/v1beta1否则使用apps/v1。8.2 升级到 5.0.0从 5.0.0 之前的版本升级时若不修改 Chart 的 Deployment 标签则不保证向后兼容。以下示例假定 release 名为ghost可按此规避操作$ kubectl patch deployment ghost-ghost --typejson -p[{op: remove, path: /spec/selector/matchLabels/chart}] $ kubectl delete statefulset ghost-mariadb --cascadefalse九、源码级解析values 如何变成 Ghost 的运行环境理解 Chart 的模板实现有助于你更精确地预测配置项带来的效果。以下要点均可在仓库对应模板中验证1. Secret 与密码生成secrets.yaml 会创建一个Opaque类型的 Secret其中ghost-password在用户未设置ghostPassword时由randAlphaNum 10生成 10 位随机字母数字密码与 README 表格一致若配置了smtpPassword还会额外生成smtp-password。最终密码由 deployment.yaml 通过secretKeyRef注入GHOST_PASSWORD环境变量。2. 主机名逻辑deployment.yaml 的最外层是一个关键条件——只有include ghost.host的结果非空时才会渲染 Deployment。ghost.hosthelper见 _helpers.tpl的规则为设置ghostHost时返回ghostHost ghostPath未设置时Service 类型为ClusterIP则返回127.0.0.1否则返回service.loadBalancerIP默认空字符串。由此可以推断当使用 LoadBalancer 且既未设置ghostHost也未指定loadBalancerIP时Deployment 不会渲染安装输出会提示 ERROR 并给出补全命令——这正是 README 强调必须设置ghostHost的底层原因。3. 应用环境变量deployment.yaml 注入的完整环境变量包括ALLOW_EMPTY_PASSWORD、MARIADB_HOST、MARIADB_PORT_NUMBER、GHOST_DATABASE_NAME、GHOST_DATABASE_USER、GHOST_DATABASE_PASSWORD、GHOST_HOST、GHOST_PROTOCOL、GHOST_PORT_NUMBER未设置ghostPort时取service.port、GHOST_USERNAME、GHOST_PASSWORD、GHOST_EMAIL、BLOG_TITLE以及按条件注入的SMTP_HOST/SMTP_PORT/SMTP_USER/SMTP_PASSWORD/SMTP_FROM_ADDRESS/SMTP_SERVICE。容器监听端口为 2368containerPort: http这与镜像内置的 Ghost 默认端口一致。4. 探针与健康检查存活/就绪探针均通过httpGet请求ghostPath指向的路径并附带Host请求头取ghost.host的值当ghostProtocol为https时还会追加X-Forwarded-Proto: https头。这意味着探针探测的是 Ghost 应用本身而非裸端口配置ghostHost后探针才能正确命中应用。5. Service 与 Ingresssvc.yaml 按service.type生成 ServiceLoadBalancer/NodePort 类型时会带上externalTrafficPolicy默认ClusterLoadBalancer 类型支持loadBalancerIPNodePort 类型在设置service.nodePorts.http后写入nodePort。ingress.yaml 在ingress.enabledtrue时生成 IngresscertManager为 true 时自动添加kubernetes.io/tls-acme: true注解每个 host 可独立启用 TLS 并指定tlsSecret未指定tlsHosts时默认使用 host 名本身。6. 安装完成后的使用指引NOTES.txt 会根据 Service 类型输出访问方式——LoadBalancer 会提示通过kubectl get svc ... -w等待外部 IP 就绪NodePort 会输出节点 IP 与端口ClusterIP 会给出kubectl port-forward命令同时会输出获取登录密码的命令从 Secret 中 base64 解码ghost-password。博客后台地址通常为根路径下的/ghost。十、小结stable/ghost是一个结构清晰、可配置性强的 Helm Chart默认自带 MariaDB 子依赖与 PVC 持久化开箱即用同时通过externalDatabase、ingress、smtp、resources、nodeSelector/affinity等参数支持生产级定制。需要特别记住的三个关键点是安装时必须提供ghostHost或预留的 LoadBalancer IP、生产环境使用不可变镜像标签、该 Chart 已弃用新部署建议直接使用bitnami/ghost。对于希望深入理解 Helm Chart 模板设计的读者deployment.yaml、_helpers.tpl、secrets.yaml 与 values.yaml 是很好的阅读起点。赞分享【免费下载链接】charts⚠️(OBSOLETE) Curated applications for Kubernetes项目地址https://gitcode.com/gh_mirrors/chart/charts点击查看免费下载相关推荐Kubernetes 部署 Ghost 博客实战Bitnami Ghost Helm Chart 完整配置与源码级解析Kubernetes 部署 Ghost 博客实战Bitnami Ghost Helm Chart 完整配置与源码级解析 本文以 Bitnami Ghost H云原生容器编排使用 Helm Chart 在 Kubernetes 上部署多角色 Elasticsearch 集群stable/elasticsearch 实战指南使用 Helm Chart 在 Kubernetes 上部署多角色 Elasticsearch 集群stable/elasticsearch 实战指南 本文以在 Kubernetes 上部署 IPFShelm/charts 仓库 stable/ipfs Chart 完整实战指南在 Kubernetes 上部署 IPFShelm/charts 仓库 stable/ipfs Chart 完整实战指南 本指南以 helm/charts 仓创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考