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.23 normal Addon Ready
-
您还可以检查附加组件的各个部分,以确保Istio Pods已部署。
kubectl get pods -n istio-system
kubectl 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.23.5 sh -
- 导航至 Istio 包目录。
cd istio-1.23.5
- Linux 和 macOS 用户: 将
istioctl
客户机添加到PATH
系统变量。export PATH=$PWD/bin:$PATH
- 标注
default
名称空间以用于自动侧柜注入。 现在,将使用 Envoy 代理侧柜容器自动创建部署到default
的任何新 pod。kubectl label namespace default istio-injection=enabled
- 部署 BookInfo 应用程序、网关和目标规则。
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
- 确保 BookInfo 微服务容器为
Running
。kubectl get pods
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
- 下载最新的Istio软件包,其中包含 BookInfo 应用程序的配置文件。
-
获取公开 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/productpage
Windows
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: 10
kubectl 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
- 将
v2
的weight
更改为0
,将v3
的weight
更改为100
。 - 保存并关闭该文件。
- 编辑
-
请尝试刷新 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 mTLS 文档。
- 创建名为
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 设置。