Wayne - 360开源多租户K8S管理平台(介绍和安装)

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

本文由博客一文多发平台 OpenWrite 发布!

文振熙 CSDN认证博客专家 Go/GoLang PHP 分布式
六年技术研发经验、四年后端技术架构经验,带领管理过45+技术团队和技术架构团队,从零到一帮助公司组建了后端团队、 运维团队和大数据团队,并且不断演进推广前沿技术;

多年来一直坚持产出优质原创博文,共创作169篇原创博客,全网阅读量破百万,并且被CSDN开源社区授予CSDN认证专家,

参加或主导多个开源项目研发(PhalApi、GoCore、GoRSA、KT-connect);
已标记关键词 清除标记
相关推荐
1. 前言    Kubernetes作为Docker生态圈中重要一员,是Google多年大规模容器管理技术的开源版本,是产线实践经验的最佳表现 。如Urs Hölzle所说,无论是公有云还是私有云甚至混合云,Kubernetes将作为一个为任何应用,任何环境的容器管理框架无处不在。正因为如此, 目前受到各大巨头及初创公司的青睐,如Microsoft、VMWare、Red Hat、CoreOS、Mesos等,纷纷加入给Kubernetes贡献代码。随着Kubernetes社区及各大厂商的不断改进、发展,Kuberentes将成为容器管理领域的领导者。    接下来我们会用一系列文章逐一探索Kubernetes是什么、能做什么以及怎么做。2. 什么是Kubernetes    Kubernetes是Google开源的容器集群管理系统,其提供应用部署、维护、 扩展机制等功能,利用Kubernetes能方便地管理跨机器运行容器化的应用,其主要功能如下:1) 使用Docker对应用程序包装(package)、实例化(instantiate)、运行(run)。2) 以集群的方式运行、管理跨机器的容器。3) 解决Docker跨机器容器之间的通讯问题。4) Kubernetes的自我修复机制使得容器集群总是运行在用户期望的状态。当前Kubernetes支持GCE、vShpere、CoreOS、OpenShift、Azure等平台,除此之外,也可以直接运行在物理机上。接下来本文主要从以下几方面阐述Kubernetes:1) Kubernetes的主要概念。2) Kubernetes的构件,包括Master组件、Kubelet、Proxy的详细介绍。3. Kubernetes主要概念3.1. Pods    Pod是Kubernetes的基本操作单元,把相关的一个或多个容器构成一个Pod,通常Pod里的容器运行相同的应用。Pod包含的容器运行在同一个Minion(Host)上,看作一个统一管理单元,共享相同的volumes和network namespace/IP和Port空间。3.2. Services    Services也是Kubernetes的基本操作单元,是真实应用服务的抽象,每一个服务后面都有很多对应的容器来支持,通过Proxy的port和服务selector决定服务请求传递给后端提供服务的容器,对外表现为一个单一访问接口,外部不需要了解后端如何运行,这给扩展或维护后端带来很大的好处。3.3. Replication Controllers    Replication Controller确保任何时候Kubernetes集群中有指定数量的pod副本(replicas)在运行, 如果少于指定数量的pod副本(replicas),Replication Controller会启动新的Container,反之会杀死多余的以保证数量不变。Replication Controller使用预先定义的pod模板创建pods,一旦创建成功,pod 模板和创建的pods没有任何关联,可以修改pod 模板而不会对已创建pods有任何影响,也可以直接更新通过Replication Controller创建的pods。对于利用pod 模板创建的pods,Replication Controller根据label selector来关联,通过修改pods的label可以删除对应的pods。Replication Controller主要有如下用法:1) Rescheduling如上所述,Replication Controller会确保Kubernetes集群中指定的pod副本(replicas)在运行, 即使在节点出错时。2) Scaling通过修改Replication Controller的副本(replicas)数量来水平扩展或者缩小运行的pods。3) Rolling updatesReplication Controller的设计原则使得可以一个一个地替换pods来rolling updates服务。4) Multiple release tracks如果需要在系统中运行multiple release的服务,Replication Controller使用labels来区分multiple release tracks。3.4. Labels    Labels是用于区分Pod、Service、Replication Controller的key/value键值对,Pod、Service、 Replication Controller可以有多个label,但是每个label的key只能对应一个value。LabelsService和Replication Controller运行的基础,为了将访问Service的请求转发给后端提供服务的多个容器,正是通过标识容器的labels来选择正确的容器。同样,Replication Controller也使用labels来管理通过pod 模板创建的一组容器,这样Replication Controller可以更加容易,方便地管理多个容器,无论有多少容器。4. Kubernetes构件    Kubenetes整体框架如下图3-1,主要包括kubecfg、Master API Server、Kubelet、Minion(Host)以及Proxy。图3-1 Kubernetes High Level构件4.1. Master    Master定义了Kubernetes 集群Master/API Server的主要声明,包括Pod Registry、Controller Registry、Service Registry、Endpoint Registry、Minion Registry、Binding Registry、RESTStorage以及Client, 是client(Kubecfg)调用Kubernetes API,管理Kubernetes主要构件PodsServices、Minions、容器的入口。Master由API Server、Scheduler以及Registry等组成。从下图3-2可知Master的工作流主要分以下步骤:1) Kubecfg将特定的请求,比如创建Pod,发送给Kubernetes Client。2) Kubernetes Client将请求发送给API server。3) API Server根据请求的类型,比如创建Pod时storage类型是pods,然后依此选择何种REST Storage API对请求作出处理。4) REST Storage API对的请求作相应的处理。5) 将处理的结果存入高可用键值存储系统Etcd中。6) 在API Server响应Kubecfg的请求后,Scheduler会根据Kubernetes Client获取集群中运行Pod及Minion信息。7) 依据从Kubernetes Client获取的信息,Scheduler将未分发的Pod分发到可用的Minion节点上。下面是Master的主要构件的详细介绍:图3-2 Master主要构件及工作流3.1.1. Minion Registry    Minion Registry负责跟踪Kubernetes 集群中有多少Minion(Host)。Kubernetes封装Minion Registry成实现Kubernetes API Server的RESTful API接口REST,通过这些API,我们可以对Minion Registry做Create、Get、List、Delete操作,由于Minon只能被创建或删除,所以不支持Update操作,并把Minion的相关配置信息存储到etcd。除此之外,Scheduler算法根据Minion的资源容量来确定是否将新建Pod分发到该Minion节点。3.1.2. Pod Registry    Pod Registry负责跟踪Kubernetes集群中有多少Pod在运行,以及这些Pod跟Minion是如何的映射关系。将Pod Registry和Cloud Provider信息及其他相关信息封装成实现Kubernetes API Server的RESTful API接口REST。通过这些API,我们可以对Pod进行Create、Get、List、Update、Delete操作,并将Pod的信息存储到etcd中,而且可以通过Watch接口监视Pod的变化情况,比如一个Pod被新建、删除或者更新。3.1.3. Service Registry    Service Registry负责跟踪Kubernetes集群中运行的所有服务。根据提供的Cloud Provider及Minion Registry信息把Service Registry封装成实现Kubernetes API Server需要的RESTful API接口REST。利用这些接口,我们可以对Service进行Create、Get、List、Update、Delete操作,以及监视Service变化情况的watch操作,并把Service信息存储到etcd。3.1.4. Controller Registry    Controller Registry负责跟踪Kubernetes集群中所有的Replication Controller,Replication Controller维护着指定数量的pod 副本(replicas)拷贝,如果其中的一个容器死掉,Replication Controller会自动启动一个新的容器,如果死掉的容器恢复,其会杀死多出的容器以保证指定的拷贝不变。通过封装Controller Registry为实现Kubernetes API Server的RESTful API接口REST, 利用这些接口,我们可以对Replication Controller进行Create、Get、List、Update、Delete操作,以及监视Replication Controller变化情况的watch操作,并把Replication Controller信息存储到etcd。3.1.5. Endpoints Registry    Endpoints Registry负责收集Service的endpoint,比如Name:"mysql",Endpoints: ["10.10.1.1:1909","10.10.2.2:8834"],同Pod Registry,Controller Registry也实现了Kubernetes API Server的RESTful API接口,可以做Create、Get、List、Update、Delete以及watch操作。3.1.6. Binding Registry    Binding包括一个需要绑定Pod的ID和Pod被绑定的Host,Scheduler写Binding Registry后,需绑定的Pod被绑定到一个host。Binding Registry也实现了Kubernetes API Server的RESTful API接口,但Binding Registry是一个write-only对象,所有只有Create操作可以使用, 否则会引起错误。3.1.7. Scheduler    Scheduler收集和分析当前Kubernetes集群中所有Minion节点的资源(内存、CPU)负载情况,然后依此分发新建的Pod到Kubernetes集群中可用的节点。由于一旦Minion节点的资源被分配给Pod,那这些资源就不能再分配给其他Pod, 除非这些Pod被删除或者退出, 因此,Kubernetes需要分析集群中所有Minion的资源使用情况,保证分发的工作负载不会超出当前该Minion节点的可用资源范围。具体来说,Scheduler做以下工作:1) 实时监测Kubernetes集群中未分发的Pod。2) 实时监测Kubernetes集群中所有运行的Pod,Scheduler需要根据这些Pod的资源状况安全地将未分发的Pod分发到指定的Minion节点上。3) Scheduler也监测Minion节点信息,由于会频繁查找Minion节点,Scheduler会缓存一份最新的信息在本地。4) 最后,Scheduler在分发Pod到指定的Minion节点后,会把Pod相关的信息Binding写回API Server。4.2. Kubelet图3-3 Kubernetes详细构件    根据上图3-3可知Kubelet是Kubernetes集群中每个Minion和Master API Server的连接点,Kubelet运行在每个Minion上,是Master API Server和Minion之间的桥梁,接收Master API Server分配给它的commands和work,与持久性键值存储etcd、file、server和http进行交互,读取配置信息。Kubelet的主要工作是管理Pod和容器的生命周期,其包括Docker Client、Root Directory、Pod Workers、Etcd Client、Cadvisor Client以及Health Checker组件,具体工作如下:1) 通过Worker给Pod异步运行特定的Action。2) 设置容器的环境变量。3) 给容器绑定Volume。4) 给容器绑定Port。5) 根据指定的Pod运行一个单一容器。6) 杀死容器。7) 给指定的Pod创建network 容器。8) 删除Pod的所有容器。9) 同步Pod的状态。10) 从Cadvisor获取container info、 pod info、root info、machine info。11) 检测Pod的容器健康状态信息。12) 在容器中运行命令。4.3. Proxy    Proxy是为了解决外部网络能够访问跨机器集群中容器提供的应用服务而设计的,从上图3-3可知Proxy服务也运行在每个Minion上。Proxy提供TCP/UDP sockets的proxy,每创建一种Service,Proxy主要从etcd获取Services和Endpoints的配置信息,或者也可以从file获取,然后根据配置信息在Minion上启动一个Proxy的进程并监听相应的服务端口,当外部请求发生时,Proxy会根据Load Balancer将请求分发到后端正确的容器处理。 标签:容器集群
©️2020 CSDN 皮肤主题: 技术黑板 设计师:CSDN官方博客 返回首页