入门

    完成下面步骤需要你有一个 cluster, 且运行着兼容版本的 Kubernetes (1.21, 1.22, 1.23, 1.24)。 你可以使用任何受支持的平台,例如: Minikube 或 章节中指定的其他平台。

    请按照以下步骤开始使用 Istio:

    1. 下载并安装 Istio
    2. 对外开放应用程序
    1. 转到 Istio 发布 页面,下载针对你操作系统的安装文件, 或用自动化工具下载并提取最新版本(Linux 或 macOS):

      上面的命令下载最新版本(用数值表示)的 Istio。 你可以给命令行传递变量,用来下载指定的、不同处理器体系的版本。 例如,下载 x86_64 架构的、1.6.8 版本的 Istio ,运行:

    2. 转到 Istio 包目录。例如,如果包是 istio-1.14.1

      1. $ cd istio-1.14.1

      安装目录包含:

      • samples/ 目录下的示例应用程序
      • bin/ 目录下的 客户端二进制文件 .
    3. istioctl 客户端加入搜索路径(Linux or macOS):

      1. $ export PATH=$PWD/bin:$PATH

    安装 Istio

    1. 对于本次安装,我们采用 demo 。 选择它是因为它包含了一组专为测试准备的功能集合,另外还有用于生产或性能测试的配置组合。

      如果你的平台有供应商提供的配置组合,比如:Openshift,则在下面命令中替换掉 demo 配置项。更多细节请参阅你的 平台说明

      1. $ istioctl install --set profile=demo -y
      2. Istio core installed
      3. Istiod installed
      4. Egress gateways installed
      5. Ingress gateways installed
      6. Installation complete
    2. 给命名空间添加标签,指示 Istio 在部署应用的时候,自动注入 Envoy 边车代理:

      1. $ kubectl label namespace default istio-injection=enabled
      2. namespace/default labeled
    1. 部署 :

      Zip

      1. $ kubectl apply -f @samples/bookinfo/platform/kube/bookinfo.yaml@
      2. service/details created
      3. serviceaccount/bookinfo-details created
      4. deployment.apps/details-v1 created
      5. service/ratings created
      6. serviceaccount/bookinfo-ratings created
      7. deployment.apps/ratings-v1 created
      8. service/reviews created
      9. deployment.apps/reviews-v1 created
      10. deployment.apps/reviews-v2 created
      11. deployment.apps/reviews-v3 created
      12. service/productpage created
      13. serviceaccount/bookinfo-productpage created
      14. deployment.apps/productpage-v1 created
    2. 应用很快会启动起来。当每个 Pod 准备就绪时,Istio 边车代理将伴随它们一起部署。

      1. $ kubectl get services
      2. NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
      3. details ClusterIP 10.0.0.212 <none> 9080/TCP 29s
      4. productpage ClusterIP 10.0.0.57 <none> 9080/TCP 28s
      5. ratings ClusterIP 10.0.0.33 <none> 9080/TCP 29s
      6. reviews ClusterIP 10.0.0.28 <none> 9080/TCP 29s

      1. $ kubectl get pods
      2. NAME READY STATUS RESTARTS AGE
      3. details-v1-558b8b4b76-2llld 2/2 Running 0 2m41s
      4. productpage-v1-6987489c74-lpkgl 2/2 Running 0 2m40s
      5. ratings-v1-7dc98c7588-vzftc 2/2 Running 0 2m41s
      6. reviews-v1-7f99cc4496-gdxfn 2/2 Running 0 2m41s
      7. reviews-v2-7d79d5bd5d-8zzqd 2/2 Running 0 2m41s
      8. reviews-v3-7dbcdcbc56-m8dph 2/2 Running 0 2m41s

      重新运行前面的命令,在执行下面步骤之前,要等待并确保所有的 Pod 达到此状态: 就绪状态(READY)的值为 2/2 、状态(STATUS)的值为 Running 。 基于你平台的不同,这个操作过程可能会花费几分钟的时间。

    3. 验证方方面面均工作无误。运行下面命令,通过检查返回的页面标题,来验证应用是否已在集群中运行,并已提供网页服务:

      1. $ kubectl exec "$(kubectl get pod -l app=ratings -o jsonpath='{.items[0].metadata.name}')" -c ratings -- curl -s productpage:9080/productpage | grep -o "<title>.*</title>"
      2. <title>Simple Bookstore App</title>

    对外开放应用程序

    此时,BookInfo 应用已经部署,但还不能被外界访问。 要开放访问,你需要创建 Istio 入站网关(Ingress Gateway), 它会在网格边缘把一个路径映射到路由。

    1. 把应用关联到 Istio 网关:

      1. $ kubectl apply -f @samples/bookinfo/networking/bookinfo-gateway.yaml@
      2. gateway.networking.istio.io/bookinfo-gateway created
      3. virtualservice.networking.istio.io/bookinfo created
    2. 确保配置文件没有问题:

    设置入站端口:

    1. $ export INGRESS_PORT=$(kubectl -n istio-system get service istio-ingressgateway -o jsonpath='{.spec.ports[?(@.name=="http2")].nodePort}')
    2. $ export SECURE_INGRESS_PORT=$(kubectl -n istio-system get service istio-ingressgateway -o jsonpath='{.spec.ports[?(@.name=="https")].nodePort}')

    确认端口被成功的赋值给了每一个环境变量:

    1. $ echo "$INGRESS_PORT"
    2. 32194
    1. $ echo "$SECURE_INGRESS_PORT"
    2. 31632

    设置入站 IP:

    1. $ export INGRESS_HOST=$(minikube ip)

    确认 IP 地址被成功的赋值给了环境变量:

    1. $ echo "$INGRESS_HOST"
    2. 192.168.4.102

    在一个新的终端窗口中执行此命令,启动一个 Minikube 隧道,它将把流量发送到你的 Istio 入站网关:

    1. $ minikube tunnel

    执行下面命令以判断你的 Kubernetes 集群环境是否支持外部负载均衡:

    1. $ kubectl get svc istio-ingressgateway -n istio-system
    2. istio-ingressgateway LoadBalancer 172.21.109.129 130.211.10.121 80:31380/TCP,443:31390/TCP,31400:31400/TCP 17h

    设置 EXTERNAL-IP 的值之后, 你的环境就有了一个外部的负载均衡,可以用它做入站网关。 但如果 的值为 <none> (或者一直是 <pending> 状态), 则你的环境则没有提供可作为入站流量网关的外部负载均衡。 在这个情况下,你还可以用服务(Service)的 节点端口 访问网关。

    依据你的环境,选择相应的说明:

    如果你确定你的环境中确实存在外部的负载均衡,请跟随下面的说明.

    设置入站 IP 地址和端口

    1. $ export INGRESS_HOST=$(kubectl -n istio-system get service istio-ingressgateway -o jsonpath='{.status.loadBalancer.ingress[0].ip}')
    2. $ export INGRESS_PORT=$(kubectl -n istio-system get service istio-ingressgateway -o jsonpath='{.spec.ports[?(@.name=="http2")].port}')
    3. $ export SECURE_INGRESS_PORT=$(kubectl -n istio-system get service istio-ingressgateway -o jsonpath='{.spec.ports[?(@.name=="https")].port}')

    在某些环境中,负载均衡可能使用主机名访问,而不是 IP 地址。 在这种情况下,入站流量网关的EXTERNAL-IP 值不是 IP 地址,而是一个主机名, 那上面设置 INGRESS_HOST 环境变量的操作会失败。 使用下面命令纠正 INGRESS_HOST 的值。

    1. $ export INGRESS_HOST=$(kubectl -n istio-system get service istio-ingressgateway -o jsonpath='{.status.loadBalancer.ingress[0].hostname}')

    按照下面说明:如果你的环境中没有外部负载均衡,那就选择一个节点端口来代替.

    设置入站的端口:

    1. $ export INGRESS_PORT=$(kubectl -n istio-system get service istio-ingressgateway -o jsonpath='{.spec.ports[?(@.name=="http2")].nodePort}')
    2. $ export SECURE_INGRESS_PORT=$(kubectl -n istio-system get service istio-ingressgateway -o jsonpath='{.spec.ports[?(@.name=="https")].nodePort}')

    GKE:

    你需要创建一个防火墙规则,放行发往 ingressgateway 的 TCP 流量。 运行下面的命令,单独放行发往 HTTP 端口或 HTTPS 端口的流量,或者都放行。

    1. $ gcloud compute firewall-rules create allow-gateway-http --allow "tcp:$INGRESS_PORT"
    2. $ gcloud compute firewall-rules create allow-gateway-https --allow "tcp:$SECURE_INGRESS_PORT"

    IBM Cloud Kubernetes Service:

    1. $ ibmcloud ks workers --cluster cluster-name-or-id
    2. $ export INGRESS_HOST=public-IP-of-one-of-the-worker-nodes

    Docker For Desktop:

    1. $ export INGRESS_HOST=127.0.0.1

    Other environments:

    1. $ export INGRESS_HOST=$(kubectl get po -l istio=ingressgateway -n istio-system -o jsonpath='{.items[0].status.hostIP}')
    1. 设置环境变量 GATEWAY_URL:

      1. $ export GATEWAY_URL=$INGRESS_HOST:$INGRESS_PORT
    2. 确保 IP 地址和端口均成功的赋值给了环境变量:

      1. $ echo "$GATEWAY_URL"
      2. 192.168.99.100:32194

    验证外部访问

    1. 运行下面命令,获取 Bookinfo 应用的外部访问地址。

      1. $ echo "http://$GATEWAY_URL/productpage"
    2. 把上面命令的输出地址复制粘贴到浏览器并访问,确认 Bookinfo 应用的产品页面是否可以打开。

    Istio 和几个遥测应用做了集成。 遥测能帮你了解服务网格的结构、展示网络的拓扑结构、分析网格的健康状态。

    使用下面说明部署 仪表板、 以及 Prometheus、 、 还有 Jaeger

    1. 安装 ,等待部署完成。

      1. $ kubectl apply -f samples/addons
      2. $ kubectl rollout status deployment/kiali -n istio-system
      3. Waiting for deployment "kiali" rollout to finish: 0 of 1 updated replicas are available...
      4. deployment "kiali" successfully rolled out

      如果在安装插件时出错,再运行一次命令。 有一些和时间相关的问题,再运行就能解决。

    2. 访问 Kiali 仪表板。

      1. $ istioctl dashboard kiali
    3. 在左侧的导航菜单,选择 Graph ,然后在 Namespace 下拉列表中,选择 default

      Kiali 仪表板展示了网格的概览、以及 Bookinfo 示例应用的各个服务之间的关系。 它还提供过滤器来可视化流量的流动。

      Kiali Dashboard

    后续步骤

    恭喜你完成了评估安装!

    对于新手来说,这些任务是非常好的资源,可以借助 demo 安装更深入评估 Istio 的特性:

    在你为了生产系统定制Istio之前,参阅这些资源:

    我们欢迎您加入 , 提出问题,并给我们以反馈。

    卸载

    删除 Bookinfo 示例应用和配置, 参阅 .

    Istio 卸载程序按照层次结构逐级的从 istio-system 命令空间中删除 RBAC 权限和所有资源。对于不存在的资源报错,可以安全的忽略掉,毕竟他们已经被分层的删除了。

    Zip

    1. $ kubectl delete -f @samples/addons@

    命名空间 默认情况下并不会被删除。 不需要的时候,使用下面命令删掉它:

    指示 Istio 自动注入 Envoy 边车代理的标签默认也不删除。 不需要的时候,使用下面命令删掉它。

    1. $ kubectl label namespace default istio-injection-