本文基于istio官方文档https://istio.io/latest/zh/docs/setup/getting-started/

试验环境是一个3节点的k8s集群,k8s版本是1.21。

1.下载istio

到istio的发布页面https://github.com/istio/istio/releases/下载安装包,此时版本为1.10.2,下载并解压缩:

1wget https://github.com/istio/istio/releases/download/1.10.2/istio-1.10.2-linux-amd64.tar.gz
2tar -zxvf istio-1.10.2-linux-amd64.tar.gz

进入解压缩后的安装包目录:

 1cd istio-1.10.2
 2
 3tree -L 1
 4.
 5├── bin       该目录下包含客户端二进制文件istioctl
 6├── LICENSE
 7├── manifests
 8├── manifest.yaml
 9├── README.md
10├── samples   该目录下包含示例的应用程序
11└── tools

将istioctl添加到系统PATH环境变量:

1export PATH=$PWD/bin:$PATH

添加成功后可以直接使用istioctl打印一下版本信息:

1istioctl version
2no running Istio pods in "istio-system"
31.10.2

2.安装istio

istio为我们内置了一组安装配置的profile(config profiles)。这些profile配置提供了对istio控制平面和istio数据平面sidecar的定制内容。 这些profile有default, demo, minimal, remote, empty, preview。生产环境部署istio时建议使用default profile,而演示和评估istio建议部署demo profile,关于profile的更多内容可以查看官方文档https://istio.io/latest/zh/docs/setup/additional-setup/config-profiles/

本节的目的是快速部署和评估istio,因此选择demo profile,它包含了一组专为测试准备的功能集合。

1istioctl install --set profile=demo -y
2✔ Istio core installed
3✔ Istiod installed
4✔ Ingress gateways installed
5✔ Egress gateways installed
6✔ Installation complete
7Thank you for installing Istio 1.10.

安装完成后,查看一下namespace istio-system下的Pod和Service:

 1kubectl get pod -n istio-system
 2NAME                                    READY   STATUS    RESTARTS   AGE
 3istio-egressgateway-7d4f75956-kfpk6     1/1     Running   0          7m11s
 4istio-ingressgateway-5d57955454-945lq   1/1     Running   0          7m11s
 5istiod-6f6c6bbbbd-4286r                 1/1     Running   0          12m
 6
 7kubectl get svc -n istio-system
 8NAME                   TYPE           CLUSTER-IP       EXTERNAL-IP   PORT(S)                                                                      AGE
 9istio-egressgateway    ClusterIP      10.105.21.145    <none>        80/TCP,443/TCP                                                               8m38s
10istio-ingressgateway   LoadBalancer   10.106.130.216   <pending>     15021:31723/TCP,80:30709/TCP,443:31482/TCP,31400:32432/TCP,15443:31499/TCP   8m38s
11istiod                 ClusterIP      10.104.215.150   <none>        15010/TCP,15012/TCP,443/TCP,15014/TCP                                        13m

可以看出部署了istiod, istio-ingressgateway, istio-egressgateway。部署成功后再次使用istioctl查看版本,显示下面的信息:

1istioctl version
2client version: 1.10.2
3control plane version: 1.10.2
4data plane version: 1.10.2 (2 proxies)

因为后边要部署的示例应用是部署在default namespace中的,下面给default namespace添加istio-injection=enabled标签,指示后续在此namespace部署应用时,自动注入envoy sidecar(边车)代理。

1kubectl label namespace default istio-injection=enabled

3.部署示例应用

下面部署bookinfo示例应用,bookinfo这个应用是一个在线书店的演示系统,由4个单独的微服务组成,可用于演示各种istio的特性。关于bookinfo应用的更多内容可查看官方文档https://istio.io/latest/zh/docs/examples/bookinfo/

 1kubectl apply -f samples/bookinfo/platform/kube/bookinfo.yaml
 2service/details created
 3serviceaccount/bookinfo-details created
 4deployment.apps/details-v1 created
 5service/ratings created
 6serviceaccount/bookinfo-ratings created
 7deployment.apps/ratings-v1 created
 8service/reviews created
 9serviceaccount/bookinfo-reviews created
10deployment.apps/reviews-v1 created
11deployment.apps/reviews-v2 created
12deployment.apps/reviews-v3 created
13service/productpage created
14serviceaccount/bookinfo-productpage created
15deployment.apps/productpage-v1 created

确认default namespace下bookinfo下的每个pod都正常启动:

 1kubectl get pod
 2NAME                              READY   STATUS    RESTARTS   AGE
 3details-v1-79f774bdb9-5g8zh       2/2     Running   0          8m
 4productpage-v1-6b746f74dc-kldg7   2/2     Running   0          8m
 5ratings-v1-b6994bb9-htn5x         2/2     Running   0          8m
 6reviews-v1-545db77b95-g7nw7       2/2     Running   0          8m
 7reviews-v2-7bf8c9648f-wrcqq       2/2     Running   0          8m
 8reviews-v3-84779c7bbc-xgmlf       2/2     Running   0          8m
 9
10kubectl get service
11NAME          TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)    AGE
12details       ClusterIP   10.110.77.235    <none>        9080/TCP   8m
13kubernetes    ClusterIP   10.96.0.1        <none>        443/TCP    25m
14productpage   ClusterIP   10.108.246.237   <none>        9080/TCP   8m
15ratings       ClusterIP   10.101.2.25      <none>        9080/TCP   8m
16reviews       ClusterIP   10.105.123.232   <none>        9080/TCP   8m

上面这些pod的容器数量都是2,Istio的边车代理容器istio-proxy也被自动注入随之启动。

运行下面的命令进行验证,确认访问productpage服务可以返回页面标题:

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

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

将应用关联到istio网关:

1kubectl apply -f samples/bookinfo/networking/bookinfo-gateway.yaml
2gateway.networking.istio.io/bookinfo-gateway created
3virtualservice.networking.istio.io/bookinfo created

4.从集群外部访问bookinfo应用

因为这里使用的k8s集群没有cloud driver和外部负载均衡器,Service istio-ingressgateway的ExternalIP是处于Pending状态的。

1kubectl get svc istio-ingressgateway -n istio-system
2NAME                   TYPE           CLUSTER-IP       EXTERNAL-IP   PORT(S)                                                                      AGE
3istio-ingressgateway   LoadBalancer   10.106.130.216   <pending>     15021:31723/TCP,80:30709/TCP,443:31482/TCP,31400:32432/TCP,15443:31499/TCP   15m

在这种情况下先使用istio-ingressgateway的NodePort从集群外部访问bookinfo应用,这里其http的NodePort是30709。 浏览器打开http://NODE_IP:30709/productpage确保可以打开bookinfo的应用界面。

istio-bookinfo-sample.png

5.部署和查看Istio仪表板

istio和几个遥测应用做了集成。 遥测能帮你了解服务网格的结构、展示网络的拓扑结构、分析网格的健康状态。下面部署Kiali仪表板、 以及Prometheus、Grafana、Jaeger等插件。

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

等待kiali部署完成后,使用istioctl dashboard --address 0.0.0.0 kiali命令启动istio dashboard kiali的监听,打开地址即可访问kiali。在左侧的导航菜单,选择 Graph ,然后在 Namespace下拉列表中,选择default。Kiali仪表板展示了网格的概览、以及Bookinfo示例应用的各个服务之间的关系。它还提供过滤器来可视化流量的流动。

istio-kiali.png

参考