使用Flomesh增强Openshift网络能力

概要

OpenShift是一个kubernetes的发行版,有很多增强的特性,很多企业用户使用openshift。Flomesh在三个方面可以改进和增强OpenShift的功能和能力:

  1. 作为Ingress,替代OpenShift默认基于Haproxy的Router。相比默认的Router有大量的改进,细节可以参考本文最后的附表
  2. 作为微服务的网关。比如在一个namespace(project)内部署了若干基于spring boot的服务,作为zuul或者spring gateway的替代品,实现微服务网关相关的功能
  3. 对服务间调用(东西流量)实现管理,包括协议转换、限速、熔断、访问控制、流量统计等。这个部分不在该文档中,后续会有单独的文档介绍这个场景的使用

免责声明

该文档可以作为参考文档和学习使用,flomesh团队会尽力维护文档以及文档所描述的产品和方案的准确性和可靠性,但是不承诺没有缺陷。

该文档所述方案和配套的软件、配置、脚本等,有成功的商业应用案例,但是flomesh团队不承诺基于该文档和该文档所配套提供的程序、配置、脚本等保障;使用这些程序、脚本以及配置所产生的责任需要由读者自己衡量和承担。

版权与使用

该文档,以及文档提供的软件、脚本、配置,版权为flomesh团队所有或者软件原作者所有,具体的包括:

  • 该文档和方案欢迎读者使用以及转载,对于非原文转发,请注明来源与版权
  • 该文档所涉及的软件,可以自由下载和使用,但是flomesh团队不建议使用在生产环境,也不对这些软件提供承诺和保障
  • 该文档所提供软件部分组件属于flomesh团队知识产权,并非开源软件(Open Source Software)或者自由软件(freeware),可以用于学习、教育、个人使用,但是不可以作为盈利目的使用;且不可以打包到另外的软件中作为组件。flomesh正在准备这些软件的开源版本,感兴趣的读者可以关注
  • 该文档所述方案包含基于Kong(https://github.com/kong/kong)社区版的改进版本,主要是性能、功能、以及对mysql的支持。对于生产目的使用,flomesh团队推荐使用企业版Kong(https://konghq.com/)。该文档所述组件和功能,都是兼容Kong企业版的

部署架构

deployment architecture

Flomesh 架构参考

需要指出的是:

每个分区中Fort组件中的 nameguid必须是一致的。

准备工作

  1. 在OpenShift创建一个名为 flomesh的项目。

  2. 创建一个 名为 flomesh的Service Account(本项目中提供的脚本会自动创建项目与ServiceAccount)。由于网关代理要开启主机端口,因此需要hostnetwork的安全上下文(Security Context,以下简称scc)。

    # oc login -u system:admin
    # oc adm policy add-scc-to-user hostnetwork system:serviceaccount:flomesh:flomesh
    # oc adm policy add-scc-to-user anyuid system:serviceaccount:flomesh:flomesh
  1. 项目中默认的运行端口为1024以上。如果需要端口运行在1024以下,例如80或443等,则需要开启privileged这个scc。
    # oc login -u system:admin
    # oc adm policy add-scc-to-user privileged system:serviceaccount:flomesh:flomesh
  1. 为了保证网关运行性能以及防止端口冲突,建议通过nodeSelector将网关进程固定在指定的节点上,本项目中使用了gwnode=true这个标签(Label)。需要确保运行网关的节点上有此标签:
    # oc get nodes -l "gwnode=true"
    NAME                      STATUS    AGE       VERSION
    poc-infra1.ocp.xxxx.com   Ready     120d      v1.6.1+5115d708d7
    poc-infra2.ocp.xxxx.com   Ready     120d      v1.6.1+5115d708d7
    poc-infra3.ocp.xxxx.com   Ready     120d      v1.6.1+5115d708d7

如果没有,需要使用oc label命令创建,命令如下:

    # oc label node/<node名称> gwnode=true
  1. 将需要的镜像推送到镜像仓库中。下面配置过程中需要用到镜像仓库的地址与项目名称(也称为namespace)。 大致命令如下:
    # docker load -i aiur-0.2.0-41.tar.gz
    # docker tag aiur:0.2.0-41 <registry地址>/<项目名称>/aiur:0.2.0-41
    # docker push <registry地址>/<项目名称>/aiur:0.2.0-41

需要依次将所有需要的镜像导入。

镜像可以从这里下载:

wget http://repo.flomesh.cn/images/fort-alpine-0.2.0-41.tar.gz
wget http://repo.flomesh.cn/images/aiur-alpine-0.2.0-41.tar.gz
wget http://repo.flomesh.cn/images/kong-alpine-1.2.2-25.tar.gz
wget http://repo.flomesh.cn/images/piped-alpine-0.1.0-54.tar.gz

安装步骤

完成配置后,执行install.sh脚本即可。 配置方法参考下一章参数配置。 安装脚本如下:

oc new-project flomesh
# 创建一个名为 flomesh 的新项目

oc annotate project/flomesh openshift.io/node-selector=
# 为了保证flomesh项目中的资源可以在任意节点上调度,需要修改node-selector的说明

# ConfigMap是每个组件的配置文件
oc create -f aiur-cm.yaml
# 用于flomesh-control-plane.

oc create -f fort-cm.yml
# 用于flomesh-gateway-admin.

oc create -f piped-cm.yml
# 用于flomesh-gateway-proxy.

oc create -f prom-cm.yaml
# 用于flomesh-control-plane.

oc create -f flomesh-sa.yml
oc adm policy add-scc-to-user hostnetwork  system:serviceaccount:flomesh:flomesh
oc adm policy add-scc-to-user anyuid system:serviceaccount:flomesh:flomesh
# 创建flomesh service account, 并在flomesh项目中给flomesh service account赋予响应的权限

oc process -f flomesh-control-plane-template.yaml -p AIUR_CONSOLE_PORT=8080 | oc create -f -
oc process -f flomesh-gateway-admin-template.yaml -p KONG_ADMIN_HTTPS_PORT=8544 -p KONG_ADMIN_PORT=8101 | oc create -f -
oc process -f flomesh-gateway-proxy-template.yaml -p KONG_PROXY_HTTPS_PORT=9543 -p KONG_PROXY_PORT=8100 |oc create -f -

# 处理模板,创建相关资源

注意: 与端口相关的配置不属于字符串(String)类型,因此不能再配置文件中进行配置,需要在处理模板时通过外部选项传入,即-p选项。

运行命令:

   # pwd
   <somewhere to this project>/flomesh-deploy-container/openshift
   # ./install.sh

检查部署状态

脚本运行完成之后,需要检查各个POD的状态:

# oc get pods -n flomesh
NAME                       READY     STATUS    RESTARTS   AGE
aiur-1-4gnlw               2/2       Running   0          13d
kong-admin-1-xm94z         2/2       Running   0          13d
kongproxy-4-r5cpw          2/2       Running   0          3d

确保每个POD的状态为Running,且每个POD中有2个容器。

本项目中提供了uninstall.sh脚本,用于回退安装。

上边涉及到的yaml和shell脚本,都可以从flomesh.cn/openshift下载:

wget http://flomesh.cn/openshift/install.sh
wget http://flomesh.cn/openshift/uninstall.sh
wget http://flomesh.cn/openshift/aiur-cm.yaml
wget http://flomesh.cn/openshift/fort-cm.yml
wget http://flomesh.cn/openshift/piped-cm.yml
wget http://flomesh.cn/openshift/prom-cm.yaml
wget http://flomesh.cn/openshift/flomesh-control-plane-template.yaml
wget http://flomesh.cn/openshift/flomesh-gateway-admin-template.yaml
wget http://flomesh.cn/openshift/flomesh-gateway-proxy-template.yaml

参数配置

1.aiur-cm.yaml

# 部分细节配置没有显示。
[aiur]
port = 8080
[db]
type = mysql
host = mysql.default.svc
port = 3306
username = aiur
password = Aiur.123
database = aiur

本文件中是Aiur组件连接数据库的配置,以及运行端口配置。

2.flomesh-control-plane-template.yaml

在模板文件的最下方,有parameters部分,即本文件的可配置部分(下同):

# 部分细节配置没有显示。
 - name: AIUR_CONSOLE_PORT
  description: "Aiur web console service port"
- name: REGISTRY_ADDRESS
  description: "Docker registry address for images"
- name: REGISTRY_PROJECT
  description: "Project name or namespace where images store"
- name: AIUR_IMAGE_VERSION
  description: "Aiur image release version"

这里配置的端口需要与上一步中aiur-cm.yaml的内容一致,另外需要配置所需镜像的信息,包括镜像仓库地址、项目名称以及相关镜像的版本。例如:

    docker-registry.default.svc:5000/polaristech/aiur-alpine:0.2.0-41

其中:

  • REGISTRY_ADDRESS 为: docker-registry.default.svc:5000
  • REGISTRY_PROJECT 为: polaristech
  • AIUR_IMAGE_VERSION 为: 0.2.0-41

3.flomesh-gateway-admin-template.yaml

与上一节类似:

# 部分细节配置没有显示。
- name: DATABASE_HOSTNAME
  description: "Hostname of Database on which kong is resident."
- name: DATABASE_PORT
  description: "Service port of database"
- name: DATABASE_USER
  description: "Database user for kong connection."
- name: DATABASE_PASSWORD
  description: "Password for Kong's database user"
- name: DATABASE_NAME
  description: "Kong Database name"
- name: PROXY_LISTEN_ADRESSES
  description: "Proxy listen addresses."
- name: ADMIN_LISTEN_ADRESSES
  description: "Admin listen addresses."
- name: KONG_ADMIN_PORT
  description: "admin listen port."
- name: KONG_ADMIN_HTTPS_PORT
  description: "admin listen https port."
- name: REGISTRY_ADDRESS
  description: "Docker registry address for images"
- name: REGISTRY_PROJECT
  description: "Project name or namespace where images store"
- name: KONG_IMAGE_VERSION
  description: "kong image release version"
- name: FORT_IMAGE_VERSION
  description: "fort image release version"

这里最重要的是数据库连接的相关信息,需要注意的是,KONG_ADMIN_PORT 应该与 PROXY_LISTEN_ADRESSES中的端口一致。

在高可用架构中,可能需要多个“gateway admin”这样的角色,可以拷贝多个该模板,并修改其中相应的配置名,即 app:name:表两个标签,以及ConfigMap的名字.<Ref: fort-cm.yaml>

4.flomesh-gateway-proxy-template.yaml

# 部分细节配置没有显示。
- name: DATABASE_CONNECTOR
  description: "Support PostgreSQL, MySQL, Cassandra"
- name: DATABASE_HOSTNAME
  description: "Hostname of Database on which kong is resident."
- name: DATABASE_PORT
  description: "Service port of database"
- name: DATABASE_USER
  description: "Database user for kong connection."
- name: DATABASE_PASSWORD
  description: "Password for Kong's database user"
- name: DATABASE_NAME
  description: "Kong Database name"
- name: PROXY_LISTEN_ADRESSES
  description: "Proxy listen addresses."
- name: ADMIN_LISTEN_ADRESSES
  description: "Admin listen addresses."
- name: KONG_PROXY_PORT
  description: "admin listen port."
- name: KONG_PROXY_HTTPS_PORT
  description: "admin listen https port."
- name: REGISTRY_ADDRESS
  description: "Docker registry address for images"
- name: REGISTRY_PROJECT
  description: "Project name or namespace where images store"
- name: KONG_IMAGE_VERSION
  description: "kong image release version"
- name: PIPED_IMAGE_VERSION
  description: "piped image release version"

这里的配置与上一节中的配置一致。 3.flomesh-gateway-admin-template.yaml

5.fort-cm.yaml

# 部分细节配置没有显示。
    [aiur]
    endpoint = http://aiur.flomesh.svc:8080
    poll_interval = 5

    [zone]
    name = default
    guid = 619b1d73-48c2-4460-95fb-01fd98628498
    sync_interval = 5
    tags =

    [zone.metrics]
    host = localhost
    port = 9999
    scrape_interval = 5
    scrapes[] = http://kongproxy.flomesh.svc:10000
    ;scrapes[] = http://<the second gateway proxy address>:10000
    ;scrapes[] = http://<the third gateway proxy address>:10000

    [kong.default]
    name = demo
    tags =
    admin_endpoint = http://localhost:8001

    [zone.registry]
    type = eureka
    endpoint = http://localhost
    login =

    ; type = kubernetes
    ; custom = false
    ; framework = 
    ; endpoint = https://localhost:6443
    ; mode = IngressIP
    ; token = <API token>
    ; ingress_ip = 127.0.0.1
    ; ingress_port = 9999

    ; type = zookeeper
    ; custom = false
    ; framework = dubbo
    ; endpoint = 192.168.33.10:2181
    ; recursive = false
    ; schema =
    ; auth =

    ; type = nacos
    ; custom = false
    ; framework = springboot
    ; endpoint = http://localhost:8848


kind: ConfigMap
metadata:
  creationTimestamp: null
  name: fort-cm-zone1
  • Section aiur: 管理gateway admin组件的aiur服务的访问地址,在OpenShift环境中,可以填写aiur服务的地址(即flomesh-control-plane中创建的服务)。
  • Section zone: 为每个分区(zone)的fort配置一个独立的名字和guid
  • Section zone.metrics: scrapes[] 可以写多行,即所有gateway代理的地址,用于获取性能监控数据。
  • Section kong.default: 给每个网关管理端配置一个名称,由于fort与网关管理端通常在一个部署中(同一个POD或者同一台机器),因此这里的地址通常为localhost,不必修改。
  • Section zone.registry: 用于配置服务发现,目前支持Eureka, kubernetes, zookeeper 以及 nacos等四种注册中心。配置方法可以参考配置文件中的注释部分。
  • ConfigMap的名字: 如果需要部署多个flomesh-gateway-admin,则需要创建多个此配置文件(configmap),并且在 gateway-admin-template.yaml 中引用。

6.flomesh-gateway-proxy-template.yaml

如果需要部署多个网关代理实例,只需要修改模板中的replicas变量:

44       replicas: 1

The number of replicas should be less or equal to the number of the nodes who has gwnode = true label. 网关实例的数量需要小于或者等于有gwnode = true标签的节点数。

访问验证

当所有Pod都运行起来以后,就可以通过浏览器访问:http://aiur-flomesh.apps.[你的域名].[你的域名后缀]/ 。比如我们的演示环境就是:http://aiur-default.apps.polaristech.io/。默认登录密码是admin / admin,登录后注意修改密码~

注意域名里的project name那个部分,默认是flomesh,所以域名是aiur-flomesh.*;如果用了别的project name,记得替换'flomesh',就是aiur-[你的项目名].[你的域名]。

Enjoy flomesh~


附表I: Flomesh作为Router的增强之处

下表简单的比较了openshift默认的router和Flomesh作为Router差异的主要部分;相同的功能没有对比;功能细节可以自己摸索对比

默认基于Haproxy的Router 基于Flomesh的Router
没有图形管理界面 有图形管理界面
没有流量可视化 提供了实时流量统计、访问拓扑等可视化功能
基于域名匹配来路由请求 基于复和条件,比如域名和路径等,来路由请求
没有访问控制。Haproxy主要是实现了反向代理和负载均衡的功能,缺乏访问控制 多种、细粒度的访问控制
haproxy的流量实时统计采用的是stats,流量历史数据依赖日志统计 Flomesh实现了实时的流量统计,以及基于prometheus的历史流量统计
缺乏流量控制能力,比如限流等 复杂灵活的流量控制。可以参考这里:http://flomesh.cn/doc/content.html#%E5%85%83%E5%8A%9F%E8%83%BD
缺少多租户特性 多租户支持,包括权限、工作流等
缺少配置的版本化管理能力 支持配置管理版本化,可以做回退等操作
不支持灰度发布 支持灰度发布
不支持Tracing 支持基于open tracing标准,也支持Skywalkings
API管理访问需要集成额外的产品,比如3Scale 集成的API管理能力,可以独立部署的APIMart
没有告警能力 提供对核心指标的监控和告警能力
没有多网关集中管理能力 实现多网关统一管理