
Istio Helloworld 示例服务完整实践指南版本路由、金丝雀发布、网关与自动扩缩容【免费下载链接】istioConnect, secure, control, and observe services.项目地址: https://gitcode.com/GitHub_Trending/is/istio本指南围绕 Istio 仓库中 samples/helloworld/README.md 展开系统讲解如何在网格内部署一个包含两个版本的 helloworld 示例服务并通过它实践基于版本的流量路由、结合 HPA 的金丝雀发布、Ingress 网关暴露与压测观察等场景。读完本文你将能够独立复现从部署、配置网关到触发自动扩缩容的完整闭环并为后续学习 DestinationRule、VirtualService、Gateway API 等流量管理机制提供可直接运行的最小实验载体。服务概述返回版本 实例的探针式测试服务helloworld 是 Istio 官方为验证流量管理能力提供的最小化示例服务。它只对外暴露一个简单的 HTTP 接口调用时返回当前处理请求的版本号和实例标识Pod hostname。这一点在源码 samples/helloworld/src/app.py 中体现得非常直观app.route(/hello) def hello(): version os.environ.get(SERVICE_VERSION) # do some cpu intensive computation x 0.0001 for i in range(0, 1000000): x x math.sqrt(x) return Hello version: %s, instance: %s\n % (version, os.environ.get(HOSTNAME))可以看到服务实现有两个关键设计版本号来自环境变量SERVICE_VERSION镜像内应用本身不含版本概念版本完全由部署清单注入因此可以通过不同 Deployment 指定同一镜像、不同环境变量从而模拟同一服务的多版本共存每次请求会执行约一百万次math.sqrt的 CPU 密集计算人为制造可观的 CPU 消耗这正是后面结合 HPA 演示流量上升 → CPU 上升 → 自动扩容所必需的普通 hello world 太轻量几乎无法触发扩缩容。除此之外应用还提供/health探针端点返回Helloworld is healthy并在src/Dockerfile与 samples/helloworld/src/requirements.txt 中声明了 Flask 等运行依赖便于自行构建镜像验证。一个典型的返回结果形如Hello version: v1, instance: helloworld-v1-6d77f5c6d9-xxxxx由于返回内容中带 Pod hostname当存在多个副本、多个版本时就能通过返回结果直接判断某次请求实际命中了哪个 Pod这是用眼睛观察流量分发的基础也正是它适合做版本路由实验的原因。部署 helloworld两种方式部署前需确认集群已开启自动注入 SidecarAutomatic Sidecar Injection。如果未开启需按 Istio 官方说明为 Pod 手工注入 istio-proxy。README 中的命令均以此为前提。方式一一次性部署 v1、v2 两个版本直接应用仓库中的完整清单 samples/helloworld/helloworld.yamlkubectl apply -f helloworld.yaml该清单依次包含三个 Kubernetes 对象用---分隔其结构与标签是理解后续一切流量的关键Service helloworld将端口5000端口名为http暴露给集群selector 为app: helloworld即同时覆盖 v1、v2 两个版本的 Pod是所有版本共享的稳定访问入口Deployment helloworld-v1带标签app: helloworld、version: v1镜像为registry.istio.io/release/examples-helloworld-v1:1.0Deployment helloworld-v2带标签version: v2镜像为registry.istio.io/release/examples-helloworld-v2:1.0。值得注意的是两个 Deployment 都在容器资源上声明了requests.cpu: 100m。这是后文自动扩缩容能否工作的前提——Kubernetes HPA 只有当 Pod 中所有容器都设置了 CPU request 时才会采集 CPU 使用率而注入的 istio-proxy 侧车容器同样带 CPU request因此该示例天然具备被 HPA 托管的条件。方式二按需分别部署 Service 与各版本如果希望先只跑一个版本或在 v1/v2 之间灵活切换可以先只创建 Service再单独部署某个版本# 仅创建 Service通过标签选择器只匹配 servicehelloworld 的对象 kubectl apply -f helloworld.yaml -l servicehelloworld # 分别部署 v1、v2或二者都部署 kubectl apply -f helloworld.yaml -l versionv1 kubectl apply -f helloworld.yaml -l versionv2这里的技巧是kubectl apply -l只应用清单中标签匹配指定 key/value 的对象。由于清单里Service带service: helloworld标签、各Deployment带version: vX标签配合-l即可做到对单个对象的精细化应用。验证部署kubectl get pods -l apphelloworld kubectl get svc helloworld两个版本各 1 个副本replicas: 1就绪后可进入任一网格内 Pod 验证服务可达kubectl exec -it 任意带 sidecar 的 pod -- curl helloworld:5000/hello由于目前未配置任何路由规则istio-proxy 会对 v1/v2 两个端点做默认轮询负载均衡连续请求即可交替看到version: v1与version: v2的输出——这是观察后续版本路由 / 权重路由生效的基线行为。使用 gen-helloworld.sh 生成自定义版本清单仓库提供了可编程生成清单的脚本 samples/helloworld/gen-helloworld.sh用于按需拼装 YAML。脚本支持以下参数参数默认值说明-h,--help—打印用法信息--versionv1指定 helloworld 服务返回的版本号--includeServicetrue为true时在 YAML 中包含 Service 对象--includeDeploymenttrue为true时在 YAML 中包含 Deployment 对象从源码看脚本内部逻辑是把SERVICE_VERSION注入到 Deployment 的环境变量SERVICE_VERSION中见 gen-helloworld.sh并把 Deployment 命名为helloworld-${SERVICE_VERSION}、打上version: ${SERVICE_VERSION}标签最后根据两个布尔开关拼接输出。这意味着该脚本不只适用于 v1/v2你可以生成任意命名的版本参与路由实验# 生成一个返回 customversion 的版本清单并直接应用 ./gen-helloworld.sh --version customversion | kubectl apply -f -通过--includeService false还可以只输出 Deployment 部分用于向已有Service helloworld追加新版本。通过 Ingress 网关暴露 helloworld要让集群外部访问/hello需要创建 Istio 流量入口。仓库提供了经典 Istio 配置模型下的网关清单 samples/helloworld/helloworld-gateway.yamlkubectl apply -f helloworld-gateway.yaml该清单包含两个对象核心内容如下。Gateway helloworld-gateway通过 selectoristio: ingressgateway绑定到默认的 Istio ingress 控制器开放 80 端口、协议 HTTPhosts 为*apiVersion: networking.istio.io/v1 kind: Gateway metadata: name: helloworld-gateway spec: selector: istio: ingressgateway # 使用 istio 默认控制器 servers: - port: number: 80 name: http protocol: HTTP hosts: - *VirtualService helloworld声明gateways: [helloworld-gateway]表示该路由规则属于上述网关对uri.exact: /hello的精确路径匹配请求转发到destination.host: helloworld的5000端口apiVersion: networking.istio.io/v1 kind: VirtualService metadata: name: helloworld spec: hosts: - * gateways: - helloworld-gateway http: - match: - uri: exact: /hello route: - destination: host: helloworld port: number: 5000确定对外访问地址并验证需要按 Istio 官方 Ingress 控制说明先探测并导出INGRESS_HOST与INGRESS_PORT环境变量对应istio-ingressgateway的 LoadBalancer IP / EXTERNAL-IP 及其 80 端口映射在本地 kind 等环境常用localhost/NodePort随后访问export GATEWAY_URL$INGRESS_HOST:$INGRESS_PORT curl http://$GATEWAY_URL/hello由于此时没有配置任何按版本的路由istio-proxy 会对 v1/v2 两个子集做负载均衡多次请求会看到 v1、v2 交替返回Hello version: v1, instance: helloworld-v1-xxxxxxxxxx-xxxxx Hello version: v2, instance: helloworld-v2-xxxxxxxxxx-xxxxx备选改用 Kubernetes Gateway API 配置入口README 明确指出Istio 计划在未来让 Kubernetes Gateway API 的步骤操作其要点如下安装 Gateway API CRD多数集群默认未安装kubectl get crd gateways.gateway.networking.k8s.io || \ { kubectl kustomize github.com/kubernetes-sigs/gateway-api/config/crd?refv0.5.0 | kubectl apply -f -; }创建Gateway资源注意与 IstioGateway不同KubernetesGateway默认会同时部署关联控制器并等待就绪、导出地址kubectl apply -f ./helloworld-gateway.yaml kubectl wait --forconditionready gtw helloworld-gateway export INGRESS_HOST$(kubectl get gtw helloworld-gateway -o jsonpath{.status.addresses[*].value})默认均匀分流验证未配置路由规则前连续请求约一半由 v1、一半由 v2 处理for run in {1..10}; do curl http://$INGRESS_HOST/hello; done权重路由Gateway API 要求为后端版本分别声明 Service与 Istio API 用 DestinationRule subsets 的方式不同因此先应用 helloworld-versions.yaml创建helloworld-v1、helloworld-v2两个 Service再应用 helloworld-route.yaml将流量按weight: 90 / weight: 10分配给 v1/v2kubectl apply -f ./helloworld-versions.yaml kubectl apply -f ./helloworld-route.yaml再次执行循环 curl约 10 次中 9 次命中 v1、1 次命中 v2即完成一次基于 Gateway API 的加权版本路由金丝雀式演示。两种 API 模型的实验价值不同经典Gateway VirtualService反映 Istio 传统流量模型Gateway API HTTPRoute则面向社区标准演进方向二者可并行学习、互为对照。结合金丝雀发布与 HPA 自动扩缩容README 特别说明本服务还用于演示金丝雀发布与自动扩缩容协同工作的场景。其逻辑链条是金丝雀版本如 v2接收少量真实流量 → 若伴随 HPA流量增加带动 CPU 上升 → 该版本副本数自动扩展从而在真实负载下验证新版本稳定性而不至于瞬间放大故障影响半径。前置条件容器必须声明 CPU requestKubernetes Horizontal Pod Autoscaler 只在 Pod 的所有容器都设置 CPU request时才会采集其 CPU 使用率。README 强调在 helloworld.yaml 中业务容器已配置requests.cpu: 100m注入的 istio-proxy 容器也自带 CPU request因此 helloworld 已为自动扩缩容做好准备这也解释了为何 src/app.py 内置了 CPU 密集计算逻辑——没有足够的 CPU 消耗HPA 很难有触发机会。为两个版本分别启用 HPAkubectl autoscale deployment helloworld-v1 --cpu-percent50 --min1 --max10 kubectl autoscale deployment helloworld-v2 --cpu-percent50 --min1 --max10 kubectl get hpa参数含义当平均 CPU 使用率超过目标值 50% 时扩容副本数维持在min1到max10之间。kubectl get hpa可看到两个 HPA 对象的目标与当前状态。制造压力仓库提供无限压测脚本 samples/helloworld/loadgen.sh它实际上是一个死循环持续向网关地址发起请求while true; do curl -s -o /dev/null http://$GATEWAY_URL/hello; done因此压测前务必先按上文完成GATEWAY_URL的导出。运行两个进程即可产生可观负载./loadgen.sh ./loadgen.sh # 运行两次以产生更多负载观察扩容结果等待约 2 分钟后再次查看 HPAkubectl get hpa若自动扩缩容工作正常REPLICAS列的值应大于 1初始值为 1。每个被扩容出的新 Pod 同样会注入 sidecar 并纳入流量调度请求命中分布也会随之从单一 hostname 扩展为多个 hostname可通过多次curl http://$GATEWAY_URL/hello观察到不同 instance 的出现。清理资源实验结束后按序删除资源避免残留网关与 HPA 干扰后续实验kubectl delete -f helloworld.yaml kubectl delete -f helloworld-gateway.yaml kubectl delete hpa helloworld-v1 helloworld-v2若曾使用 Gateway API 路径做实验还应追加清理对应资源kubectl delete -f samples/helloworld/gateway-api/helloworld-gateway.yaml kubectl delete -f samples/helloworld/gateway-api/helloworld-versions.yaml仓库内的配套资源一览samples/helloworld/helloworld.yamlService v1/v2 Deployment 的完整清单本指南主部署文件samples/helloworld/helloworld-dual-stack.yaml采用ipFamilyPolicy: RequireDualStack、ipFamilies: [IPv6, IPv4]的 IPv4/IPv6 双栈版本清单适用于双栈集群场景samples/helloworld/helloworld-gateway.yaml经典 IstioGatewayVirtualService入口配置samples/helloworld/gateway-api/Kubernetes Gateway API 路线下完整的网关、路由与版本服务清单及配套说明samples/helloworld/gen-helloworld.sh可编程生成任意版本清单的脚本samples/helloworld/loadgen.sh为自动扩缩容制造流量的无限循环压测脚本samples/helloworld/src/示例服务的 Python/Flask 源码与 Dockerfile用于理解接口行为或自行构建镜像。小结本示例能帮你验证什么把上文链路串联起来helloworld 实际覆盖了 Istio 新手进阶的核心验证点多版本共存与默认负载均衡同 Service 下 v1/v2 通过version标签区分无路由时流量在版本间轮询分发版本路由 / 金丝雀发布在经典VirtualService或 Gateway APIHTTPRoute上按权重分流为金丝雀发布提供真实流量验证载体Ingress 网关两种模型对照istio-ingressgateway VirtualService与Kubernetes Gateway HTTPRoute两种入口配置方式可相互印证HPA 与负载观察通过内置 CPU 消耗逻辑与 loadgen 压测验证 Kubernetes HPA 在 sidecar 场景下同样能正常工作。对于希望继续深入版本路由细节如 DestinationRule 子集划分、基于 Header 的精细化匹配、渐进式发布策略的读者本示例是最适合作为起点的一个最小、可重复、结果可肉眼观测的实验对象。【免费下载链接】istioConnect, secure, control, and observe services.项目地址: https://gitcode.com/GitHub_Trending/is/istio创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考