服务网格化
ServiceMesh
Service Mesh 的中文译为 “服务网格” ,是一个用于处理服务和服务之间通信的基础设施层,它负责为构建复杂的云原生应用传递可靠的网络请求,并为服务通信实现了微服务所需的基本组件功能。例如: 服务发现、负载均衡、监控、流量管理、访问控制等。在实践中,服务网格通常实现为一组和应用程序部署在一起的轻量级的网络代理,但对应用程序来说是透明的。
- 总结
- 治理服务的能力
- 应用无感知
- 服务通信的基础设施层
- 解耦应用程序的重试/超时,监控,追踪和服务发现
istio 概述
Isito是Service Mesh的产品化落地,是目前最受欢迎的服务网格,功能丰富、成熟度高。 Linkerd是世界上第一个服务网格类的产品。
官方站点: https://istio.io/
- 主要功能
- 连接
- 流量控制
- 负载均衡
- 灰度发布
- 安全
- 认证
- 鉴权
- 控制
- 限流
- ACL
- 观察
- 监控
- 调用链
istio 架构与组件
- 数据平面:由一组代理组成,这些代理微服务所
有网络通信,并接收和实施来自Mixer的策略。
- Proxy:负责高效转发与策略实现。
- 控制平面:管理和配置代理来路由流量。此外,通过mixer实施策略与收集来自边车代理的数据。
- Mixer:适配组件,数据平面与控制平面通过它交互,为Proxy提供策略和数据上报。
- Pilot:策略配置组件,为Proxy提供服务发现、智能路由、错误处理等。
- Citadel:安全组件,提供证书生成下发、加密通信、访问控制。
- Galley:配置管理、验证、分发。
Istio 有 4 个配置资源,落地所有流量管理需求:
- VirtualService:实现服务请求路由规则的功能。
- DestinationRule:实现目标服务的负载均衡、服务发现、故障处理和故障注入的功能。
- Gateway:让服务网格内的服务,可以被全世界看到。
- ServiceEntry :让服务网格内的服务,可以看到外面的世界
在kubernetes集群部署istio
代码语言:javascript复制$ wget https://github.com/istio/istio/releases/download/1.4.2/istio-1.4.2-linux.tar.gz
$ tar zxvf istio-1.4.2-linux.tar.gz
$ cd istio-1.4.2
$ mv bin/istioctl /usr/bin
$ istioctl manifest apply --set profile=demo
$ kubectl get pods -n istio-system
$ kubectl get svc -n istio-system
卸载:
代码语言:javascript复制istioctl manifest generate --set profile=demo | kubectl delete -f -
SideCar注入
作用: 将应用接入sidecar管理
部署httpbin web实例
代码语言:javascript复制$ cd istio-1.4.2/samples/httpbin
$ kubectl apply -f httpbin-nodeport.yaml #nodeport服务,默认是在default ns
$ kubectl get pod,svc
访问测试:http://192.168.56.11:30815/
手动将httpbin服务注册到sidecar
代码语言:javascript复制kubectl apply -f <(istioctl kube-inject -f httpbin-nodeport.yaml)
或者
istioctl kube-inject -f httpbin-nodeport.yaml |kubectl apply -f -
$ kubectl get pod
NAME READY STATUS RESTARTS AGE
httpbin-77bfc6b755-k8pjb 1/1 Running 0 8m3s
httpbin-79bf7bbcd4-mjmjc 0/2 PodInitializing 0 11s
自动注入
代码语言:javascript复制$ kubectl label namespace default istio-injection=enabled
$ kubectl apply -f httpbin-gateway.yaml
$ kubectl get gateway
NAME AGE
httpbin-gateway 3m21s
代码语言:javascript复制$ kubectl get svc -n istio-system
istio-ingressgateway LoadBalancer 10.0.0.114 <pending> 15020:32361/TCP,80:31929/TCP,443:31088/TCP,15029:31493/TCP,15030:32677/TCP,15031:30048/TCP,15032:32207/TCP,15443:30034/TCP 75m
访问K8SNODEIP:31929 即可访问,此线路是走的SideCar的gateway
服务网关: gateway
- Gateway为网格内服务提供负载均衡器,提供以下功能: •
- L4-L7的负载均衡
- 对外的mTLS
- Gateway根据流入流出方向分为:
- IngressGateway:接收外部访问,并将流量转发到网格内的服务。
- EgressGateway:网格内服务访问外部应用。
部署 bookinfo 微服务示例
- Bookinfo 应用分为四个单独的微服务:
- productpage :productpage 微服务会调用 details 和 reviews 两个微服务,用来生成页面。
- details :这个微服务包含了书籍的信息。
- reviews :这个微服务包含了书籍相关的评论。它还会调用 ratings 微服务。
- ratings :ratings 微服务中包含了由书籍评价组成的评级信息。
- reviews 微服务有 3 个版本:
- v1 版本不会调用 ratings 服务。
- v2 版本会调用 ratings 服务,并使用 5个黑色五角星来显示评 分信息。
- v3 版本会调用 ratings 服务,并使用5个红色五角星 来显示评 分信息。
部署bookinfo实例
代码语言:javascript复制kubectl create ns bookinfo
kubectl label namespace bookinfo istio-injection=enabled #sidecar自动注入开启
cd istio-1.4.2/samples/bookinfo/
kubectl apply -f platform/kube/bookinfo.yaml -n bookinfo
kubectl apply -f networking/bookinfo-gateway.yaml -n bookinfo
kubectl get svc -n istio-system| grep ingress #查到80对应31929的端口暴露
访问http://192.168.56.11:31929/productpage
使用LB NGINX实现域名反代
- 准备: 找k8s其中的一台节点,安装nginx(192.168.56.12)
- 配置nginx LB
$ vim /etc/nginx/nginx.conf
upstream ingressgateway {
server 192.168.56.11:31929;
server 192.168.56.12:31929;
server 192.168.56.13:31929;
}
server {
listen 80 default_server;
server_name _;
root /usr/share/nginx/html;
# Load configuration files for the default server block.
include /etc/nginx/default.d/*.conf;
location / {
proxy_pass http://ingressgateway;
proxy_set_header Host $host;
proxy_http_version 1.1;
}
.....
$ nginx -t
$ nginx
- 配置域名解析测试
$ vim /etc/hosts
192.168.56.12 bookinfo.cropy.cn
- bookinfo gateway 配置(其实也就是要配置hosts与LB保持一致)
$ cd ~/istio-1.4.2/samples/bookinfo
$ vim networking/bookinfo-gateway.yaml
apiVersion: networking.istio.io/v1alpha3
kind: Gateway
metadata:
name: bookinfo-gateway
spec:
selector:
istio: ingressgateway # use istio default controller
servers:
- port:
number: 80
name: http
protocol: HTTP
hosts:
- "bookinfo.cropy.cn"
---
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
name: bookinfo
spec:
hosts:
- "bookinfo.cropy.cn"
gateways:
。。。。
$ kubectl apply -f networking/bookinfo-gateway.yaml -n bookinfo
Istio 实现灰度发布
- 主流发布方案
- 蓝绿发布
- 滚动发布
- 灰度发布
- A/B Test
蓝绿发布
项目逻辑上分为AB组,在项目升级时,首先把A组从负载均衡中摘除,进行新版本的部署。B组仍然继续提供服务。A组升级完成上线,B组从负载均衡中摘除。
- 特点:
- 策略简单
- 升级/回滚速度快
- 用户无感知,平滑过渡
- 缺点:
- 需要两倍以上服务器资源
- 短时间内浪费一定资源成本
- 有问题影响范围大
滚动发布
每次只升级一个或多个服务,升级完成后加入生产环境,不断执行这个过程,直到集群中的全部旧版升级新版本。Kubernetes的默认发布策略。
- 特点:
- 用户无感知,平滑过渡
- 缺点:
- 部署周期长
- 发布策略复杂
- 不易回滚
- 有影响范围较大
灰度发布(金丝雀发布)
只升级部分服务,即让一部分用户继续用老版本,一 部分用户开始用新版本,如果用户对新版本没有什么 意见,那么逐步扩大范围,把所有用户都迁移到新版 本上面来。
- 特点:
- 保证系统整体稳定性
- 用户无感知,平滑过渡
- 缺点:
- 自动化要求高
A/B Test
灰度发布的一种方式,主要对特定用户采样后,对收 集到的反馈数据做相关对比,然后根据比对结果作出 决策。用来测试应用功能表现的方法, 侧重应用的可用性,受欢迎程度等,最后决定是否升级。
基于权重的路由
- 流量全部发送到reviews v1版本(不带五角星)
- 将90%的流量发送到reviews v1版本,另外10%的流量发送到reviews v2版本(5个黑色五星),最后完全切换到v2版本
- 将50%的流量发送到v2版本,另外50%的流量发送到v3版本(5个红色五角星)
$ cd ~/istio-1.4.2/samples/bookinfo
$ kubectl apply -f networking/virtual-service-all-v1.yaml -n bookinfo
$ kubectl apply -f networking/destination-rule-all.yaml -n bookinfo
$ kubectl apply -f networking/virtual-service-reviews-90-10.yaml -n bookinfo
$ kubectl apply -f networking/virtual-service-reviews-v2-v3.yaml -n bookinfo
基于请求内容的路由(A/B Test)
任务:
- 将特定用户的请求发送到reviews v2版本(5个黑色五 角星),其他用户则不受影响(v3)
$ kubectl apply -f networking/virtual-service-reviews-jason-v2-v3.yaml
可视化监控:监控指标、网格可视化、调用链跟踪
- 监控指标(Grafana)
- 网格可视化(Kiali)
- 调用链跟踪(Jaeger)