Istio 实战分享

—— Istio 相关介绍及实例演示

06 Sep 2018

Bingo Huang

目录

2

Istio 来龙去脉

3

从微服务说开去...

微服务虽好,治理不容易,有以下痛点:

服务注册与发现
身份验证与授权
服务的伸缩控制
反向代理与负载均衡
路由控制
流量切换
日志管理
性能度量、监控与调优
分布式跟踪
过载保护
服务降级
服务部署与版本升级策略支持
错误处理
...

有“痛点”,才有需求!

4

Service Mesh 横空出世

`Service Mesh` 概念还非常年轻,在国内通常被翻译为“服务网格”


- 左图:传统微服务之间的微服务治理逻辑的位置;右图:微服务治理逻辑被独立出来之后的位置

由“Service Govern Logic”这一层组成的逻辑网络被定义为 Service Mesh
每个微服务都包含一个 Service Mesh 的端点,多个微服务的端点组成服务网格

5

Istio 带来“福音”

Istio 项目是 service mesh 概念的最新实现,它由控制平面和数据平面组成。今年7月底正式发布了1.0版本。
- 背后推动公司:Google、IBM、Lyft 
- 支持多种平台:K8S, Mesos, Nomad...
- 主要开发语言:Go & C++
6

Istio 环境搭建

7

Istio 对 K8S 的版本要求

- 2017年5月10号发布0.1.0
- 2017年8月8号发布0.2.0
- 2018年7月31号发布1.0.0
- https://github.com/istio/istio/issues/898
- 0.1.6 is compatible with k8s 1.5
- 0.2.x requires at least 1.7
- 后续的实例演示都是基于 k8s 1.9 以上的版本
- kubectl 相应的也要 1.9 或者更高
8

搭建基础环境: 仅用于 POC

$ minikube start --memory=8192 --cpus=4 \
    --kubernetes-version=v1.9.4 \
    --vm-driver=none
9

下载 Istio 发布包

在线下载配置:需要配置 HTTP/HTTPS 代理

$ curl -L https://git.io/getLatestIstio | sh -

手动下载解压:

https://github.com/istio/istio/releases/tag/1.0.0

进入安装目录:istio-1.0.0

- install/:包含了 Kubernetes 安装所需的 .yaml 文件
- samples/:包含相应的示例应用
- bin/istioctl : istioctl 的功能是手工进行 Envoy Sidecar 的注入,以及对路由规则、策略的管理
- istio.VERSION:配置文件

配置环境变量:

$ export PATH=$PWD/bin:$PATH

验证一下,终端输入:istioctl

10

在 K8S 集群上安装 Istio

$ kubectl apply -f install/kubernetes/istio-demo.yaml
$ kubectl apply -f install/kubernetes/istio-demo-auth.yaml
使用 Helm 渲染 Kubernetes 清单文件并使用 kubectl 进行部署
针对生产环境的需求,为了能够控制所有配置选项,建议使用 Helm Chart 方式进行安装
11

检查 Istio 状态

$ kubectl get ns -L istio-injection
$ kubectl get svc -n istio-system
$ kubectl get pods -n istio-system
12

卸载 Istio

如果使用 istio-demo.yaml 进行的安装:

$ kubectl delete -f install/kubernetes/istio-demo.yaml

如果是使用 Helm 安装的 Istio,可以依照文档中的卸载步骤完成删除。

13

Istio 实操演示

14

入门实例:Sleep 应用

了解两种注入Istio SideCar方式:

$ istioctl kube-inject -f samples/sleep/sleep.yaml | kubectl apply -f -
# 开启了 admission controller:admissionregistration
$ kubectl api-versions | grep admissionregistration
# 给对应的namespace打上istio注入的label
$ kubectl label namespace default istio-injection=enabled
# 检查下
$ kubectl get namespace -L istio-injection
# 去除标签方式
$ kubectl label namespace default istio-injection-
15

进阶实例:Bookinfo 应用

该应用模仿一个在线书店。页面上会显示一本书的描述,书籍的细节(ISBN、页数等),以及一些评论。
Bookinfo 是一个异构应用,4个微服务是由不同的语言编写的,这些服务对 Istio 并无依赖。
16

Bookinfo 微服务介绍

四个微服务:

reviews 微服务有 3 个版本:

17

Bookinfo 部署 - 自动注入

$ kubectl apply -f samples/bookinfo/platform/kube/bookinfo.yaml
$ kubectl get services
$ kubectl get pods
如果需要卸载 Bookinfo 应用,执行:$ samples/bookinfo/platform/kube/cleanup.sh
18

Bookinfo 访问 - 确认 Ingress 的IP和PORT

$ kubectl apply -f samples/bookinfo/networking/bookinfo-gateway.yaml
$ kubectl get gateway
$ kubectl get svc istio-ingressgateway -n istio-system
$ export INGRESS_HOST=$(minikube ip)
$ export INGRESS_PORT=$(kubectl -n istio-system get service istio-ingressgateway -o jsonpath='{.spec.ports[?(@.name=="http2")].nodePort}')
$ export GATEWAY_URL=$INGRESS_HOST:$INGRESS_PORT
$ curl -o /dev/null -s -w "%{http_code}\n" http://${GATEWAY_URL}/productpage
19

实例演示:智能路由

演示如何在 Istio 服务网格中使用多种流量管理功能

1. 安装 Istio 1.0.0
2. 部署 Bookinfo 应用
3. 在目标规则中定义好可用的版本
    $ istioctl create -f samples/bookinfo/networking/destination-rule-all.yaml
    $ istioctl get destinationrules
20

1. 路由请求

演示如何根据权重和 HTTP header配置动态请求路由。

$ istioctl create -f samples/bookinfo/networking/virtual-service-all-v1.yaml
$ istioctl get virtualservice
productpage 只会路由到 reviews:v1,没有评分星级,
$ istioctl replace -f samples/bookinfo/networking/virtual-service-reviews-test-v2.yaml
$ istioctl get virtualservice reviews -o yaml
21

2. 故障注入-1

使用 HTTP abort 进行故障注入

$ istioctl replace -f samples/bookinfo/networking/virtual-service-ratings-test-abort.yaml
$ istioctl get virtualservice ratings -o yaml
22

2. 故障注入-2

演示如何注入延迟并测试应用程序的弹性。

$ istioctl replace -f samples/bookinfo/networking/virtual-service-ratings-test-delay.yaml
- 在 productpage 和 reviews 服务之间超时时间是 6s 
- reviews 和 ratings 服务之间的硬编码连接超时为 10s
- 请看下一个实例:流量迁移
23

3. 流量迁移

演示如何逐步将流量从一个版本的微服务迁移到另一个版本。

$ istioctl replace -f samples/bookinfo/networking/virtual-service-all-v1.yaml
$ istioctl replace -f samples/bookinfo/networking/virtual-service-reviews-50-v3.yaml
$ istioctl replace -f samples/bookinfo/networking/virtual-service-reviews-v3.yaml
24

4. 请求超时

演示如何使用 Istio 在 Envoy 中设置请求超时。(以下yaml文件可参考 官方文档

$ istioctl replace -f samples/bookinfo/networking/virtual-service-all-v1.yaml
$ istioctl replace -f samples/bookinfo/networking/virtual-service-reviews-v2.yaml
$ istioctl replace -f samples/bookinfo/networking/virtual-service-ratings-2s-deplay.yaml
$ istioctl replace -f samples/bookinfo/networking/virtual-service-reviews-v2-timeout.yaml
25

小结:

- Ubuntu + Docker + minikube(k8s 1.9/1.10):注意配置代理
- Istio 1.0.0:下载、部署、检查、卸载
- 入门实例:Sleep 应用    - 了解 Istio Sidecar 模式的两种注入方式
- 进阶实例:Bookinfo 应用 - 由4个不同语言编写的微服务组成的异构应用
    - 自动注入部署
    - Ingress访问
    - 路由请求
    - 故障注入
    - 流量迁移
    - 请求超时
- 其他任务:
    - 控制流量、熔断、镜像、健康检查
    - 安全、策略、遥测
    - ...
    - 可参考官方文档进一步学习
26

Thank you

06 Sep 2018

Bingo Huang

Use the left and right arrow keys or click the left and right edges of the page to navigate between slides.
(Press 'H' or navigate to hide this message.)