Service Mesh 的中文译为 “服务网格” ,是一个用于处理服务和服务之间通信的基础设施层,它负责为构建复杂的云原生应用传递可靠的网络请求,并为服务通信实现了微服务所需的基本组件功能。例如: 服务发现、负载均衡、监控、流量管理、访问控制等。在实践中,服务网格通常实现为一组和应用程序部署在一起的轻量级的网络代理,但对应用程序来说是透明的。
Isito是Service Mesh的产品化落地,是目前最受欢迎的服务网格,功能丰富、成熟度高。 Linkerd是世界上第一个服务网格类的产品。
官方站点: https://istio.io/
Istio 有 4 个配置资源,落地所有流量管理需求:
$ 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
卸载:
istioctl manifest generate --set profile=demo | kubectl delete -f -
作用: 将应用接入sidecar管理
$ 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/
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
$ kubectl label namespace default istio-injection=enabled
$ kubectl apply -f httpbin-gateway.yaml
$ kubectl get gateway
NAME AGE
httpbin-gateway 3m21s
$ 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
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
$ 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
$ 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
项目逻辑上分为AB组,在项目升级时,首先把A组从负载均衡中摘除,进行新版本的部署。B组仍然继续提供服务。A组升级完成上线,B组从负载均衡中摘除。
每次只升级一个或多个服务,升级完成后加入生产环境,不断执行这个过程,直到集群中的全部旧版升级新版本。Kubernetes的默认发布策略。
只升级部分服务,即让一部分用户继续用老版本,一 部分用户开始用新版本,如果用户对新版本没有什么 意见,那么逐步扩大范围,把所有用户都迁移到新版 本上面来。
灰度发布的一种方式,主要对特定用户采样后,对收 集到的反馈数据做相关对比,然后根据比对结果作出 决策。用来测试应用功能表现的方法, 侧重应用的可用性,受欢迎程度等,最后决定是否升级。
$ 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
任务:
$ kubectl apply -f networking/virtual-service-reviews-jason-v2-v3.yaml