部署 Bookinfo 应用
目录
Bookinfo 应用概述
要安装 bookinfo 示例应用,主要需要两个步骤:首先部署应用本身,其次设置一个网关以便从集群外部访问。
bookinfo 应用是一个用于探索服务网格功能的工具。它允许您轻松验证浏览器请求是否正确通过网格路由到应用。
bookinfo 应用展示一本书的信息,类似于在线书店目录中的单条目。它显示包含书籍描述、详细信息(如 ISBN 和页数)以及客户评论的页面。
当通过网格暴露时,bookinfo 应用的微服务行为由网格配置控制。评论数据来自三个服务之一:reviews-v1、reviews-v2 或 reviews-v3。如果部署 bookinfo 时未定义 reviews 虚拟服务,网格默认采用轮询策略将请求路由到这些服务。
通过创建 reviews 虚拟服务,您可以定义自定义路由规则。例如,您可以配置网格在用户登录时将请求路由到 reviews-v2 服务,显示带黑色星星的评论;而对于未登录用户,网格则路由到 reviews-v3,显示带红色星星的评论。
更多详情请参阅上游 Istio 文档中的 Bookinfo Application。
部署 Bookinfo 应用
前提条件
- 已安装 Alauda Service Mesh v2 Operator。
- 已部署 Istio CNI。
- 已部署 Istio 控制平面。
操作步骤
-
使用以下命令创建一个名为 bookinfo 的新命名空间:
kubectl create namespace bookinfo
-
为 bookinfo 命名空间启用 sidecar 注入。如果您的环境使用 InPlace 升级策略,运行以下命令:
kubectl label namespace bookinfo istio-injection=enabled
NOTE
如果您使用的是 RevisionBased 升级策略,请执行以下命令:
-
运行以下命令以查找您的 <revision-name>:
kubectl get istiorevisions.sailoperator.io
示例输出:
NAME NAMESPACE PROFILE READY STATUS IN USE VERSION AGE
default istio-system True Healthy True v1.26.3 47h
-
使用修订名称为命名空间打标签以启用 sidecar 注入:
kubectl label namespace bookinfo istio.io/rev=default
-
可选 :如果您已配置 discoverySelectors,请使用以下命令将 Istio discovery selector 应用到 bookinfo 命名空间:
示例 discovery selector 标签:istio-discovery=enabled
kubectl label namespace bookinfo istio-discovery=enabled
-
通过应用 YAML 文件部署 bookinfo 应用,运行以下命令:
kubectl -n bookinfo apply -f https://raw.githubusercontent.com/istio/istio/refs/heads/master/samples/bookinfo/platform/kube/bookinfo.yaml
验证
-
运行以下命令确认 bookinfo 服务可用:
kubectl get services -n bookinfo
示例输出
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
details ClusterIP 10.4.153.200 <none> 9080/TCP 4m44s
productpage ClusterIP 10.4.132.101 <none> 9080/TCP 4m43s
ratings ClusterIP 10.4.76.104 <none> 9080/TCP 4m44s
reviews ClusterIP 10.4.48.38 <none> 9080/TCP 4m44s
-
运行以下命令检查 bookinfo pods 是否可用:
kubectl get pods -n bookinfo
示例输出
NAME READY STATUS RESTARTS AGE
details-v1-c66556f6d-bbqjx 2/2 Running 0 5m56s
productpage-v1-5f568ff46d-r886k 2/2 Running 0 5m56s
ratings-v1-74bcfcb96d-7bm8s 2/2 Running 0 5m56s
reviews-v1-549bfb5f44-xwh4z 2/2 Running 0 5m56s
reviews-v2-6486bc9868-snch4 2/2 Running 0 5m56s
reviews-v3-6c66dc6cdd-87jgd 2/2 Running 0 5m56s
当 Ready 列显示 2/2 时表示代理 sidecar 注入成功。确保每个 pod 的 Status 列均为 Running。
-
通过向 product page 发送请求确认 bookinfo 应用正在运行。执行以下命令:
kubectl exec "$(kubectl get pod -l app=ratings -n bookinfo -o jsonpath='{.items[0].metadata.name}')" -c ratings -n bookinfo -- curl -sS productpage:9080/productpage | grep -o "<title>.*</title>"
示例输出
<title>Simple Bookstore App</title>
通过网关访问 Bookinfo 应用
由于网关不属于控制平面,Alauda Service Mesh v2 Operator 不会部署网关。出于安全考虑,建议将 Ingress 和 Egress 网关部署在与控制平面不同的命名空间中。
部署网关有两种方法:使用 Gateway API 或 网关注入技术。
使用 Istio 网关注入访问 Bookinfo 应用
网关注入技术利用与 Istio sidecar 注入相同的机制。它通过与 Service 资源关联的 Deployment 资源创建网关。该 Service 可暴露到 Alauda 容器平台集群外部。
前提条件
- 已安装 Alauda Service Mesh v2 Operator。
- 已部署 Istio 控制平面。
操作步骤
-
执行以下命令创建 istio-ingressgateway 部署和服务:
kubectl -n bookinfo apply -f https://raw.githubusercontent.com/alauda-mesh/sail-operator/refs/heads/main/chart/samples/ingress-gateway.yaml
-
运行以下命令配置 bookinfo 应用使用新创建的网关:
kubectl -n bookinfo apply -f https://raw.githubusercontent.com/istio/istio/refs/heads/master/samples/bookinfo/networking/bookinfo-gateway.yaml
NOTE
此示例使用一个示例网关配置文件为 bookinfo 应用设置网关注入。该文件必须应用于应用所在的命名空间。
-
可选 :修改 YAML 文件以根据入口流量自动扩缩 Pod。
示例配置
apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
labels:
istio: ingressgateway
release: istio
name: ingressgatewayhpa
namespace: bookinfo
spec:
minReplicas: 2
maxReplicas: 5
metrics:
- resource:
name: cpu
target:
averageUtilization: 80
type: Utilization
type: Resource
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: istio-ingressgateway
- 在此示例中,最大副本数设置为
5,最小为 2。当 CPU 利用率达到 80% 时,会创建新的副本。
-
可选 :定义节点上应运行的最小 Pod 数量。
示例配置
apiVersion: policy/v1
kind: PodDisruptionBudget
metadata:
labels:
istio: ingressgateway
release: istio
name: ingressgatewaypdb
namespace: bookinfo
spec:
minAvailable: 1
selector:
matchLabels:
istio: ingressgateway
- 此示例配置确保如果 Pod 在不同节点重启,至少有一个副本在运行。
验证
您将通过刚刚配置的网关连接到 Bookinfo 的 productpage 服务。要访问网关,需要使用 kubectl port-forward 命令:
kubectl -n bookinfo port-forward svc/istio-ingressgateway 9080:80
- 如果您在本地工作站运行该命令,请在浏览器中打开
http://localhost:9080/productpage。
- 如果您在远程主机上运行该命令并使用了
--address 0.0.0.0,请将 localhost 替换为远程主机的 IP 或主机名(例如 http://<REMOTE_HOST_IP>:9080/productpage)。
多次刷新页面时,您应看到 productpage 中显示不同版本的评论,呈现轮询风格(红星、黑星、无星),因为我们尚未使用 Istio 控制版本路由。
使用 Gateway API 访问 Bookinfo 应用
通过 Kubernetes Gateway API,网关通过创建 Gateway 资源进行部署。
前提条件
- 已安装 Alauda Service Mesh v2 Operator。
- 已部署 Istio 控制平面。
- 您的 Kubernetes 集群支持外部负载均衡器(即类型为
LoadBalancer 的 Service)。
操作步骤
-
通过执行以下命令创建并配置 Gateway 和 HTTPRoute 资源:
kubectl -n bookinfo apply -f https://raw.githubusercontent.com/istio/istio/refs/heads/master/samples/bookinfo/gateway-api/bookinfo-gateway.yaml
NOTE
此示例使用一个示例网关配置文件,通过 Gateway API 为 bookinfo 应用配置网关。该文件必须应用于应用所在的命名空间。
-
运行以下命令确保 Gateway API 服务已就绪并具有地址:
kubectl wait --for=condition=programmed gtw bookinfo-gateway -n bookinfo
-
运行以下命令获取主机地址:
export INGRESS_HOST=$(kubectl get gtw bookinfo-gateway -n bookinfo -o jsonpath='{.status.addresses[0].value}')
-
运行以下命令获取端口:
export INGRESS_PORT=$(kubectl get gtw bookinfo-gateway -n bookinfo -o jsonpath='{.spec.listeners[?(@.name=="http")].port}')
-
运行以下命令获取网关 URL:
export GATEWAY_URL=$INGRESS_HOST:$INGRESS_PORT
-
运行以下命令获取完整的产品页面 URL:
echo "http://${GATEWAY_URL}/productpage"
验证
-
使用 curl 命令确认 productpage 可访问:
curl -s "http://${GATEWAY_URL}/productpage" | grep -o "<title>.*</title>"
示例输出
<title>Simple Bookstore App</title>
-
在浏览器中确认 productpage 可访问。
在浏览器中访问 http://${GATEWAY_URL}/productpage 以查看 Bookinfo 网页。
多次刷新页面时,您应看到 productpage 中显示不同版本的评论,呈现轮询风格(红星、黑星、无星),因为我们尚未使用 Istio 控制版本路由。