Istio 入门
开始使用 IBM Cloud® Kubernetes Service 中的托管 Istio 附加组件。 在这一系列步骤中,您将部署 BookInfo 示例应用程序,以练习使用 Istio 的几种服务网格功能。
开始之前,请查看 Istio 附加组件更改日志,了解版本信息。
步骤 1:启用 Istio 附加组件
在集群中设置受管 Istio 附加组件。
请登录您的账户。 如果适用,请将相应的资源组设定为目标。 设置集群的上下文。
-
启用
istio附加组件。ibmcloud ks cluster addon enable istio --cluster CLUSTER_NAME_OR_ID -
验证受管 Istio 附加组件的状态是否为
Addon Ready。 请注意,准备好附加组件可能需要几分钟时间。ibmcloud ks cluster addon ls --cluster CLUSTER_NAME_OR_ID示例输出
Name Version Health State Health Status istio 1.29 normal Addon Ready -
您还可以查看该附加组件的各个组件,以确保已部署 Istio Pod。
kubectl get pods -n istio-systemkubectl get svc -n istio-system
有关 IBM Cloud Kubernetes Service 中 Istio 的更多信息,请参阅“关于托管 Istio 附加组件”。
步骤 2: 设置 BookInfo 样本应用程序
BookInfo 示例应用程序包括一个基本的 Istio 配置,这样您就可以立即试用 Istio 的功能。
4 个 BookInfo 微服务包括:
productpage- 调用details和reviews微服务来填充页面。details- 包含书籍信息。ratings- 包含伴随书籍评论的书籍排名信息。reviews- 包含书籍评论并调用ratings微服务。reviews微服务具有多个版本:v1不调用ratings微服务。v2调用ratings微服务,并将评级显示为黑色的 1 到 5 颗星。v3调用ratings微服务,并将评级显示为红色的 1 到 5 颗星。
此外,BookInfo 应用程序已由 Istio 网关在公共 IP 地址上公开。 要查看 BookInfo 架构,请查阅 Istio 文档。
-
在集群中安装 BookInfo。
- 下载最新的 Istio 软件包,其中包含 BookInfo 应用的配置文件。
curl -L https://istio.io/downloadIstio | ISTIO_VERSION=1.29.5 sh - ``` 2. 导航至 Istio 包目录。 ```sh {: pre} cd istio-1.29.5 ``` 3. Linux 和 macOS 用户: 将 `istioctl` 客户机添加到 `PATH` 系统变量。 ```sh {: pre} export PATH=$PWD/bin:$PATH ``` 4. 标注 `default` 名称空间以用于自动侧柜注入。 任何部署到 `default` 的新 pod 现在都会自动使用 Envoy proxy sidecar 容器创建。 ```sh {: pre} kubectl label namespace default istio-injection=enabled ``` 5. 部署 BookInfo 应用程序、网关和目标规则。 ```sh {: pre} kubectl apply -f samples/bookinfo/platform/kube/bookinfo.yaml kubectl apply -f samples/bookinfo/networking/bookinfo-gateway.yaml kubectl apply -f samples/bookinfo/networking/destination-rule-all.yaml ``` 6. 请确保 BookInfo 微服务Pod的状态为 `Running`。 ```sh {: pre} kubectl get pods ``` ```sh {: screen} NAME READY STATUS RESTARTS AGE details-v1-6865b9b99d-7v9h8 2/2 Running 0 2m productpage-v1-f8c8fb8-tbsz9 2/2 Running 0 2m ratings-v1-77f657f55d-png6j 2/2 Running 0 2m reviews-v1-6b7f6db5c5-fdmbq 2/2 Running 0 2m reviews-v2-7ff5966b99-zflkv 2/2 Running 0 2m reviews-v3-5df889bcff-nlmjp 2/2 Running 0 2m ``` -
获取公开 BookInfo的
istio-ingressgateway负载均衡器的公共地址。- 经典簇
- 将 Istio 入口 IP 地址设置为环境变量。
export INGRESS_IP=$(kubectl -n istio-system get service istio-ingressgateway -o jsonpath='{.status.loadBalancer.ingress[0].ip}') - 将 Istio 输入端口设置为环境变量。
export INGRESS_PORT=$(kubectl -n istio-system get service istio-ingressgateway -o jsonpath='{.spec.ports[?(@.name=="http2")].port}') - 创建使用 Istio Ingress 主机和端口的
GATEWAY_URL环境变量。export GATEWAY_URL=$INGRESS_IP:$INGRESS_PORT
- 将 Istio 入口 IP 地址设置为环境变量。
- VPC 集群:创建使用 Istio Ingress 主机名的
GATEWAY_URL环境变量。
export GATEWAY_URL=$(kubectl -n istio-system get service istio-ingressgateway -o jsonpath='{.status.loadBalancer.ingress[0].hostname}') ``` - 经典簇
-
对
GATEWAY_URL变量运行 curl,以检查 BookInfo 应用程序是否正在运行。200响应表示 BookInfo 应用程序使用 Istio 正常运行。curl -o /dev/null -s -w "%{http_code}\n" http://${GATEWAY_URL}/productpage -
在浏览器中查看 BookInfo Web 页面。
Mac OS 或 Linux
open http://$GATEWAY_URL/productpageWindows
start http://$GATEWAY_URL/productpage -
尝试多次刷新该页面。 不同版本的评论部分循环使用无星 (
reviews的v1),黑星 (v2) 和红星 (v3)。
有关 Istio 中路由工作原理的更多信息,请参阅 了解发生了什么。
步骤 3: 模拟分阶段推出 BookInfo
要模拟应用程序的发布,可以对 BookInfo 的 reviews 微服务执行分阶段推出 v3。
在完成应用程序测试并准备开始引导实时流量后,您可以通过 Istio 逐步推出应用程序。 例如,您可以先将 v3 发布到 10% 的用户,然后发布到 20% 的用户,依此类推。
-
配置虚拟服务以将 0% 的流量分发到
v1,将 90% 的流量分发到v2,将 10% 的流量分发到v3(共reviews)。apiVersion: networking.istio.io/v1beta1 kind: VirtualService metadata: name: reviews spec: hosts: - reviews http: - route: - destination: host: reviews subset: v1 weight: 0 - destination: host: reviews subset: v2 weight: 90 - destination: host: reviews subset: v3 weight: 10kubectl apply -f <filename>.yaml -
在浏览器中查看 BookInfo 网页,方法是:在 Mac OS 或 Linux 上运行
open http://$GATEWAY_URL/productpage,或在Windows上运行start http://$GATEWAY_URL/productpage。 -
尝试多次刷新该页面。 请注意,不再显示没有星星的页面 (
v1),并且大多数页面刷新将显示黑色星星 (v2)。只有很少显示带有红色星星 (v3) 的页面。 -
更改流量分布,以便仅将所有流量发送到
v3。 请注意,在实际场景中,您可能会通过将流量分布先更改为 80:20,然后更改为 70:30,以此类推,慢慢地推出版本更改,直到所有流量仅路由到最新版本为止。- 编辑
reviews虚拟服务的配置文件。
kubectl edit VirtualService reviews ``` 2. 将 `v2` 的 `weight` 更改为 `0`,将 `v3` 的 `weight` 更改为 `100`。 3. 保存并关闭该文件。 - 编辑
-
请尝试多次刷新 BookInfo 页面。 请注意,不再显示带有黑色星星 (
v2) 的页面,而仅显示带有红色星星 (v3) 的页面。 -
如果已启用特使访问日志: 请验证自您更改复审的 YAML 文件
VirtualService以来的时间内,是否不存在针对v2的请求的日志。kubectl logs -l app=reviews,version=v2 -c istio-proxy
步骤 4: 使用 IBM Cloud Monitoring 监视 BookInfo
使用 Monitoring 预定义的 Istio 仪表板之一来监控 BookInfo 微服务。
要将监视代理程序部署到集群,请完成以下步骤。
-
在 监视控制台中,单击所供应实例的 打开仪表板。
-
在 Monitoring UI 中,单击 添加新仪表板。
-
搜索“
Istio”,然后选择“Monitoring”中预定义的 Istio 仪表板之一。
有关引用指标和仪表板、监控 Istio 内部组件,以及监控 Istio A/B 部署和金丝雀部署的更多信息,请参阅《 如何监控 Istio —— Kubernetes 的服务网格 》博客文章。
步骤 5: 通过启用 mTLS 来保护集群内流量
为命名空间中的工作负载启用加密,以便在群集内部实现相互 TLS ( mTLS )。 在集群中 pod 之间由 Envoy 路由的流量会使用 TLS 进行加密。 mTLS 的证书管理由 Istio 进行处理。 更多信息,请参阅 Istio mutual TLS 文档。
- 创建名为
default.yaml的认证策略文件。 该策略的作用域为命名空间,用于配置服务网格中的工作负载,使其仅接受使用 TLS 加密的请求。 请注意,此处未包含任何targets规范,因为该策略适用于该命名空间中网格内的所有服务。apiVersion: "security.istio.io/v1beta1" kind: "PeerAuthentication" metadata: name: "default" spec: mtls: mode: STRICT - 将认证策略应用于名称空间。
kubectl apply -f default.yaml -n NAMESPACE - 创建一个名为
destination-mtls.yaml的目的地规则文件。 该策略可配置命名空间中的服务网格工作负载使用 TLS 发送流量。 请注意,host: *.local通配符会将此目标规则应用于网中的所有服务。apiVersion: "networking.istio.io/v1beta1" kind: "DestinationRule" metadata: name: "destination-mtls" spec: host: "*.local" trafficPolicy: tls: mode: ISTIO_MUTUAL - 应用目标规则。
kubectl apply -f destination-mtls.yaml -n NAMESPACE - 如果您希望为其他命名空间中的服务网格工作负载实现 mTLS,请在每个命名空间中重复这些步骤。
此外,出于非认证原因(例如,将流量路由到不同版本的服务),也会使用目标规则。 为服务创建的任何目标规则还必须包含设置为 mode: ISTIO_MUTUAL 的相同 TLS 块。 此块会阻止规则覆盖在此部分中配置的网范围的 mTLS 设置。