从一个例子入手Istio
转载请声明出处哦~,本篇文章发布于luozhiyun的博客:https://www.luozhiyun.com
本文使用的Istio源码是 release 1.5。
本篇是Istio系列的第一篇,希望大家接下来能和我一起学习进步。
封面图是Klegs的作品,颜色有一种深邃感,我很喜欢。这篇文章是Istio系列文章的开篇,主要从一个例子入手讲一下Istio,并讲解一些基础概念,后面会基于这个例子来展开讲解istio里面的实现原理。
Istio里面有很多有趣的内容,希望大家能一起来学习,感受Istio的魅力,当然Istio是和k8s是分不开的,所以也需要掌握了一定k8s知识能力才能进行学习,还没有掌握的同学不妨看看我的系列文章来进行学习:深入k8s系列文章。
基本概念
先来说一下什么是Service Mesh(服务网格),一般来说Service Mesh是一种控制处理服务间通信的基础设施层,可以在云原生场景下帮助应用程序在复杂的服务拓扑间可靠的传递请求。在实际使用中,服务网格一般是通过一组轻量网络代理来执行治理逻辑的,并且网络代理和应用绑定在一起,但是对应用来说是无感的。
下面用一张经典的网络示意图来表示一下Service Mesh:
那么Istio又是什么呢?Istio就是一个Service Mesh实现的形态,用于服务治理的开放平台,并且Istio是与K8s紧密结合的适用于云原生场景的平台。
下面我们看看Istio的架构图:
Istio分别由数据平面(Data plane)和控制平面(Control plane)组成。
数据平面由网格内的Proxy代理和应用组成,这些代理以sidecar的形式和应用服务一起部署。每一个 sidecar会接管进入和离开服务的流量,并配合控制平面完成流量控制等方面的功能。
控制平面用于控制和管理数据平面中的sidecar代理,完成配置的分发、服务发现、和授权鉴权等功能,可以统一的对数据平面进行管理。
在上面的组件中,Proxy代理默认使用Envoy作为sidecar代理,Envoy是由Lyft内部于2016年开发的,其性能和资源占用都有着很好的表现,能够满足服务网格中对透明代理的轻量高性能的要求。
Pilot组件主要功能是将路由规则等配置信息转换为sidecar可以识别的信息,并下发给数据平面,完成流量控制相关的功能。
Citadel是专门负责安全的组件,内置有身份和证书管理功能,可以实现较为强大的授权和认证等操作。
Galley主要负责配置的验证、提取和处理等功能。
安装 Istio
本地需要准备一台机器上面安装有K8s,可以使用我在讲k8s的时候部署的机器:1.深入k8s:k8s部署&在k8s中运行第一个程序。
因为Istio的发展太过于迅速了,我这里是使用1.5.10的版本进行举例,大家可以去这里下载好应用包:https://github.com/istio/istio/releases/tag/1.5.10。
解压好之后里面会包含如下文件目录:
目录 | 包含内容 |
---|---|
bin |
包含 istioctl 的客户端文件 |
install |
包含 Consul、GCP 和 Kubernetes 平台的 Istio 安装脚本和文件 |
samples |
包含示例应用程序 |
tools |
包含用于性能测试和在本地机器上进行测试的脚本 |
然后我们将istioctl客户端路径加入环境变量中:
[root@localhost ~]# export PATH=$PATH:$(pwd)/istio-1.5.10/bin
istio不同的版本会有不同的差异,如下表格:
default | demo | minimal | remote | |
---|---|---|---|---|
使用场景 | 生产环境 | 展示、学习 | 基本流控 | 多网格共享平面 |
核心组件 | ||||
- pilot | Y | Y | Y | |
- ingressgateway | Y | Y | ||
- engressgateway | Y |
我们这里用于学习使用,所以使用demo进行安装:
[root@localhost ~]# istioctl manifest apply --set profile=demo
运行完命令后显示:Installation compelte代表安装完成。
安装好之后会安装一个新的namespace:istio-system
我们可以指定ns来获取它下面的pod:
[root@localhost ~]# kubectl get pod -n istio-system
NAME READY STATUS RESTARTS AGE
grafana-764dbb499-pxs84 1/1 Running 0 17h
istio-egressgateway-775f9cd579-lsw5q 1/1 Running 0 17h
istio-ingressgateway-5d75d8897-dn8vz 1/1 Running 0 17h
istio-tracing-9dd6c4f7c-pwq22 1/1 Running 0 17h
istiod-749c4cf7f8-xgnv8 1/1 Running 0 17h
kiali-869c6894c5-l72sc 1/1 Running 0 17h
prometheus-79757ffc4-qxccg 2/2 Running 0 17h
Bookinfo 示例
Bookinfo 是 Istio 社区官方推荐的示例应用之一。它可以用来演示多种Istio的特性,并且它是一个异构的微服务应用。应用由四个单独的微服务构成:productpage、details、reviews、ratings。
productpage
会调用details
和reviews
两个微服务,用来生成页面由python来编写。details
中包含了书籍的信息由,Ruby来编写reviews
中包含了书籍相关的评论。它还会调用ratings
微服务,由java编写。ratings
中包含了由书籍评价组成的评级信息,由Node js编写。
下面这个图展示了调用关系:
如果我们的应用要接入Istio服务,那么就需要在这些应用里面都打上sidecar,使服务所有的出入流量都被sidecar所劫持,然后就可以利用istio为应用提供服务路由、遥测数据收集以及策略实施等功能。
启动服务
要实现注入sidecar有两种方式,一个是手动注入,一个是自动注入。
手动注入可以通过使用:istioctl kube-inject -f xxx.yaml | kubectl apply -f -
来实现。
自动注入的需要为应用部署的命令空间打上标签 istio-injection=enabled
,如果在default空间部署应用,那么可以这么做:
[root@localhost ~]# kubectl label namespace default istio-injection=enabled
这里istio会利用k8s的webhook机制为每个创建的pod都自动注入sidecar,具体是如何做的,下一篇我们再讲。
然后我们使用istio中自带的例子部署应用:
[root@localhost ~]# kubectl apply -f samples/bookinfo/platform/kube/bookinfo.yaml
过一段时间后确认应用都已启动和部署成功:
[root@localhost ~]# kubectl get pod
NAME READY STATUS RESTARTS AGE
details-v1-6c9f8bcbcb-shltm 2/2 Running 0 17h
productpage-v1-7df7cb7f86-h75dd 2/2 Running 0 17h
ratings-v1-65cff55fb8-9vh2x 2/2 Running 0 17h
reviews-v1-7bccdbbf96-m2xbf 2/2 Running 0 17h
reviews-v2-7c9685df46-lljzt 2/2 Running 0 17h
reviews-v3-58fc46b64-294f4 2/2 Running 0 17h
sleep-8f795f47d-6pw96 2/2 Running 0 16h
我们可以用describe命令查看其中的pod:
[root@localhost ~]# kubectl describe pod details-v1-6c9f8bcbcb-shltm
...
Init Containers:
istio-init:
Container ID: docker://6d14ccc83bd119236bf8fda13f6799609c87891be9b2c5af7cbf7d8c913ce17e
Image: docker.io/istio/proxyv2:1.5.10
Image ID: docker-pullable://istio/proxyv2@sha256:abbe8ad6d50474814f1aa9316dafc2401fbba89175638446f01afc36b5a37919
Port: <none>
Host Port: <none>
Command:
istio-iptables
-p
15001
-z
15006
-u
1337
-m
REDIRECT
-i
*
-x
-b
*
-d
15090,15020
...
Containers:
details:
Container ID: docker://ed216429216ea1b8a1ba20960590edb7322557467c38cceff3c3e847bcff0a14
Image: docker.io/istio/examples-bookinfo-details-v1:1.15.1
Image ID: docker-pullable://istio/examples-bookinfo-details-v1@sha256:344b1c18703ab1e51aa6d698f459c95ea734f8317d779189f4638de7a00e61ae
...
istio-proxy:
Container ID: docker://a3862cc8f53198c8f86a911089e73e00f4cc4aa02eea05aaeb0bd267a8e98482
Image: docker.io/istio/proxyv2:1.5.10
Image ID: docker-pullable://istio/proxyv2@sha256:abbe8ad6d50474814f1aa9316dafc2401fbba89175638446f01afc36b5a37919
Port: 15090/TCP
Host Port: 0/TCP
Args:
...
可以看到里面有一个初始化的Init Containers,用于设置 iptables
规则。还注入了istio-proxy,这个容器是真正的 Sidecar。
为了能让应用程序可以从外部访问 k8s 集群,需要安装gateway:
[root@localhost ~]# kubectl apply -f samples/bookinfo/networking/bookinfo-gateway.yaml
检查gateway:
[root@localhost ~]# kubectl get gateway
NAME AGE
bookinfo-gateway 17h
因为我是单机环境,未使用外部负载均衡器,需要通过 node port 访问,然后我们查看node port:
[root@localhost ~]# kubectl -n istio-system get service istio-ingressgateway -o jsonpath='{.spec.ports[?(@.name=="http2")].nodePort}'
22412
我的k8snode地址是192.168.13.129,然后我们在浏览器输入:
http://192.168.13.129:22412/productpage
可以访到对应的页面了,多刷新几次,会发现访问到不同的Book Reviews,因为默认使用的轮询策略。
总结
这一篇讲了一下如何安装istio,以及如何部署应用,使用istio来完成一个实例,比较简单和基础,里面的很多细节我这里都一笔带过了,但是在后面的一些内容会基于这个例子来进行讲解里面的具体实现原理,所以这篇文章还是有些必要的。
Reference
https://istio.io/latest/docs/examples/bookinfo/
从一个例子入手Istio的更多相关文章
- spring笔记--使用springAPI以及自定义类 实现AOP的一个例子
Spring的另一个重要思想是AOP,面向切面的编程,它提供了一种机制,可以在执行业务前后执行另外的代码,Servlet中的Filter就是一种AOP思想的体现,下面通过一个例子来感受一下. 假设我们 ...
- ReCap 360 photo照片建模技术的又一个例子
这是我做的又一个利用Autodesk ReCap 360 照片建模技术做的一个例子.你可以下载模型自己把玩,或者下载原始照片自己试一试. 拍摄工具: 小米手机 照片数量:约120张 后期处理工具: p ...
- 从一个例子中体会React的基本面
[起初的准备工作] npm init npm install --save react react-dom npm install --save-dev html-webpack-plugin web ...
- 用thinkphp写的一个例子:抓取网站的内容并且保存到本地
我需要写这么一个例子,到电子课本网下载一本电子书. 电子课本网的电子书,是把书的每一页当成一个图片,然后一本书就是有很多张图片,我需要批量的进行下载图片操作. 下面是代码部分: public func ...
- Erlang 程序引发共享内存 bug 的一个例子
虽然 Erlang 的广告说得非常好,functional.share-nothing.消息传递,blah blah 的,好像用 Erlang 写并发程序就高枕无忧了,但是由于 Erlang 信奉高度 ...
- 对Jena的简单理解和一个例子
本文简单介绍Jena(Jena 2.4),使用Protégé 3.1(不是最新版本)创建一个简单的生物(Creature)本体,然后参照Jena文档中的一个例子对本体进行简单的处理,输出本体中的Cla ...
- 使用flume的一个例子
新项目中需要使用到hadoop和vertica,使用flume把数据加载到hadoop中,我做了一个例子, 即监控一个sharefolder,如果里面有文件,则会文件load到hadoop. 开启Fl ...
- php部分--面向对象三大特性-封装(另加连续调用的一个例子)、继承(重写、重载的例子)、多态;
一.封装性: 目的:为了使类更加安全. 做法:1设置私有成员 2在类中建方法,访问私有成员 3在方法里边加控制(if) 私有成员访问的两种方法: 方法一:set(可写) get(可读)做方法(可读可写 ...
- Spark小课堂Week7 从Spark中一个例子看面向对象设计
Spark小课堂Week7 从Spark中一个例子看面向对象设计 今天我们讨论了个问题,来设计一个Spark中的常用功能. 功能描述:数据源是一切处理的源头,这次要实现下加载数据源的方法load() ...
随机推荐
- python文档翻译之使用python解释器
Python解释器通常安装在/usr/local/bin/python3.6,把/usr/local/bin目录设置到UNIX shell的搜索路径就可以使用下面的命令运行python: python ...
- WEB 应用缓存解析以及使用 Redis 实现分布式缓存
什么是缓存? 缓存就是数据交换的缓冲区,用于临时存储数据(使用频繁的数据).当用户请求数据时,首先在缓存中寻找,如果找到了则直接返回.如果找不到,则去数据库中查找.缓存的本质就是用空间换时间,牺牲数据 ...
- Java反应式框架Reactor中的Mono和Flux
1. 前言 最近写关于响应式编程的东西有点多,很多同学反映对Flux和Mono这两个Reactor中的概念有点懵逼.但是目前Java响应式编程中我们对这两个对象的接触又最多,诸如Spring WebF ...
- 基础篇:java基本数据类型
1:java几种基本数据类型大小 关键字 类型 位数 (8位一字节) 取值范围(表示范围) byte 整型 8 -2^7 ~ 2^7-1 short 整型 16 -2^15 ~ 2^15-1 int ...
- SpringBoot中pom引入gson异常
在pom中引入gson依赖,启动spring boot项目中报错 Description:An attempt was made to call the method com.google.gson. ...
- 读书笔记——Effective C++
1.让自己习惯C++ 条款01:视C++为一个语言联邦 C++高效编程守则视状况而变化,取决于你使用C++的哪一部分. 条款02:尽量以const.enum.inline替换 #define 对于单纯 ...
- P5322 排兵布阵解题报告
本想在洛谷上交篇题解的,结果发现交不了,所以只能在这边写了... 作为一个蒟蒻,看到省选题,第一眼考虑怎么打暴力 我们可以分情况考虑 当\(s==1\)的时候 我们可以把他当成一个\(01\)背包,背 ...
- GAN网络之入门教程(四)之基于DCGAN动漫头像生成
目录 使用前准备 数据集 定义参数 构建网络 构建G网络 构建D网络 构建GAN网络 关于GAN的小trick 训练 总结 参考 这一篇博客以代码为主,主要是来介绍如果使用keras构建一个DCGAN ...
- 正式班D5
2020.10.10星期六 正式班D5 一.上节课复习 1.硬盘分类 1.机械磁盘 io时间=平均寻道时间+平均延迟时间 buffer:写缓冲区 cache:都缓存 2.固态硬盘 ...
- CRUD,分页,排序,搜索与AngularJS在MVC
下载source - 53.1 MB 介绍 在选择最新的技术时,有几个因素会起作用,包括这些技术将如何与我们的项目集成.这篇文章解决了开始使用AngularJS和MVC的乞丐的问题.这篇文章告诉使用语 ...