服务网格应用istio上线流程[Service Mesh]

2019/4/22 posted in  SERVICE MESH

istio典型应用上线步骤分为3步

  1. 将应用打包成docker镜像,并使用istioctl部署到k8s集群上
  2. 制作路由规则,指定选择器,进行流量过滤,指定熔断规则等
  3. 制作网关选择网关服务进行暴露一般是网关服务,内部服务不需要

部署flaskapp

这里拿flaskapp举例:https://github.com/fleeto/flaskapp

编写istio 项目部署文件:flask.istio.yaml

apiVersion: v1
kind: Service
metadata:
  name: flaskapp
  labels:
    app: flaskapp
spec:
  selector:
    app: flaskapp
  ports:
    - name: http
      port: 80
---
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: flaskapp-v1
spec:
  replicas: 1
  template:
    metadata:
      labels:
        app: flaskapp
        version: v1
    spec:
      containers:
      - name: flaskapp
        image: dustise/flaskapp
        imagePullPolicy: Always
        env:
        - name: version
          value: v1
---
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: flaskapp-v2
spec:
  replicas: 1
  template:
    metadata:
      labels:
        app: flaskapp
        version: v2
    spec:
      containers:
      - name: flaskapp
        image: dustise/flaskapp
        imagePullPolicy: Always
        env:
        - name: version
          value: v2

部署:istioctl kube-inject -f flask.istio.yaml | kubectl apply -f -

查看效果

此时,flaskapp在k8s集群容器内部可见了,可以再起个测试容器查看请求效果

for i in `seq 10`; do http --body http://flaskapp/env/version; done

定义flaskapp路由规则

flaskapp.virtualservice.yaml

apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: flaskapp
spec:
  hosts:
  - flaskapp.default.svc.cluster.local
  - flaskapp.microservice.rocks
  gateways:
  - mesh
  - example-gateway
  http:
  - route:
    - destination:
        host: flaskapp.default.svc.cluster.local
        subset: v1
      weight: 70
    - destination:
        host: flaskapp.default.svc.cluster.local
        subset: v2
      weight: 30

部署:kubectl apply -f flaskapp.virtualservice.yaml

查看效果: http flaskapp.default.svc.cluster.local/env/version

可以同时定义熔断规则,比如3秒超时熔断,重试3次,每次请求最多1秒

retries:
  attempts: 3
  perTryTimeout: 1
timeout: 3s

启用Ingress Gateway

example.gateway.yml

apiVersion: networking.istio.io/v1alpha3
kind: Gateway
metadata:
  name: example-gateway
spec:
  selector:
    istio: ingressgateway
  servers:
  - port:
      number: 80
      name: http
      protocol: HTTP
    hosts:
    - "*.microservice.rocks"
    - "*.microservice.xyz"

部署:

查看效果

外网访问

curl -vvv istio部署机ip:31380/env/version -H 'Host:flaskapp.microservice.rocks'

查看效果

持续更新...