istio1.1(openshift) 流量路由
1、准备测试应用
准备两个nginx Pod和一个proxy
创建应用
apiVersion: apps.openshift.io/v1
kind: DeploymentConfig
metadata:
name: www-v1
namespace: dev
spec:
selector:
app: www
replicas:
template:
metadata:
labels:
app: www
version: v1
spec:
containers:
- name: www
image: nginx
ports:
- containerPort:
---
apiVersion: apps.openshift.io/v1
kind: DeploymentConfig
metadata:
name: www-v2
namespace: dev
spec:
selector:
app: www
replicas:
template:
metadata:
labels:
app: www
version: v2
spec:
containers:
- name: www
image: nginx
ports:
- containerPort:
---
apiVersion: apps.openshift.io/v1
kind: DeploymentConfig
metadata:
name: www-proxy
namespace: dev
spec:
selector:
app: www-proxy
replicas:
template:
metadata:
labels:
app: www-proxy
spec:
containers:
- name: www
image: nginx
ports:
- containerPort:
---
apiVersion: v1
kind: Service
metadata:
name: www
namespace: dev
spec:
selector:
app: www
ports:
- name: http
protocol: TCP
port:
targetPort:
---
apiVersion: v1
kind: Service
metadata:
name: www-proxy
namespace: dev
spec:
selector:
app: www-proxy
ports:
- name: http
protocol: TCP
port:
targetPort:
注意Service中的 - name: http一定要加上,后面要匹配流量类型
# oc create -f app.yaml
准备3个Config Maps
www-v1
#获取客户端真实IP
set_real_ip_from 10.0.0.0/;
set_real_ip_from 192.168.0.0/;
set_real_ip_from 172.16.0.0/;
set_real_ip_from 100.0.0.0/;
set_real_ip_from 127.0.0.1;
real_ip_header X-Forwarded-For;
real_ip_recursive on;
#日志相关格式配置
log_format json '{"@timestamp":"$time_local",'
'"podname":"$hostname",'
'"clientip":"$remote_addr",'
'"request":"$request",'
'"status":"$status",'
'"forwarded_proto":"$http_x_forwarded_proto",'
'"scheme":"$scheme",'
'"request_method": "$request_method",'
'"size":"$body_bytes_sent",'
'"request_time":"$request_time",'
'"upstreamtime":"$upstream_response_time",'
'"upstreamhost":"$upstream_addr",'
'"http_host":"$host",'
'"url":"$uri",'
'"forwarded_for":"$http_x_forwarded_for",'
'"referer":"$http_referer",'
'"agent":"$http_user_agent"}'; access_log /dev/stdout json;
error_log /dev/stderr error;
server {
location / {
default_type text/html;
return 'nginx-v1';
}
}
www-v2
#获取客户端真实IP
set_real_ip_from 10.0.0.0/;
set_real_ip_from 192.168.0.0/;
set_real_ip_from 172.16.0.0/;
set_real_ip_from 100.0.0.0/;
set_real_ip_from 127.0.0.1;
real_ip_header X-Forwarded-For;
real_ip_recursive on;
#日志相关格式配置
log_format json '{"@timestamp":"$time_local",'
'"podname":"$hostname",'
'"clientip":"$remote_addr",'
'"request":"$request",'
'"status":"$status",'
'"forwarded_proto":"$http_x_forwarded_proto",'
'"scheme":"$scheme",'
'"request_method": "$request_method",'
'"size":"$body_bytes_sent",'
'"request_time":"$request_time",'
'"upstreamtime":"$upstream_response_time",'
'"upstreamhost":"$upstream_addr",'
'"http_host":"$host",'
'"url":"$uri",'
'"forwarded_for":"$http_x_forwarded_for",'
'"referer":"$http_referer",'
'"agent":"$http_user_agent"}'; access_log /dev/stdout json;
error_log /dev/stderr error;
server {
location / {
default_type text/html;
return 'nginx-v2';
}
}
www-proxy
#获取客户端真实IP
set_real_ip_from 10.0.0.0/;
set_real_ip_from 192.168.0.0/;
set_real_ip_from 172.16.0.0/;
set_real_ip_from 100.0.0.0/;
set_real_ip_from 127.0.0.1;
real_ip_header X-Forwarded-For;
real_ip_recursive on;
#日志相关格式配置
log_format json '{"@timestamp":"$time_local",'
'"podname":"$hostname",'
'"clientip":"$remote_addr",'
'"request":"$request",'
'"status":"$status",'
'"forwarded_proto":"$http_x_forwarded_proto",'
'"scheme":"$scheme",'
'"request_method": "$request_method",'
'"size":"$body_bytes_sent",'
'"request_time":"$request_time",'
'"upstreamtime":"$upstream_response_time",'
'"upstreamhost":"$upstream_addr",'
'"http_host":"$host",'
'"url":"$uri",'
'"forwarded_for":"$http_x_forwarded_for",'
'"referer":"$http_referer",'
'"agent":"$http_user_agent"}'; access_log /dev/stdout json;
error_log /dev/stderr error;
server {
location / {
proxy_http_version 1.1;
proxy_pass http://www;
}
}
挂载
# oc set volume dc/www-v1 --add --overwrite --name=config-volume --mount-path=/etc/nginx/conf.d --source='{"configMap": { "name": "www-v1"}}'
# oc set volume dc/www-v2 --add --overwrite --name=config-volume --mount-path=/etc/nginx/conf.d --source='{"configMap": { "name": "www-v2"}}'
# oc set volume dc/www-proxy --add --overwrite --name=config-volume --mount-path=/etc/nginx/conf.d --source='{"configMap": { "name": "www-proxy"}}'
为了方便测试www-proxy 需要绑定外部Ingress 比如openshif route
apiVersion: route.openshift.io/v1
kind: Route
metadata:
name: www-proxy
namespace: dev
spec:
host: www-proxy.ingress.com
to:
kind: Service
name: www-proxy
port:
targetPort:
2、路由流量
默认情况下在内网网络访问www应用,可以看出来流量是轮询的
# curl www-proxy.ingress.com
nginx-v2
nginx-v2
nginx-v1
nginx-v2
nginx-v1
nginx-v1
创建istio VirtualService、DestinationRule 路由流量
kind: VirtualService
metadata:
name: www-intranet
namespace: dev
spec:
hosts:
- www
http:
- route:
- destination:
host: www
subset: v2
---
apiVersion: networking.istio.io/v1alpha3
kind: DestinationRule
metadata:
name: www
namespace: dev
spec:
host: www
subsets:
- labels:
version: v1
name: v1
- labels:
version: v2
name: v2
trafficPolicy:
loadBalancer:
simple: ROUND_ROBIN
这里的http要对应Service -name 的值
测试一下,此时应该只会返回"nginx-v2"
# curl www-prxoy.ingress.com
nginx-v2
nginx-v2
nginx-v2
nginx-v2
nginx-v2
根据权重路由流量
spec:
hosts:
- www
http:
- route:
- destination:
host: www
subset: v1
weight:
- destination:
host: www
subset: v2
weight:
测试一下
# curl www-proxy.ingress.com
nginx-v1
nginx-v2
nginx-v2
nginx-v2
nginx-v2
nginx-v1
nginx-v2
nginx-v2
下面介绍不通过www-proxy直接路由外部流量,需要额外创建istio Gateway并和VirtualService绑定
apiVersion: networking.istio.io/v1alpha3
kind: Gateway
metadata:
name: default-gateway
namespace: dev
spec:
selector:
istio: ingressgateway
servers:
- hosts:
- '*'
port:
name: http
number:
protocol: HTTP
---
kind: VirtualService
metadata:
name: www
namespace: dev
spec:
gateways:
- default-gateway
hosts:
- www.ingress.com
http:
- route:
- destination:
host: www
subset: v1
---
apiVersion: route.openshift.io/v1
kind: Route
metadata:
labels:
app: istio-ingressgateway
chart: gateways
heritage: Tiller
istio: ingressgateway
release: istio
name: www
namespace: istio-system
spec:
host: www.ingress.com
port:
targetPort: http2
to:
kind: Service
name: istio-ingressgateway
注意如果没有外部ingress 使用NodePort的方式引入流量,并且Gateway和VirtualService任意一个hosts没有*,这时候Gateway无法识别具体的host域名
那么可以修改istio-ingressgateway的Deployment用hostPort直接暴露80和443端口,在把istio-ingressgateway的Pod绑定到固定的节点上运行
...
- containerPort:
hostPort:
protocol: TCP
- containerPort:
hostPort:
protocol: TCP
....
下面测试一下
# curl www.ingress.com
nginx-v1
nginx-v1
nginx-v1
nginx-v1
nginx-v1
istio1.1(openshift) 流量路由的更多相关文章
- Istio(五):使用服务网格Istio进行流量路由
目录 一.模块概览 二.系统环境 三.简单路由 3.1 简单路由 四.Subset和DestinationRule 4.1 Subset 和 DestinationRule 4.2 Destinati ...
- 通过 Traefik 使用 Kubernetes Service APIs 进行流量路由 (http,https,金丝雀发布)
文章转载自:https://mp.weixin.qq.com/s?__biz=MzU4MjQ0MTU4Ng==&mid=2247490229&idx=1&sn=ca817054 ...
- Oceanus:美团HTTP流量定制化路由的实践
背景简述 Oceanus是美团基础架构部研发的统一HTTP服务治理框架,基于Nginx和ngx_lua扩展,主要提供服务注册与发现.动态负载均衡.可视化管理.定制化路由.安全反扒.session ID ...
- istio1.0.2配置
项目的组件相对比较复杂,原有的一些选项是靠 ConfigMap 以及 istioctl 分别调整的,现在通过重新设计的Helm Chart,安装选项用values.yml或者 helm 命令行的方式来 ...
- Istio中的流量配置
Istio中的流量配置 目录 Istio中的流量配置 Istio注入的容器 Istio-init istio-proxy Envoy架构 Pilot-agent生成的初始配置文件 Envoy管理接口获 ...
- istio流量管理:非侵入式流量治理
在服务治理中,流量管理是一个广泛的话题,一般情况下,常用的包括: 动态修改服务访问的负载均衡策略,比如根据某个请求特征做会话保持: 同一个服务有多版本管理,将一部分流量切到某个版本上: 对服务进行保护 ...
- Nginx动态路由的新姿势:使用Go取代lua
导语: 在Nitro 中, 我们需要一款专业的负载均衡器. 经过一番研究之后,Mihai Todor和我使用Go构建了基于Nginx.Redis 协议的路由器解决方案,其中nginx负责所有繁重工作, ...
- istio路由配置
istio路由配置 istio的代理配置参考文档: 中文文档: https://istio.io/zh/docs/reference/config/istio.networking.v1alpha ...
- 通过流量清理防御DDoS
导读 在2018年2月,世界上最大的分布式拒绝服务(DDoS)攻击在发起20分钟内得到控制,这主要得益于事先部署的DDoS防护服务. 这次攻击是针对GitHub–数百万开发人员使用的主流在线代码管理服 ...
随机推荐
- Amazon DynamoDB
- JavaScript中定义函数的几种方式
函数的组成:函数名 + 函数体 1.使用function关键字定义函数 -- 具有优先级,优先将function关键字定义的函数优先执行 function functionName(arg0, ar ...
- Android开发 SpannableString开发详解
前言 SpannableString,是google提供用来处理富文本的功能类.支持很多文本内容的效果变化.另外,它也是Android实现富文本编辑器的关键. 关键API详解 String conte ...
- Error configuring application listener of class [org.springframework.web.util.Log4jConfigListener]
1.启动项目发现如下错误: 严重: Error configuring application listener of class [org.springframework.web.util.Log4 ...
- ERROR in xxx.js from UglifyJs
在打包项目的时候,出现如下的错误: 经过搜索找到原因: 这是因为webpack在打包vue文件时没有成功转换ES6的语法. 解决方案 解决方法很简单,加入babel-preset-es2015插件即可 ...
- (转)第02节:在Canvas上画简单的图形
我们现在已经可以在HTML中使用Fabric.js库了,那这节我们就详细的学习一下如何在canvas上画出简单的图形. 在画东西之前我们需要了解画任何东西的基本三个步骤: 声明画布(canvas),用 ...
- Docker系列(十):Kubernetes集群入门
kubenetes安装 官网:https://github.com/kubernetes/kubernetes/blob/release-1.0/docs/getting-started- guide ...
- elasticsearch复合查询
查询最近一小时内data.@level字段为Error的日志并按date倒序排列,输出最近10条,只输出[date,message]两个字段 GET events*/_search { &qu ...
- 在 Node.js 中引入模块:你所需要知道的一切都在这里
本文作者:Jacob Beltran 编译:胡子大哈 翻译原文:http://huziketang.com/blog/posts/detail?postId=58eaf471a58c240ae35bb ...
- elasticsearch 中文API 基于查询的删除(九)
基于查询的删除API 基于查询的删除API允许开发者基于查询删除一个或者多个索引.一个或者多个类型.下面是一个例子. import static org.elasticsearch.index.que ...