本文环境为Mac,其中 Docker Desktop中安装的k8s集群环境的版本为v1.19.7istio v1.8.1

Istio下载安装

进入Istio发布页面,下载版本istio-1.8.1-osx.tar.gz,然后解压到/usr/local/istio-1.8.1,可以看到下面包含bin及samples文件夹,bin里包含istioctl命令,samples里包含Istio自带的样例应用的部署配置。
istio-tree

样例演示

选择profile=demo,安装命令如下:
istioctl install --set profile=demo -y

1
2
3
4
5
6
7
#会看到如下输出
...
✔ Istio core installed
✔ Istiod installed
✔ Egress gateways installed
✔ Ingress gateways installed
✔ Installation complete

稍等片刻之后,等重要组件Istiod, Ingress Gateway, Egress Gateway都安装完成了。可以发现,其将上述组件安装到了istio-system这个namespace下。

1
2
3
4
5
6
7
8
9
$ kubectl get pods -n istio-system                                                           ✔  00:26:42
NAME READY STATUS RESTARTS AGE
grafana-784c89f4cf-99bbj 1/1 Running 0 17m
istio-egressgateway-d84f95b69-fkp76 1/1 Running 0 56m
istio-ingressgateway-75f6d79f48-sfqbz 1/1 Running 0 56m
istiod-c9f6864c4-zlmcg 1/1 Running 0 61m
jaeger-7f78b6fb65-hbhl5 1/1 Running 0 17m
kiali-7476977cf9-xc7ld 1/1 Running 0 17m
prometheus-7bfddb8dbf-9gnzl 2/2 Running 0 17m

Bookinfo样例应用部署

新建一个专门用来演示的namespace istio-demo,且标记该namespace使用istio自动注入。

1
2
$ kubectl create namespace istio-demo
$ kubectl label namespace istio-demo istio-injection=enabled

粗略看下Bookinfo的几个模块

1
2
3
4
5
6
7
8
$ cd /usr/local/istio-1.8.1
$ tree -L 1 samples/bookinfo/src

.
├── productpage // Bookinfo的页面入口,前后台一体,JavaScript + Python实现
├── details // 图书详情后台服务,Ruby实现
├── reviews // 图书评价后台服务,Java实现,采用Liberty部署
└── ratings // 图书评价等级后台服务,nodejs编写,数据库采用mysql或mongodb

下面,使用Istio samples文件夹下自带的配置部署Bookinfo应用:

1
2
3
4
5
6
7
8
$ cd /usr/local/istio-1.8.1
$ kubectl apply -n istio-demo -f samples/bookinfo/platform/kube/bookinfo.yaml

...
deployment.apps/reviews-v1 created
deployment.apps/reviews-v2 created
deployment.apps/reviews-v3 created
...

Bookinfo样例应用访问

查看deploymentspods,发现Bookinfo的各个组件已部署完成:

1
2
3
4
5
6
7
8
kubectl get pods -n istio-demo     ✔  00:14:09
NAME READY STATUS RESTARTS AGE
details-v1-79c697d759-fwshg 2/2 Running 0 37m
productpage-v1-65576bb7bf-r7mhk 2/2 Running 0 37m
ratings-v1-7d99676f7f-x4vkn 2/2 Running 0 37m
reviews-v1-987d495c-xc46x 2/2 Running 0 37m
reviews-v2-6c5bf657cf-crsk7 2/2 Running 0 37m
reviews-v3-5f7b9f4f77-nlr7x 2/2 Running 0 37m

下面我们试着在ratings容器里访问Bookinfo的入口页面productpage
执行命令时,需指定容器为ratingscurl请求productpage,发现页面标题已可正常显示。

1
2
3
kubectl exec ratings-v1-7d99676f7f-x4vkn -c ratings -n istio-demo -- curl -s productpage:9080/productpage | grep -o "<title>.*</title>"

<title>Simple Bookstore App</title>

下面看一下该应用如何在集群外部进行访问。涉及到通过配置Istio的Ingress Gateway,从而将流量打到productpage。同样,需要执行下samples文件夹下自带的配置文件。
$ kubectl apply -n istio-demo -f samples/bookinfo/networking/bookinfo-gateway.yaml
然后查看下Ingress Gatewayip及端口。

1
2
3
4
kubectl get service istio-ingressgateway -n istio-system                                   ✔  00:33:07

NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
istio-ingressgateway LoadBalancer 10.111.191.125 localhost 15021:31510/TCP,80:32735/TCP,443:32455/TCP,31400:31626/TCP,15443:32135/TCP 64m

对于本文所采用的Docker Desktop K8s本地部署环境来说,外部IP就是localhost。采用http://localhost/productpage即可访问Bookinfoproductpage页面。
bookinfo

Istio Dashboard安装

安装一下Istio的几个插件,初步体验里边的一些功能。

1
2
3
4
5
6
7
8
$ cd /usr/local/istio-1.8.1
$ kubectl apply -f samples/addons

...
deployment.apps/kiali created
deployment.apps/prometheus created
deployment.apps/jaeger created
...
  • Kiali 面板
    输入如下命令打开Kiali面板
    $ istioctl dashboard kiali
    选择对应的namespaces
    kiali
    可以看到,调用关系一目了然,请求由Istio Ingress Gateway进来,首先访问productpageproductpage访问details获取图书详情,productpage访问reviews获取评论,reviews访问ratings获取图书评级。
  • 打开Jaeger面板
    $ istioctl dashboard jaeger
    左侧Service下拉菜单,选择productpage.istio-demo,从右面的Traces里点击productpage,可以看到如下调用详情。
    jaeger
    调用链以时间序横向展示,同样可以看到请求由istio-ingressgateway进来到达productpage,productpage调用detailsreviewsreviews调用ratings,每个调用的时间花费亦显示了出来。

    Istio卸载

  • 卸载addons
    1
    2
    cd /usr/local/istio-1.8.1
    $ kubectl delete -f samples/addons
  • 卸载Bookinfo
    1
    2
    3
    cd /usr/local/istio-1.8.1
    $ kubectl delete -n istio-demo -f samples/bookinfo/platform/kube/bookinfo.yaml
    $ kubectl delete -n istio-demo -f samples/bookinfo/networking/bookinfo-gateway.yaml
  • 卸载Istio
    1
    $ istioctl manifest generate --set profile=demo | kubectl delete --ignore-not-found=true -f -
  • 删除namespace istio-system
    1
    $ kubectl delete namespace istio-system
  • 取消对istio-demo进行Istio自动注入
    1
    $ kubectl label namespace istio-demo istio-injection-
  • 删除namespace istio-demo
    1
    $ kubectl delete namespace istio-demo

转载磊磊落落-Isoti使用,个人实战踩坑已验证无问题。