istio典型应用上线步骤分为3步
- 将应用打包成docker镜像,并使用istioctl部署到k8s集群上
- 制作路由规则,指定选择器,进行流量过滤,指定熔断规则等
- 制作网关选择网关服务进行暴露一般是网关服务,内部服务不需要
部署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'
查看效果
持续更新...