Wayne是笔者无意之间刷文章了解到的,简单使用之后发现能解决当前眼下诸多问题,出于推动公司容器化进程的原因选择开始使用,当前所有环境都已经在使用中。借助官方的介绍Wayne 是一个通用的、基于 Web 的 Kubernetes 多集群管理平台。通过可视化 Kubernetes 对象模板编辑的方式,降低业务接入成本,拥有完整的权限管理系统,适应多租户场景,是一款适合企业级集群使用的发布平台。
附上:
喵了个咪的博客:w-blog.cn
wayne官方Git地址:https://github.com/Qihoo360/wayne/blob/master/README-CN.md
PS:当前最新版本 v1.8.6,官方暂时不支持版本升级能力,不要轻易尝试版本升级;
Wayne 已大规模服务于 360 搜索,承载了内部绝大部分业务,稳定管理了近千个业务,上万个容器,运行了两年多时间,经受住了生产的考验。
一、Wayne介绍
要引入任何一个工具首先需要看到问题,如果盲目的引入工具提出要求,有时候不但达不到效果还增加了研发成本。
当时笔者在公司推动容器化陷入了一个僵局,环境都已经准备好了,但是有很多遗留的包袱需要迁移里面就涉及到如下的难点了:
- 基础yaml文件难以管理,之前使用git维护不便/更新迟滞
- 开发水平不一,编写yaml文件经常出现各种问题
- 开发环境需要排查问题登录容器shell,需要查看日志
- 使用K8S-Dashbord权限无法把控,开发人员会不小心删除了别人内容
- 强制资源限制,避免开发使用资源过度,优化不足
- 和CI/CD对接,自动化更新不依赖于kubectl避免控制权泄露
- 测试/集成/预发/生产,多环境管理难,原生Dashbord使用繁琐
当面临到一定规模的容器化场景都会多多少少遇到这些问题,估计360也是遇到了这些问题但是并没有特别好的解决方案才开发了这套系统。
多租户隔离支持LDAP,完备权限体系,命名空间 -> 项目 -> 资源
我们已团队建设出多个命名空间对应K8S的命名空间,项目作为团队内部的项目分组,在到对应不同的资源
PS:这里推荐两种区分环境的方法:
一种是多环境绑定在一起,通过部署名称来区分环境,并且分离测试集成(开发自助)和预发生产(运维管理)Wayne实例,保障不越权,避免误操作(推荐);
另外一种就是全部运维管理,通过一套模板控制所有环境;
基于独立数据库的Yaml配置存储,强制资源限制
OpenApi+Token校验机制提供足够灵活性
支持多集群同时管理,在线WebShell+日志查看能力
Wayne架构图
Wayne整体采用前后端分离的方案,其中前端采用 Angular 框架进行数据交互和展示,使用 Ace 编辑器进行 Kubernetes 资源模版编辑。后端采用 Beego 框架做数据接口处理,使用 Client-go 与 Kubernetes 进行交互,数据使用 MySQL 存储。
二、Wayne安装
需要准备好 docker 环境 和 docker-compose 可以参考笔者之前的文章:
git clone https://github.com/Qihoo360/wayne.git
cd wayne/hack/docker-compose
配置文件修改
wayne分为两个组件 wayne-backend 和 wayne-frontend
- wayne-backend:主要API
- wayne-frontend:WEB界面
锁定版本,如果使用latest可能会遇到版本更新导致的不兼容,最新版本 v1.8.6 上一稳定版本 v1.7.1都可以选择
vim docker-compose.yaml
image: 360cloud/wayne-backend:v1.8.6
image: 360cloud/wayne-frontend:v1.8.6
Wayne采用前后端分离方式,如果需要在内网或外网访问wayne系统需要访问地址配置,本地测试可以先用localhost
vim conf/config.js
window.CONFIG = {
URL: 'http://yourip:8080',
RAVEN: false,
RAVEN_DSN: 'RAVEN_DSN'
};
运行程序
docker-compose up -d
Creating docker-compose_mysql_1 ... done
Creating docker-compose_wayne-backend_1 ... done
Creating docker-compose_wayne-frontend_1 ... done
访问 http://localhost:4200/ 即可,默认用户名密码admin:
配置独立Mysql运行
一般来说我们会使用独立mysql来存储元数据保障数据的稳定,如果Wayne丢失了数据库回复会非常的麻烦
删除配置文件中的mysql和 link
vim docker-compose.yaml
mysql:
image: mysql:5.6.41
environment:
MYSQL_ROOT_PASSWORD: "root"
networks:
- default
expose:
- "3306"
ports:
- "3306:3306"
rabbitmq:
environment:
RABBITMQ_NODENAME: "rabbit"
RABBITMQ_DEFAULT_USER: "guest"
RABBITMQ_DEFAULT_PASS: "guest"
image: rabbitmq:3.7.8-management
networks:
- default
expose:
- "5672"
ports:
- "5672:5672"
depends_on:
- mysql
修改配置文件
vim conf/app.conf
# database configuration:
## mysql
DBName = "wayne"
DBTns = "tcp(mysql:3306)"
DBUser = "root"
DBPasswd = "root"
DBLoc = "Asia%2FShanghai"
DBConnTTL = 30
OAuth2 OR LDAP
vim conf/app.conf
# oauth2
[auth.oauth2]
enabled = false
redirect_url = "https://www.wayne.cloud"
client_id = client
client_secret = secret
auth_url = https://example.com/oauth2/v1/authorize
token_url = https://example.com/oauth2/v1/token
api_url = https://example.com/oauth2/v1/userinfo
# If your OAuth 2.0-based authorization service does not have email, name, and dispaly fields, use mapping criteria.
api_mapping = name:name,email:email,display:display
# ldap config
# enable ldap login
[auth.ldap]
enabled = false
ldap_url = ldap://127.0.0.1
ldap_search_dn = "cn=admin,dc=example,dc=com"
ldap_search_password = admin
ldap_base_dn = "dc=example,dc=com"
ldap_filter =
ldap_uid = cn
ldap_scope = 2
ldap_connection_timeout = 30