在很多场景下,单靠几个在Infra节点上的Router进行服务请求的转发是不够的,项目中很多时候都有流量隔离的需求,主要场景在于:

  • 一个集群中的不同的环境的流量隔离需求,比如开发走几个Router,生产走另外几个Router.
  • 不同项目的流量不希望相互影响,希望保持独立
  • 为保证关键服务的SLA,需要单独的流量入口

Openshift集群支持大规模节点环境部署,这种环境下做负载的分区就很有必要了。因为所有的流量集中在几个Infra节点上,性能

和扩展性都有问题。Openshift的Router提供了Shading的功能,下面我们来看看具体的实现

1.Router Shading的架构

2.前端负载均衡说明

在Router节点前端应有F5或者软件负载均衡器,根据域名进行路由到不同的router

Router部署不一定部署在infra节点上,Router部署以后采用hostnetwork绑定宿主机的IP和端口。

域名

负载均衡vip

Router IP

apps-prod.example.com

10.30.0.33(举例)

192.168.56.106

192.168.56.104(暂时没有)

apps-dev.example.com

10.30.0.35

192.168.56.103

3.建立Router

打开绑定主机网络权限

oc adm policy add-scc-to-user hostnetwork -z router

创建router-dev,对应开发环境,创建router-prod对应生产环境

[root@master openshift-ansible]# oc adm router router-dev --replicas= --force-subdomain='${name}-${namespace}.apps-dev.example.com'
info: password for stats user admin has been set to gGaytR7cPj
--> Creating router router-dev ...
warning: serviceaccounts "router" already exists
warning: clusterrolebindings.authorization.openshift.io "router-router-dev-role" already exists
deploymentconfig.apps.openshift.io "router-dev" created
service "router-dev" created
--> Success [root@master openshift-ansible]# oc adm router router-prod --replicas= --force-subdomain='${name}-${namespace}.apps-prod.example.com'
info: password for stats user admin has been set to 49wuWv7F6O
--> Creating router router-prod ...
warning: serviceaccounts "router" already exists
warning: clusterrolebindings.authorization.openshift.io "router-router-prod-role" already exists
deploymentconfig.apps.openshift.io "router-prod" created
service "router-prod" created
--> Success

设置标签绑定Router和相应的节点

给Router设置namespace_label.

oc set env dc/router-prod NAMESPACE_LABELS="router=prod"
oc set env dc/router-dev NAMESPACE_LABELS="router=dev" oc label node node3.example.com "router=prod"
oc label node master.example.com "router=dev"

编辑router dc的node-selector

oc edit dc/router-dev -n default

在spec->template->spec下
添加
nodeSelector:
router: dev oc edit dc/router-prod -n default 在spec->template->spec下
添加
nodeSelector:
router: prod

然后确保启动成功

[root@master ~]# oc get pods -n default -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE
docker-registry--q5t5m / Running 22d 10.130.1.110 node1.example.com <none>
registry-console--8m2mq / Running 25d 10.128.0.122 master.example.com <none>
router--w7bgw / Running 22d 192.168.56.104 node1.example.com <none>
router-dev--srvcz / Running 3h 192.168.56.103 master.example.com <none>
router-prod--vx8bw / Running 1m 192.168.56.106 node3.example.com <none>

4.建立项目及应用

建立一个项目project-1用于生产环境prod,同时给project-1打标签

[root@master openshift-ansible]# oc new-project project-
Now using project "project-1" on server "https://master.example.com:8443". [root@master ~]# oc label namespace project- router=prod
namespace/project- labeled

部署应用,并建立Route,发现Project1下建立的route自动带有apps-prod.example.com的域名

建立一个project-2用于开发环境dev,同时给project-2打标签

[root@master openshift-ansible]# oc new-project project-
Now using project "project-2" on server "https://master.example.com:8443". [root@master ~]# oc label namespace project- router=dev
namespace/project- labeled

部署应用,并建立Route

5.访问验证

因没有负载均衡器,在hosts文件中设置

192.168.56.106    tomcat-project-.apps-prod.example.com
192.168.56.103 project2tomcat-project-.apps-dev.example.com

指到正确的Router节点所在的node ip,应用能够正常访问

修改192.168.56.106为192.168.56.103或者其他router所在节点, 让请求路由到其他的Router节点,访问失败

6.域名规划

鉴于OpenShift具备这种负载分区的策略,可以比较灵活的规划Router的分布

相对的,也可以基于两种模式对Router暴露出去的域名进行规划。

  • 规划方案1:

    • 不同的数据中心成为二级域名,或者分地域,如dc1.a.com, dc2.a.com
    • 在数据中心上基于应用规划三级域名,如app1.dc1.a.com, app3.dc2.a.com
    • 应用提供的对外服务为 service1.app1.dc1.a.com, service2.app1.dc1.a.com
  • 规划方案2:

    • 直接以应用作为二级域名,如app1.a.com, app2.a.com
    • 应用提供的对外服务为 service1.app1.a.com, service2.app1.a.com

无论那种模式,都需要相应的域名,如app1.dc1.a.com或app1.a.com,对应上端的负载均衡地址存在于DNS解析记录。也就是DNS将最后的域名解析为OpenShift上Router上端的负载均衡地址。

OpenShift负载分区策略(Router Shading)的更多相关文章

  1. c数据库读写分离和负载均衡策略

    最近在学习数据库的读写分离和主从复制,采用的是一主多从策略,采用轮询的方式,读取从数据库的内容.但是,假如某一台从数据库宕机了,而客户端不知道,每次轮选到此从数据库,不都要报错?到网上查阅了资料,找到 ...

  2. 【Nginx(四)】Nginx配置集群 负载均衡策略

    1.Nginx常见的负载均衡策略 ip_hash (固定分发) 简介:根据请求按访问ip的hash结果分配,这样每个用户就可以固定访问一个后端服务器 场景:服务器业务分区.业务缓存.Session需要 ...

  3. Kafka分区策略

    Kafka分区策略 所谓分区策略是决定生产者将消息发送到哪个分区的算法.Kafka 为我们提供了默认的分区策略,同时它也支持你自定义分区策略. 常见的分区策略包含以下几种:轮询策略.随机策略 .按消息 ...

  4. nginx入门篇----负载均衡策略

    负载均衡策略 负载均衡策略:内置策略和扩展策略. 内置策略包括:轮询.加权轮询.IP hash:扩展策略包括:url hash.fair等 策略详细介绍 轮询:对前端的访问逐一分流到后端网络节点,类似 ...

  5. nginx 负载均衡策略

    nginx 负载均衡策略   1. 轮询轮询方式是nginx负载均衡的默认策略,根据每个server的权重值来轮流发送请求,例如:upstream backend {server backend1.e ...

  6. Dubbo负载均衡策略

    在集群负载均衡时,Dubbo提供了多种均衡策略,缺省为random随机调用. 可以自行扩展负载均衡策略,参见:负载均衡扩展Random LoadBalance 随机,按权重设置随机概率. 在一个截面上 ...

  7. Ribbon负载均衡策略配置

    在这里吐槽一句:网上很多文章真是神坑,你不看还好,看了只会问题越来越多,就连之前的问题都没有解决!!! 不多说了,Ribbon作为后端负载均衡器,比Nginx更注重的是请求分发而不是承担并发,可以直接 ...

  8. nginx系列10:通过upstream模块选择上游服务器和负载均衡策略round-robin

    upstream模块的使用方法 1,使用upstream和server指令来选择上游服务器 这两个指令的语法如下图: 示例: 2,对上游服务使用keepalive长连接 负载均衡策略round-rob ...

  9. Spring Cloud中的负载均衡策略

    在上篇博客(Spring Cloud中负载均衡器概览)中,我们大致的了解了一下Spring Cloud中有哪些负载均衡器,但是对于负载均衡策略我们并没有去详细了解,我们只是知道在BaseLoadBal ...

随机推荐

  1. Linux的shell终端常用快捷键

    参考: http://www.360doc.com/content/17/0627/09/44797135_666854802.shtml https://linux.cn/article-5660- ...

  2. LeetCode 137. Single Number II(只出现一次的数字 II)

    LeetCode 137. Single Number II(只出现一次的数字 II)

  3. 洛谷P1503 鬼子进村 [平衡树,STL]

    题目传送门 鬼子进村 题目背景 小卡正在新家的客厅中看电视.电视里正在播放放了千八百次依旧重播的<亮剑>,剧中李云龙带领的独立团在一个县城遇到了一个鬼子小队,于是独立团与鬼子展开游击战. ...

  4. Python之路【第三篇】:文件操作

    一.文件操作步骤 打开文件,得到文件句柄并赋值给一个变量 通过句柄对文件进行操作 关闭文件 歌名:<大火> 演唱:李佳薇 作词:姚若龙 作曲:马奕强 歌词: 有座巨大的停了的时钟 倾倒在赶 ...

  5. DP 题集 2

    关于 DP 的一些题目 String painter 先区间 DP,\(dp[l][r]\) 表示把一个空串涂成 \(t[l,r]\) 这个子串的最小花费.再考虑 \(s\) 字符串,\(f[i]\) ...

  6. GPFS 安装测试

    简介 GPFS(General Parallel File System ,GPFS) 是 IBM 公司第一个共享文件系统,起源于 IBM SP 系统上使用的虚拟共享磁盘技术( VSD ).作为这项技 ...

  7. New Year Tree 【DFS序+线段树区间查询修改+二进制保存状态】

    题目链接[http://codeforces.com/problemset/problem/620/E] 题意:给出n个数,每个数有一个初始的颜色.由这n个数组成一颗树.有两种操作1.将以节点u为根的 ...

  8. android 捕获所有异常 未捕获的异常

    韩梦飞沙  韩亚飞  313134555@qq.com  yue31313  han_meng_fei_sha 定义一个类 继承 应用, 实现 未捕获异常处理器 uncaughtExceptionHa ...

  9. 「SCOI2014」方伯伯的商场之旅

    「SCOI2014」方伯伯的商场之旅 题目描述 方伯伯有一天去参加一个商场举办的游戏.商场派了一些工作人员排成一行.每个人面前有几堆石子.说来也巧,位置在 \(i\) 的人面前的第 \(j\) 堆的石 ...

  10. [转]ADT中通过DDMS导入文件出错ddms transfer error: Read-only file system,Failed to push selection: Read-only file system

    [已解决] 原文  http://www.crifan.com/ddms_import_file_error_transfer_error_read_only_file_system/ 想要通过adt ...