安装并试用Istio service mesh

本文根据官网的文档整理而成,步骤包括安装istio 0.1.5并创建一个bookinfo的微服务来测试istio的功能。

文中使用的yaml文件可以在kubernetes-handbookmanifests/istio目录中找到,所有的镜像都换成了我的私有镜像仓库地址,请根据官网的镜像自行修改。

安装环境

  • CentOS 7.3.1611
  • Docker 1.12.6
  • Kubernetes 1.6.0

安装

1.下载安装包

下载地址:https://github.com/istio/istio/releases

下载Linux版本的当前最新版安装包

  1. wget https://github.com/istio/istio/releases/download/0.1.5/istio-0.1.5-linux.tar.gz

2.解压

解压后,得到的目录结构如下:

  1. .
  2. ├── bin
  3. └── istioctl
  4. ├── install
  5. └── kubernetes
  6. ├── addons
  7. ├── grafana.yaml
  8. ├── prometheus.yaml
  9. ├── servicegraph.yaml
  10. └── zipkin.yaml
  11. ├── istio-auth.yaml
  12. ├── istio-rbac-alpha.yaml
  13. ├── istio-rbac-beta.yaml
  14. ├── istio.yaml
  15. ├── README.md
  16. └── templates
  17. ├── istio-auth
  18. ├── istio-auth-with-cluster-ca.yaml
  19. ├── istio-cluster-ca.yaml
  20. ├── istio-egress-auth.yaml
  21. ├── istio-ingress-auth.yaml
  22. └── istio-namespace-ca.yaml
  23. ├── istio-egress.yaml
  24. ├── istio-ingress.yaml
  25. ├── istio-manager.yaml
  26. └── istio-mixer.yaml
  27. ├── istio.VERSION
  28. ├── LICENSE
  29. └── samples
  30. ├── apps
  31. ├── bookinfo
  32. ├── bookinfo.yaml
  33. ├── cleanup.sh
  34. ├── destination-ratings-test-delay.yaml
  35. ├── loadbalancing-policy-reviews.yaml
  36. ├── mixer-rule-additional-telemetry.yaml
  37. ├── mixer-rule-empty-rule.yaml
  38. ├── mixer-rule-ratings-denial.yaml
  39. ├── mixer-rule-ratings-ratelimit.yaml
  40. ├── README.md
  41. ├── route-rule-all-v1.yaml
  42. ├── route-rule-delay.yaml
  43. ├── route-rule-reviews-50-v3.yaml
  44. ├── route-rule-reviews-test-v2.yaml
  45. ├── route-rule-reviews-v2-v3.yaml
  46. └── route-rule-reviews-v3.yaml
  47. ├── httpbin
  48. ├── httpbin.yaml
  49. └── README.md
  50. └── sleep
  51. ├── README.md
  52. └── sleep.yaml
  53. └── README.md
  54. 11 directories, 41 files

从文件里表中可以看到,安装包中包括了kubernetes的yaml文件,示例应用和安装模板。

3.安装istioctl

./bin/istioctl拷贝到你的$PATH目录下。

4.检查RBAC

因为我们安装的kuberentes版本是1.6.0默认支持RBAC,这一步可以跳过。如果你使用的其他版本的kubernetes,请参考官方文档操作。

执行以下命令,正确的输出是这样的:

  1. $ kubectl api-versions | grep rbac
  2. rbac.authorization.k8s.io/v1alpha1
  3. rbac.authorization.k8s.io/v1beta1

5.创建角色绑定

  1. $ kubectl create -f install/kubernetes/istio-rbac-beta.yaml
  2. clusterrole "istio-manager" created
  3. clusterrole "istio-ca" created
  4. clusterrole "istio-sidecar" created
  5. clusterrolebinding "istio-manager-admin-role-binding" created
  6. clusterrolebinding "istio-ca-role-binding" created
  7. clusterrolebinding "istio-ingress-admin-role-binding" created
  8. clusterrolebinding "istio-sidecar-role-binding" created

注意:官网的安装包中的该文件中存在RoleBinding错误,应该是集群级别的clusterrolebinding,而release里的代码只是普通的rolebinding,查看该Issue Istio manager cannot list of create k8s TPR when RBAC enabled #327

6.安装istio核心组件

用到的镜像有:

  1. docker.io/istio/mixer:0.1.5
  2. docker.io/istio/manager:0.1.5
  3. docker.io/istio/proxy_debug:0.1.5

我们暂时不开启Istio Auth

本文中用到的所有yaml文件中的type: LoadBalancer去掉,使用默认的ClusterIP,然后配置Traefik ingress,就可以在集群外部访问。请参考安装Traefik ingress

  1. kubectl apply -f install/kubernetes/istio.yaml

7.安装监控插件

用到的镜像有:

  1. docker.io/istio/grafana:0.1.5
  2. quay.io/coreos/prometheus:v1.1.1
  3. gcr.io/istio-testing/servicegraph:latest
  4. docker.io/openzipkin/zipkin:latest

为了方便下载,其中两个镜像我备份到了时速云:

  1. index.tenxcloud.com/jimmy/prometheus:v1.1.1
  2. index.tenxcloud.com/jimmy/servicegraph:latest

安装插件

  1. kubectl apply -f install/kubernetes/addons/prometheus.yaml
  2. kubectl apply -f install/kubernetes/addons/grafana.yaml
  3. kubectl apply -f install/kubernetes/addons/servicegraph.yaml
  4. kubectl apply -f install/kubernetes/addons/zipkin.yaml

在traefik ingress中增加增加以上几个服务的配置,同时增加istio-ingress配置。

  1. - host: grafana.istio.io
  2. http:
  3. paths:
  4. - path: /
  5. backend:
  6. serviceName: grafana
  7. servicePort: 3000
  8. - host: servicegraph.istio.io
  9. http:
  10. paths:
  11. - path: /
  12. backend:
  13. serviceName: servicegraph
  14. servicePort: 8088
  15. - host: prometheus.istio.io
  16. http:
  17. paths:
  18. - path: /
  19. backend:
  20. serviceName: prometheus
  21. servicePort: 9090
  22. - host: zipkin.istio.io
  23. http:
  24. paths:
  25. - path: /
  26. backend:
  27. serviceName: zipkin
  28. servicePort: 9411
  29. - host: ingress.istio.io
  30. http:
  31. paths:
  32. - path: /
  33. backend:
  34. serviceName: istio-ingress
  35. servicePort: 80

测试

我们使用Istio提供的测试应用bookinfo微服务来进行测试。

该微服务用到的镜像有:

  1. istio/examples-bookinfo-details-v1
  2. istio/examples-bookinfo-ratings-v1
  3. istio/examples-bookinfo-reviews-v1
  4. istio/examples-bookinfo-reviews-v2
  5. istio/examples-bookinfo-reviews-v3
  6. istio/examples-bookinfo-productpage-v1

该应用架构图如下:

BookInfo Sample应用架构图

部署应用

  1. kubectl create -f <(istioctl kube-inject -f samples/apps/bookinfo/bookinfo.yaml)

Istio kube-inject命令会在bookinfo.yaml文件中增加Envoy sidecar信息。参考:https://istio.io/docs/reference/commands/istioctl.html#istioctl-kube-inject

在本机的/etc/hosts下增加VIP节点和ingress.istio.io的对应信息。具体步骤参考:边缘节点配置

在浏览器中访问http://ingress.istio.io/productpage

BookInfo Sample页面

多次刷新页面,你会发现有的页面上的评论里有星级打分,有的页面就没有,这是因为我们部署了三个版本的应用,有的应用里包含了评分,有的没有。Istio根据默认策略随机将流量分配到三个版本的应用上。

查看部署的bookinfo应用中的productpage-v1 service和deployment,查看productpage-v1的pod的详细json信息可以看到这样的结构:

  1. $ kubectl get productpage-v1-944450470-bd530 -o json

productpage-v1-istio.json文件。从详细输出中可以看到这个Pod中实际有两个容器,这里面包括了initContainer,作为istio植入到kubernetes deployment中的sidecar。

  1. "initContainers": [
  2. {
  3. "args": [
  4. "-p",
  5. "15001",
  6. "-u",
  7. "1337"
  8. ],
  9. "image": "docker.io/istio/init:0.1",
  10. "imagePullPolicy": "Always",
  11. "name": "init",
  12. "resources": {},
  13. "securityContext": {
  14. "capabilities": {
  15. "add": [
  16. "NET_ADMIN"
  17. ]
  18. }
  19. },
  20. "terminationMessagePath": "/dev/termination-log",
  21. "terminationMessagePolicy": "File",
  22. "volumeMounts": [
  23. {
  24. "mountPath": "/var/run/secrets/kubernetes.io/serviceaccount",
  25. "name": "default-token-3l9f0",
  26. "readOnly": true
  27. }
  28. ]
  29. },
  30. {
  31. "args": [
  32. "-c",
  33. "sysctl -w kernel.core_pattern=/tmp/core.%e.%p.%t \u0026\u0026 ulimit -c unlimited"
  34. ],
  35. "command": [
  36. "/bin/sh"
  37. ],
  38. "image": "alpine",
  39. "imagePullPolicy": "Always",
  40. "name": "enable-core-dump",
  41. "resources": {},
  42. "securityContext": {
  43. "privileged": true
  44. },
  45. "terminationMessagePath": "/dev/termination-log",
  46. "terminationMessagePolicy": "File",
  47. "volumeMounts": [
  48. {
  49. "mountPath": "/var/run/secrets/kubernetes.io/serviceaccount",
  50. "name": "default-token-3l9f0",
  51. "readOnly": true
  52. }
  53. ]
  54. }
  55. ],

监控

不断刷新productpage页面,将可以在以下几个监控中看到如下界面。

Grafana页面

http://grafana.istio.io

Istio Grafana界面

Prometheus页面

http://prometheus.istio.io

Prometheus页面

Zipkin页面

http://zipkin.istio.io

Zipkin页面

ServiceGraph页面

http://servicegraph.istio.io/dotviz

可以用来查看服务间的依赖关系。

访问 http://servicegraph.istio.io/graph 可以获得json格式的返回结果。

ServiceGraph页面

更进一步

BookInfo示例中有三个版本的reviews,可以使用istio来配置路由请求,将流量分发到不同版本的应用上。参考Configuring Request Routing

还有一些更高级的功能,我们后续将进一步探索。

参考

Installing Istio

BookInfo sample