• 安装并试用Istio service mesh
    • 安装环境
    • 安装
    • 测试
    • 监控
    • 更进一步
    • 参考

    安装并试用Istio service mesh

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

    文中使用的yaml文件可以在kubernetes-handbook的manifests/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