Istio手册
- 什么是Istio
它是一个完全开源的服务网格,以透明的方式构建在现有的分布式应用中。它也是一个平台,拥有可以集成任何日志、遥测和策略系统的 API 接口。Istio 多样化的特性使你能够成功且高效地运行分布式微服务架构,并提供保护、连接和监控微服务的统一方法。
特性:
▪统一的方式去管理和监测你的微服务应用
▪管理流量
▪实施访问策略
▪收集数据等
简单来说,Istio 就是一个提供了服务治理能力的服务网格
- 为什么使用Istio
Service Mesh 也是一种服务治理技术,其核心能力是对流量进行控制。作为一个企业,如果你的微服务应用已经具有了非常完备的服务治理能力,那么你不一定非得引入Service Mesh。但是假设你的系统并不具有完善的治理功能,或者系统架构中的痛点正好可以被 Service Mesh所解决,那么使用 Service Mesh 就是你的最佳选择。
相对于基于公共库的服务治理产品,Service Mesh 最大的特性就是对应用透明。你可以将你的微服务应用无缝的接入网格,而无需修改业务逻辑。目前Istio 提供了以下重要的功能:
- 为 HTTP、gRPC、WebSocket 和 TCP 流量自动负载均衡。
- 通过丰富的路由规则、重试、故障转移和故障注入对流量行为进行细粒度控制。
- 提供完善的可观察性方面的能力,包括对所有网格控制下的流量进行自动化度量、日志记录和追踪。
- 提供身份验证和授权策略,在集群中实现安全的服务间通信。
- Istio 的平台支持
Istio 独立于平台,被设计为可以在各种环境中运行,包括跨云、内部环境、Kubernetes 等等。目前 Istio 支持的平台有:
1.Kubernetes
2.Consul
3.GCP
- Istio安装配置及使用
一、k8s安装Istio
软件下载地址:https://github.com/istio/istio/releases
#下载解压
[root@vnfm-master-1 ***]# tar xf istio-1.10.1-linux-amd64.tar.gz
[root@vnfm-master-1 ***]# ls
demo downloadIstioCandidate.sh istio-1.12.1 istio-1.12.1-linux-amd64.tar.gz mybook mytest
[root@vnfm-master-1 ***]# cd istio-1.12.1/
[root@vnfm-master-1 istio-1.12.1]# ll
total 28
drwxr-x---. 2 root root 22 Dec 7 15:04 bin
-rw-r--r--. 1 root root 11348 Dec 7 15:04 LICENSE
drwxr-xr-x. 5 root root 52 Dec 7 15:04 manifests
-rw-r-----. 1 root root 827 Dec 7 15:04 manifest.yaml
-rw-r--r--. 1 root root 5866 Dec 7 15:04 README.md
drwxr-xr-x. 21 root root 4096 Dec 7 15:04 samples
drwxr-xr-x. 3 root root 57 Dec 7 15:04 tools
[root@vnfm-master-1 istio-1.12.1]# cp bin/istioctl /usr/bin/
#安装
[root@vnfm-master-1 istio]# istioctl install --set profile=demo -y
✔ Istio core installed
✔ Istiod installed
✔ Egress gateways installed
✔ Ingress gateways installed
✔ Installation complete Thank you for installing Istio 1.12. Please take a few minutes to tell us about your install/upgrade experience! https://forms.gle/KjkrDnMPByq7akrYA
#验证istio是否部署成功
[root@vnfm-master-1 istio-1.12.1]# kubectl get pods -n istio-system
NAME READY STATUS RESTARTS AGE
istio-egressgateway-659cc7697b-42jdf 1/1 Running 0 18s
istio-ingressgateway-569f64cdf8-9xn7f 1/1 Running 0 18s
istiod-85c958cd6-j6p5n 1/1 Running 0 22s
#卸载istio集群,暂时不执行
[root@vnfm-master-1 ~]# istioctl manifest generate --set profile=demo | kubectl delete -f -
二、Istio部署在线书店bookinfo
参照https://www.servicemesher.com/istio-handbook/practice/bookinfo.html
三、Istio实现灰度发布
3.1、什么是灰度发布
灰度发布也叫金丝雀部署 ,是指通过控制流量的比例,实现新老版本的逐步更替。比如对于服务A 有 version1、 version2 两个版本 , 当前两个版本同时部署,但是version1比例90% ,version2比例10% ,看运行效果,如果效果好逐步调整流量占比 80~20 ,70~30 ·····10~90 ,0,100 ,最终version1版本下线。
灰度发布的特点:
1)新老版本共存
2)可以实时根据反馈动态调整占比
3)理论上不存在服务完全宕机的情况。
4)适合于服务的平滑升级与动态更新。
3.2、使用istio进行金丝雀发布
1)创建deloyment
[root@vnfm-master-1 mytest]# cat tacker-app-deploy.yml
apiVersion: apps/v1
kind: Deployment
metadata:
name: appv1
labels:
app: v1
spec:
replicas: 1
selector:
matchLabels:
app: v1
apply: tacker-apply
template:
metadata:
labels:
app: v1
apply: tacker-apply
spec:
containers:
- name: appv1
image: tomcat:jdk8-temurin
securityContext:
privileged: true
ports:
- containerPort: 8080
[root@vnfm-master-1 mytest]# kubectl apply -f tacker-app-deploy.yml
[root@vnfm-master-1 mytest]# cat tacker-app-deploy_v2.yml
apiVersion: apps/v1
kind: Deployment
metadata:
name: appv2
labels:
app: v2
spec:
replicas: 1
selector:
matchLabels:
app: v2
apply: tacker-apply
template:
metadata:
labels:
app: v2
apply: tacker-apply
spec:
containers:
- name: appv2
image: tomcat:jdk8-temurin
securityContext:
privileged: true
ports:
- containerPort: 8080
[root@vnfm-master-1 mytest]# kubectl apply -f tacker-app-deploy_v2.yml
2)创建service
[root@vnfm-master-1 mytest]# cat service.yml
apiVersion: v1
kind: Service
metadata:
name: tacker-app
labels:
apply: tacker-apply
spec:
ports:
- port: 8080
name: http
selector:
apply: tacker-apply
[root@vnfm-master-1 mytest]# kubectl apply -f service.yml
3)创建gateway
[root@vnfm-master-1 mytest]# cat test-gateway.yml
apiVersion: networking.istio.io/v1alpha3
kind: Gateway
metadata:
name: tacker-app-gateway
spec:
selector:
istio: ingressgateway # use istio default controller
servers:
- port:
number: 80
name: http
protocol: HTTP
hosts:
- "*"
[root@vnfm-master-1 mytest]# kubectl apply -f test-gateway.yml
4)创建virtualservice
[root@vnfm-master-1 mytest]# cat virtual-service-test.yaml
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
name: tacker-app1
spec:
hosts:
- "*"
gateways:
- tacker-app-gateway
http:
- route:
- destination:
host: tacker-app
subset: v1
weight: 90
- destination:
host: tacker-app
subset: v2
weight: 10
---
apiVersion: networking.istio.io/v1alpha3
kind: DestinationRule
metadata:
name: tacker-app
spec:
host: tacker-app
subsets:
- name: v1
labels:
app: v1
- name: v2
labels:
app: v2
[root@vnfm-master-1 mytest]# kubectl apply -f virtual-service-test.yaml
3.2、验证
命令验证:
$ export INGRESS_PORT=$(kubectl -n istio-system get service istio-ingressgateway -o jsonpath='{.spec.ports[?(@.name=="http2")].nodePort}')
$ export SECURE_INGRESS_PORT=$(kubectl -n istio-system get service istio-ingressgateway -o jsonpath='{.spec.ports[?(@.name=="https")].nodePort}')
$ export INGRESS_HOST=127.0.0.1
[root@vnfm-master-1 mytest]# for i in `seq 1 100`; do curl http://$INGRESS_HOST:$INGRESS_PORT/;done > 1.txt