资讯动态

Knative Serving PHP Hello World 示例:从 index.php 到集群部署的完整实践

发布时间:2026/10/13 12:19:23 来源:尧图企业网站定制
文档教程云原生【免费下载链接】docsUser documentation for Knative components.项目地址https://gitcode.com/gh_mirrors/docs1/docs点击查看免费下载本文以 Knative 官方文档仓库中 code-samples/serving/hello-world/helloworld-php 目录下的 PHP Hello World 示例为主体完整讲解一个读取TARGET环境变量并输出Hello ${TARGET}!的极简 Web 应用如何被打包成容器、构建为多平台镜像并通过kubectl或knCLI 两种途径部署到安装了 Knative Serving 的 Kubernetes 集群。读完后你将掌握 KnativeService资源的结构、容器端口适配机制PORT环境变量、服务 URL 的获取与验证方式以及部署后的清理操作。示例定位与文件构成该 PHP 示例属于 Knative Serving 的 Hello World 系列代码样本与 C#、Go、JavaSpark/Spring、Kotlin、Node.js、Python、Ruby、Scala、Shell 等语言的实现并列用于快速入门 Knative Serving 如何部署应用其定位见 Serving 代码示例索引。仓库中该示例目录包含以下文件均可直接复制使用文件作用index.php应用入口读取TARGET环境变量并输出问候语Dockerfile基于php:7.3-apache的容器镜像定义service.yamlKnativeService资源清单.dockerignore构建上下文排除规则README.md本教程的原始文档开始之前一个已安装 Knative Serving 并配置好 DNS 的 Kubernetes 集群。安装方式可参考仓库中的 YAML 安装 Knative Serving。本地已安装并运行 Docker且已配置好 Docker Hub 账号本示例使用 Docker Hub 作为容器镜像仓库。应用代码一个环境变量的 Hello World整个应用的逻辑只有三行 PHP见 index.php?php $target getenv(TARGET, true) ?: World; echo sprintf(Hello %s!\n, $target); ?逐行解析getenv(TARGET, true)读取容器运行时注入的环境变量TARGET。第二个参数true表示返回空字符串而不是false因此当变量未设置时?:空合并运算符会启用默认值World。sprintf(Hello %s!\n, $target)格式化输出问候语末尾带换行。也就是说TARGET未设置时响应为Hello World!设置为其他值本示例中为PHP Sample v1时响应随之变化。这也是 Knative Hello World 系列的统一约定——通过修改env而非重新写代码即可观察新版本行为便于演示 Revision修订版本机制。Dockerfile适配 Knative 的容器化要点仓库中的 Dockerfile 完整内容如下# Use the official PHP 7.3 image. # https://hub.docker.com/_/php FROM php:7.3-apache # Copy local code to the container image. COPY index.php /var/www/html/ # Use the PORT environment variable in Apache configuration files. RUN sed -i s/80/${PORT}/g /etc/apache2/sites-available/000-default.conf /etc/apache2/ports.conf # Configure PHP for development. # Switch to the production php.ini for production operations. # RUN mv $PHP_INI_DIR/php.ini-production $PHP_INI_DIR/php.ini # https://hub.docker.com/_/php#configuration RUN mv $PHP_INI_DIR/php.ini-development $PHP_INI_DIR/php.ini其中与 Knative 直接相关的关键点是PORT环境变量基础镜像php:7.3-apacheApache 默认监听 80 端口。端口改写RUN sed -i s/80/${PORT}/g ...这一行在镜像构建时把 Apache 的两份配置/etc/apache2/sites-available/000-default.conf与/etc/apache2/ports.conf中硬编码的80全局替换为${PORT}字符串。运行时容器内PORT环境变量生效Apache 便按 Knative 指定的端口监听。之所以要这样做是因为 Knative Serving 会由控制器为每个 Revision 的 Pod 注入PORT环境变量并期望应用监听该端口官方 Serving 文档要求容器内应用可读取PORT来启动。这样应用无需知道具体端口号就能被 Knative 的流量体系Activator/Queue Proxy正确接入。php.ini 选择示例将开发配置php.ini-development切换为当前配置注释中同时给出了生产环境的替代写法php.ini-production。这是一个教学示例生产部署时建议按注释切换为 production 配置。另外仓库中还提供了 .dockerignoreDockerfile README.md vendor其作用是确保本地构建相关的文件不会进入构建上下文从而影响最终部署的容器镜像例如避免把文档或本地依赖目录打进镜像。Knative Service 定义服务清单见 service.yaml需将{username}替换为你的 Docker Hub 用户名apiVersion: serving.knative.dev/v1 kind: Service metadata: name: helloworld-php namespace: default spec: template: spec: containers: - image: docker.io/{username}/helloworld-php env: - name: TARGET value: PHP Sample v1结构说明apiVersion: serving.knative.dev/v1/kind: Service使用 Knative Serving 的v1稳定 API。spec.template.spec这是 Revision 的 Pod 规格模板。按照 Knative Serving 概览中的说明Service资源会为你自动创建并维护配套的 Route路由与 Configuration配置每次Service更新都会派生出一个新的不可变 Revision。image: docker.io/{username}/helloworld-php指向你构建并推送的镜像必须与docker buildx build时的 tag 一致。env中的TARGETPHP Sample v1注入给容器index.php读到后输出Hello PHP Sample v1!。构建并推送多平台镜像在样本目录下或你按上文重建的文件目录中执行以下命令{username}替换为 Docker Hub 用户名# Build and push the container on your local machine. docker buildx build --platform linux/arm64,linux/amd64 -t {username}/helloworld-php --push .说明docker buildx build启用 Buildx 构建器一条命令同时产出linux/arm64Apple Silicon / ARM 服务器与linux/amd64x86 服务器两个平台的镜像保证混合架构集群都能拉取。--push .表示构建完成后直接推送到 Docker Hub不再落盘为本地镜像。构建上下文是当前目录..dockerignore在此处生效。部署应用kubectl 与 kn 两种途径镜像推送完成后可以选择以下任意一种方式部署。途径一kubectl apply基于 service.yamlkubectl apply --filename service.yaml这会按清单创建一个 KnativeService对象TARGET环境变量与镜像地址均以service.yaml为准。途径二kn CLI 一步创建kn service create helloworld-php --imagedocker.io/{username}/helloworld-php --env TARGETPHP Sample v1kn service create会阻塞等待服务就绪并打印服务 URL。典型的输出形态来自原始文档示例Creating service helloworld-php in namespace default: 0.035s The Configuration is still working to reflect the latest desired specification. 0.139s The Route is still working to reflect the latest desired specification. 0.250s Configuration helloworld-php is waiting for a Revision to become ready. 8.040s ... 8.136s Ingress has not yet been reconciled. 8.277s unsuccessfully observed a new generation 8.398s Ready to serve. Service helloworld-php created to latest revision helloworld-php-akhft-1 is available at URL: http://helloworld-php.default.1.2.3.4.xip.io从这段状态输出可以读出 Knative 的就绪顺序Configuration 先收敛Route 随后收敛等待新 Revision 就绪Ingress 完成调谐reconciled后服务进入Ready to serve状态最终给出的 Revision 名形如helloworld-php-akhft-1后缀-1表示该 Configuration 的第一个不可变修订版本。服务创建后 Knative 做了什么服务创建成功后Knative 会执行以下动作与原文档一致为这个版本的创建一个新的不可变 Revision进行网络编程network programming为应用创建 Route、Ingress、Service 与负载均衡器自动对 Pod 进行扩缩容——包括缩容到 0 副本scale to zero。第 3 点是 Knative 相对原生 Deployment 的核心差异之一。关于缩容到零的具体行为仓库文档 Configuring scale to zero 指出该能力仅在默认使用 KnativePodAutoscalerKPA时生效且只能通过全局配置项enable-scale-to-zero控制布尔值默认true不支持按 Revision 单独设置。换言之本示例部署后若一段时间内没有流量副本数会自动降到 0下一次请求会触发从 0 拉起冷启动。获取服务 URL 并验证请求服务创建完成后按所用途径获取 URL。kubectl 方式kubectl get ksvc helloworld-php --outputcustom columnsNAME:.metadata.name,URL:.status.url NAME URL helloworld-php http://helloworld-php.default.1.2.3.4.xip.io这里通过自定义列直接从status.url字段提取访问地址其中1.2.3.4是集群的接入 IP域名遵循 Knative 默认的service.namespace.cluster-domain规则依赖集群 DNS 已正确配置。kn 方式kn service describe helloworld-php -o url示例输出http://helloworld-php.default.1.2.3.4.xip.io发起请求用curl访问上一步返回的 URL替换为你自己的服务 URLcurl http://helloworld-php.default.1.2.3.4.sslip.io Hello PHP Sample v1!响应内容Hello PHP Sample v1!与service.yaml或kn service create中注入的TARGETPHP Sample v1完全对应验证了环境变量确实进入了容器并被index.php读取。清理删除示例部署确认无需保留示例时删除对应的服务记录即可。kubectlkubectl delete --filename service.yamlknkn service delete helloworld-php删除Service后Knative 会级联清理其关联的 Route、Configuration 与 RevisionPod 随之回收。小结与延伸阅读本示例用最小的 PHP 应用串起了 Knative Serving 的完整链路代码TARGET环境变量约定→ 容器PORT适配 多平台 buildx→Service声明template.specenv→ 部署kubectl apply/kn service create→ 验证status.urlcurl→ 清理delete。仓库内可继续深入的文档Knative Serving 概览Service、Route、Configuration、Revision 的关系与常见用例Configuring scale to zeroscale-to-zero 的全局配置项与宽限时间参数Traffic management基于 Revision 的流量切分与蓝绿部署Serving 代码示例索引同系列其他语言的 Hello World 与 Cloud Events 等进阶示例。注意本示例的适用前提php:7.3-apache是较旧的基础镜像版本仓库保留它主要出于示例稳定性考虑如果你的集群架构不同例如仅有特定平台节点docker buildx build的--platform参数应相应调整。赞分享文档教程云原生【免费下载链接】docsUser documentation for Knative components.项目地址https://gitcode.com/gh_mirrors/docs1/docs点击查看免费下载相关推荐Knative Serving 上的 Quarkus Hello World 示例从零创建、镜像构建到集群部署全流程Knative Serving 上的 Quarkus Hello World 示例从零创建、镜像构建到集群部署全流程 本篇技术指南围绕 Knative 官方仓文档教程云原生用 Deno 编写 Hello World 应用并部署到 Knative Serving社区示例完整实战用 Deno 编写 Hello World 应用并部署到 Knative Serving社区示例完整实战 本文基于 Knative 官方文档仓库中的社区示例文档教程云原生基于 Knative Serving 部署 Quarkus Java 服务Hello World 示例全流程实战基于 Knative Serving 部署 Quarkus Java 服务Hello World 示例全流程实战 本示例位于 code samples/co文档教程云原生上一篇Gorilla WebSocket 技术指南RFC 6455 协议实现详解与 Octant 中的实战应用下一篇Nemotron-Labs-Diffusion-14B核心原理详解从扩散语言模型到三模统一架构创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑