注意:目前只支持的kubernetes版本为1.15.x ,高版本能使用,但是会有部分资源无法显示。目前官方暂无支持高版本的计划日期。
简介
Wayne 是一个通用的、基于 Web 的 Kubernetes 多集群管理平台。通过可视化 Kubernetes 对象模板编辑的方式,降低业务接入成本,拥有完整的权限管理系统,适应多租户场景,是一款适合企业级集群使用的发布平台。
Wayne 已大规模服务于 360 搜索,承载了内部绝大部分业务,稳定管理了近千个业务,上万个容器,运行了两年多时间,经受住了生产的考验。
命名的起源:360 搜索私有云团队多数项目命名都来源于 DC 漫画的角色,Wayne 也不例外,Wayne 是声名显赫的超级英雄蝙蝠侠 Bruce Wayne 的名字。
项目地址:https://github.com/Qihoo360/wayne.git
架构图
整体采用前后端分离的方案,其中前端采用 Angular 框架进行数据交互和展示,使用 Ace 编辑器进行 Kubernetes 资源模版编辑。后端采用 Beego 框架做数据接口处理,使用 Client-go 与 Kubernetes 进行交互,数据使用 MySQL 存储。
[
Wayne 平台涉及到的基本概念如下:
Wayne | Kubernetes |
---|---|
部门 | Namespace, 为 Kubernetes 集群提供虚拟的隔离作用,详细参考 Namespace 。Wayne 的部门可以对应 Kubernetes 的任意 Namespace, 具体参见配置文档。 |
项目 | 无 Kubernetes 对应概念。是 Wayne 平台为了组织 Kubernetes 的资源虚拟出来的概念。项目下可以包含 Kubernetes 的资源,例如 Deployment,Service 等 |
部署 | Deployment,您在 Deployment 对象中描述了所需的状态,Deployment 控制器以受控速率将实际状态更改为所需状态。详细参考 Deployment 。 |
状态副本集 | StatefulSet,用来管理有状态应用,可以保证部署和 scale 的顺序,详细参考 StatefulSet 。 |
守护进程集 | DaemonSet,保证在每个 Node 上都运行一个容器副本,常用来部署一些集群的日志、监控或者其他系统管理应用,详细参考 Daemonset 。 |
计划任务 | CronJob,Job负责批处理任务,即仅执行一次的任务,它保证批处理任务的一个或多个容器成功结束。CronJob是基于调度的Job执行将会自动产生多个job,调度格式参考Linux的cron系统,详细参考 CronJob 。 |
负载均衡 | Service,Kubernetes Service 是一个抽象,它定义了一组逻辑 Pod 和一个访问它们的策略。详细参考 Service 。 |
路由 | Ingress,是用来聚合集群内服务的方式,对应的是 Kubernetes 的 Ingress 资源,后端使用了 Nginx Controller 来处理具体规则。Ingress 可以给 service 提供集群外部访问的 URL、负载均衡、SSL termination、HTTP 路由等。详细参考 Ingress 。 |
配置集 | ConfigMap,存放应用的配置信息。详细参考 ConfigMap |
加密字典 | Secret,存放一些敏感配置,例如密码,证书等信息。详细参考 Secret |
存储索取 | PersistentVolumeClaim(PVC),满足用户对于持久化存储的需求,用户将 Pod 内需要持久化的数据挂载至存储卷,实现删除 Pod 后,数据仍保留在存储卷内。 |
安装
克隆项目
git clone https://github.com/Qihoo360/wayne.git[root@master01 kubernetes]# pwd/root/k8s/wayne/hack/kubernetes[root@master01 kubernetes]# lsmysql.yaml wayne-backend.yaml wayne-frontend.yaml
安装数据库
Wayne 依赖 MySQL ,其中 MySQL 是必须的服务,用户存储系统的各种数据。
kubectl apply -f hack/kubernetes/mysql.yaml
默认数据未进行持久化,实际使用需要数据持久化,避免数据丢失
数据库初始化
自动初始化(推荐)
Wayne 启动会自动创建数据库并初始化数据,使用自动初始化数据库的方式请勿手动创建数据库,否则系统检测到数据库已存在会跳过数据初始化步骤!
手动初始化
如果您的环境不允许自动创建数据库,可以使用手动初始化数据的方式。
1.创建数据库
CREATE DATABASE `wayne` CHARACTER SET utf8 COLLATE utf8_general_ci;
2.生成创建表结构 SQL
make sqlall
3.生成数据库初始化 SQL
make initdata
安装backend服务
在 hack/kubernetes/wayne-backend.yaml 中按照配置文档配置好Configmap相关的信息(例如数据库链接等信息)
如果使用的是hack/kubernetes/mysql.yaml 中启动的 MySQL,可以暂时不修改配置文件。默认配置文件中通过集群内部域名访问 MySQL。
kubectl apply -f hack/kubernetes/wayne-backend.yaml
tarefik代理backend服务,注意这里一定要用https 不然访问前端时前端请求后端页面报错如下
apiVersion: traefik.containo.us/v1alpha1kind: IngressRoutemetadata: name: wayne-backend namespace: waynespec: entryPoints: - websecure routes: - match: Host(`wayne-backend.baixue.fun`) kind: Rule services: - name: wayne-backend port: 8080 tls: certResolver: myresolver
由于前后端使用 JWT Token 通信,生产环境一定要重新生成 RSA 文件,确保安全,测试使用可以忽略该步骤。生成 RSA 加密对命令如下:
$ ssh-keygen -t rsa -b 2048 -f jwtRS256.key$ # Don't add passphrase$ openssl rsa -in jwtRS256.key -pubout -outform PEM -out jwtRS256.key.pub
这个文件默认位于容器的/opt/wayne/apikey 目录下,实际使用我们可能需要挂载到该目录下,具体由配置文件中该段定义:
RsaPrivateKey = "./apikey/rsa-private.pem"RsaPublicKey = "./apikey/rsa-public.pem"
安装frontend服务
修改hack/kubernetes/wayne-frontend.yaml中的Configmap,找到config.js这个key所对应的内容,将"nodeip"替换为我们上面用traefik代理的后端服务的域名,之后启动前端:
$ kubectl apply -f hack/kubernetes/wayne-frontend.yaml
traefik代理后端
apiVersion: traefik.containo.us/v1alpha1kind: IngressRoutemetadata: name: wayne namespace: wayne annotations: kubernetes.io/ingress.class: "traefik"spec: entryPoints: - websecure routes: - match: Host(`wayne.baixue.fun`) kind: Rule services: - name: wayne-frontend port: 80 tls: certResolver: myresolver
我们此时可以访问https://wayne.baixue.fun登录,默认管理员账号 admin:admin
创建集群
后台点击集群列表-> 关联集群
创建集群字段说明:
名称:集群名称,英文简写,后续会使用此名称作为集群调用参数,例如 K8S
Master : Kubernetes Apiserver 地址
kubeConfig: 链接 Apiserver 的配置文件。配置示例:
kind: ConfigapiVersion: v1preferences: {}clusters:- name: k8s-dev cluster: server: 'https://10.10.10.10' certificate-authority-data: base64encodeusers:- name: admin user: client-certificate-data: base64encode client-key-data: base64encodecontexts:- name: k8s-dev-context context: cluster: k8s-dev user: admin namespace: defaultcurrent-context: k8s-dev-context
这里我们可以使用使用默认的config文件,也可以生成一个具有特殊权限的config文件
集群状态:目前有两种状态,在线和维护中。集群需要临时维护时,可以把集群状态设置为维护中,避免用户误操作影响维护中的集群。
MetaData:集群元数据(可选)
配置示例
# 可选# 由于当前 Wayne 并没有完全管理 Kubernetes 资源(后续会完全管理 Kubernetes 资源),系统集成了 Kubernetes Dashboard 方便查看 Kubernetes 资源。# 此地址 schema 必须与平台一致,例如平台使用 https 部署,则 kubernetesDashboard 地址也必须为 httpskubernetesDashboard: 'http://10.10.10.10'# 可选# 如果配置了此选项,则当前集群创建 PV 时如果类型为 RBD 会自动替换此配置,避免了每次重复填写 rbd 配置rbd: monitors: - '10.10.10.10:6789' fsType: xfs pool: k8s_pool user: xxx keyring: xxx# 可选。# 如果配置了此选项,则当前集群创建 PV 时如果类型为 cephfs 会自动替换此配置,避免了每次重复填写 cephfs 配置cephfs: monitors: - 10.10.10.10 user: xxx secret: xxx# 可选。# env:默认增加的环境变量,默认为所有容器添加默认环境变量,如 IDC 等信息。env: - name: WAYNE_IDC value: k8s# 可选。# imagePullSecrets:默认增加的拉取镜像 Secret,如果是从私有仓库拉取镜像并且需要拉取权限,可以配置此选项。imagePullSecrets: - name: wayne.cloud-secret
创建后我们就可以点击左侧边栏的kubernetes 查看集群资源概览了,注意目前wayne最高值支持的集群版本为1.15,高于此版本无法显示deployment,replaicaset, statefulset资源,但是不影响查看pod
deployment,replaicaset, statefulset资源无法显示,并且后端服务会报错Failed to list *v1beta1.Deployment: the server could not find the requested resource
目前官方短期内不会支持1.15+ 以上版本,看issue发现这个问题19年中就已经出现,官方态度是后期会开发,但是大概360内部使用了1.15版本,所以对高级版本支持力度不是很高。
创建命令空间
首先进入后台创建命名空间
我们可以切换到编辑模式看看创建了什么
提交后会在集群内创建一个名为wayne-demo的namespace
创建项目
我们在前台切换到我们新建的命名空间下创建项目
点击新建的项目可以进入
创建configmap
点击高级配置可以查看详情
点击发布即可把这个configmap部署
创建secert
这里可以选择secert的类型,这里会自动base64编码