在 KubeSail 上部署 TandoorRecipes模板化 Kubernetes 安装实战指南【免费下载链接】recipesApplication for managing recipes, planning meals, building shopping lists and much much more!项目地址: https://gitcode.com/GitHub_Trending/re/recipes本指南讲解如何通过 KubeSail 平台一键部署 TandoorRecipes菜谱管理应用KubeSail 提供了可视化界面来安装和管理应用只需加载官方社区维护的 Tandoor 模板并点击 Launch Template即可在任意接入的 Kubernetes 服务器上完成部署。读完本文你将掌握 KubeSail 模板的完整使用流程、模板变量随机密钥的正确配置方式以及该模板背后对应仓库内 Kubernetes 清单docs/install/k8s的架构原理与关键组件便于在需要时排查和定制部署。KubeSail 与 Tandoor 模板简介KubeSail 是一个提供简单 Web 界面用于安装和管理应用的平台支持两种使用方式连接任意运行 Kubernetes 的服务器把你自有的服务器裸金属或云主机接入 KubeSail 集群即可通过其界面管理应用使用预配置的 PiBox购买/使用 PiBox 设备可跳过服务器接入步骤开箱即用。Tandoor 的 KubeSail 模板在仓库的 docs/install/kubesail.md 中有专门文档说明该模板紧密基于官方 Kubernetes 安装配置编写——即 docs/install/k8s 目录下的一组 YAML 清单ConfigMap、Secret、PVC、StatefulSet、Deployment、Service、Ingress。这意味着通过 KubeSail 部署的集群结构与手动kubectl apply部署基本一致只是把手动应用清单封装成了点按钮。⚠️ 需要明确该模板由社区贡献Community Contributed既不受官方支持也不保证会随版本更新或测试。生产使用前请自行评估风险。Tandoor 2 兼容性注意事项在动手部署前务必了解 Tandoor 2 带来的架构变化⚠️Tandoor 2 兼容性警告本模板尚未针对 Tandoor 2 进行验证/测试。Tandoor 2 已在默认 Docker 容器内集成了 nginx 服务并将对外暴露端口从 8080 改为80。这一变化在仓库的 docs/install/docker.md 中有更详细的说明Tandoor 1 vs Tandoor 2 一节Tandoor 1容器内运行 gunicornPython WSGI 服务器默认暴露 8080 端口官方一直建议在其前方再架设 nginx 处理媒体文件mediafilesTandoor 2容器内捆绑了 nginx对外暴露80 端口——媒体文件由 nginx 直接处理其余请求基本转发给 gunicorn。因此在 KubeSail 模板中可以看到 60-service.yaml 同时暴露了 80nginx与 8080gunicorn两个端口Ingress 也分别把/media、/static路由到 80 端口服务其余路径路由到 8080。如果你的 KubeSail 模板默认使用的镜像是 Tandoor 2需要重点确认模板的端口与路径转发是否仍匹配上述新行为。快速开始Quick StartKubeSail 的部署流程非常简短官方文档给出的步骤如下加载模板在 KubeSail 中打开 Tandoor Recipes 模板页面点击Launch Template启动模板确保服务器已接入如果尚未把服务器附加到 KubeSail请先按照 KubeSail 官方文档中Getting a Cluster获取集群章节完成裸金属服务器接入确认模板变量在 Template Variables模板变量区域检查两个输入字段它们默认显示RANDOM(16)详见下文启动确认无误后点击启动等待部署完成即可访问应用。部署完成后首次访问需要进行初始化/注册等常规设置流程仓库模板 templates/setup.html 对应部署引导页面。关键提示模板变量与随机密钥KubeSail 模板的 Template Variables 区域中会看到两个输入字段默认值显示为RANDOM(16)。含义如下这两个字段会在你启动模板时被随机生成并且与你的这次安装一一对应specific to your install如果你希望自己指定可以在启动模板前手动输入自定义值不建议把两个字段都留空或填成固定弱值因为它们对应的是部署所需的敏感凭据。从模板所基于的 Kubernetes 清单 15-secrets.yaml 可以印证这两个字段对应的正是两类密钥模板变量字段推测对应K8s Secret 键用途随机字段 1postgresql-passwordPostgreSQL 应用数据库用户密码POSTGRES_PASSWORD随机字段 2secret-keyDjango 的SECRET_KEY用于会话签名、加密等安全用途15-secrets.yaml 文件头部注释给出了这两类密钥的本地生成方法可作参考# 数据库密码base64 编码 echo -n db-password | base64 # Django SECRET_KEY先对随机串做 sha256 摘要再 base64 编码 echo -n secret-key | sha256sum | awk { printf $1 } | base64模板变量采用RANDOM(16)的语义即每个变量会生成 16 个字符的随机串并写入对应 Secret保证每个实例的凭据彼此隔离、默认不撞车。模板背后的 Kubernetes 架构KubeSail 模板基于 docs/install/k8s 下的 8 个清单文件理解它们就能掌握模板在集群里实际创建了什么。下面按组件逐一拆解。1. 应用前端 Deployment50-deployment.yaml这是 Tandoor 的核心工作负载包含两个容器 一个 init 容器init 容器init-chmod-data以 root 运行先执行数据库迁移与静态文件收集再修正媒体文件权限set -e source venv/bin/activate echo Updating database python manage.py migrate python manage.py collectstatic --noinput echo Setting media file attributes chown -R 65534:65534 /opt/recipes/mediafiles find /opt/recipes/mediafiles -type d | xargs -r chmod 755 find /opt/recipes/mediafiles -type f | xargs -r chmod 644它通过 Secret 引用注入SECRET_KEY与POSTGRES_PASSWORD并固定使用DB_ENGINEdjango.db.backends.postgresql、POSTGRES_HOSTrecipes-postgresql、POSTGRES_PORT5432、POSTGRES_USERpostgres、POSTGRES_DBrecipes。容器recipes-nginx使用nginx:latest镜像暴露 80http与 8080gunicorn两个端口挂载媒体/静态 PVC并将 10-configmap.yaml 中的 nginx 配置以只读方式挂载到/etc/nginx/nginx.conf。注意该模板仍保留了独立的 nginx 容器nginx 同时负责/static/与/media/的 alias 转发client_max_body_size 16M。容器recipes使用vabene1111/recipes镜像直接以 gunicorn 启动 Django 应用recipes.wsgi监听:8080日志级别 INFO并配置了 liveness/readiness 探针HTTP GET/8080 端口每 30 秒检查一次。运行用户为 65534nobody。存储挂载mediafiles与staticfiles均以subPathfiles方式挂载 PVC避免 ext4 文件系统 PVC 中lostfound目录带来的问题清单中有明确注释。策略strategy: Recreate重建式更新replicas: 1。2. 数据库 StatefulSet40-sts-postgresql.yaml数据库使用 Bitnami 的 PostgreSQL 镜像docker.io/bitnami/postgresql:11.5.0-debian-9-r60以 StatefulSet 方式运行通过 Secret 引用注入POSTGRES_PASSWORD键postgresql-password和POSTGRESQL_POSTGRES_PASSWORD键postgresql-postgres-password固定POSTGRES_USERrecipes、POSTGRES_DBrecipes数据目录/bitnami/postgresqlPGDATA指向/bitnami/postgresql/data配置了 liveness 与 readiness 探针pg_isready并检查/opt/bitnami/postgresql/tmp/.initialized初始化标记通过volumeClaimTemplates自动创建 2Gi 数据卷init 容器负责修正数据目录权限chown 1001运行用户为 1001fsGroup: 1001服务账户recipes对应 20-service-account.yaml。数据库对外的访问入口由 45-service-db.yaml 提供ClusterIP 类型 Service名称recipes-postgresql端口 5432selector 为app: recipes, tier: database——这正是前端 Deployment 中POSTGRES_HOSTrecipes-postgresql指向的地址。3. 配置与密钥ConfigMap / Secret10-configmap.yaml名为recipes-nginx-config的 ConfigMap内嵌一段最小 nginx 配置声明client_max_body_size 16M并将/static/、/media/分别 alias 到/static/、/media/15-secrets.yaml名为recipes的 Opaque Secret包含三个键见上文表格模板变量RANDOM(16)启动时即填充到这里。4. 持久化存储30-pvc.yaml两个 PVCrecipes-media与recipes-static均为ReadWriteOnce、各申请1Gi存储标签app: recipes。前端 Deployment 与 nginx 容器共享这两个卷媒体与静态文件也是 Velero 备份注解backup.velero.io/backup-volumes标记的备份对象。5. 服务与入口Service / Ingress60-service.yaml前端 Service选择app: recipes, tier: frontend, environment: production同时暴露80httpnginx与8080gunicorn两个端口70-ingress.yamlIngress 规则默认主机recipes.local路径路由如下路径pathType后端 Service 端口/Prefix8080gunicorn/mediaPrefix80nginx/staticPrefix80nginx文件注释中预留了 TLS 配置示例cert-manager.io/cluster-issuer: letsencrypt-prod与ingress-class: nginx注释以及被注释掉的tls段部署到 KubeSail 后如需启用 HTTPS可按此结构补全证书签发配置。在 KubeSail 上通常由平台侧的 Ingress Controller 与域名管理接管这一层recipes.local这类占位主机名需替换为你实际使用的域名。从 KubeSail 到原生 Kubernetes适用场景小结部署方式适合场景说明KubeSail 模板追求开箱即用、不想手写 YAML社区维护模板逻辑即本文拆解的 k8s 清单原生 k8s 清单docs/install/k8s需要精细控制、自定义 Ingress/TLS8 个文件依次 apply 即可Docker Composedocs/install/docker.md单机/家用场景官方推荐且持续测试的安装方式最后提醒KubeSail 模板是社区贡献且未针对 Tandoor 2 验证。若模板默认镜像已更新到 Tandoor 2容器内建 nginx、对外端口 80请重点核对模板的端口映射与 Ingress 路由是否符合 Tandoor 2 的架构对比 docs/install/k8s/70-ingress.yaml 与 docs/install/docker.md 中 Tandoor 1/2 差异说明。同时模板启动时务必留意两个RANDOM(16)变量是否已正确生成这直接关系到数据库密码与 DjangoSECRET_KEY的强度与唯一性。【免费下载链接】recipesApplication for managing recipes, planning meals, building shopping lists and much much more!项目地址: https://gitcode.com/GitHub_Trending/re/recipes创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考