360 开源 K8S Dashboard Wayne 的安装使用
source link: https://www.qikqiak.com/post/kubernetes-dashboard-wayne-usage/
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
360 开源 K8S Dashboard Wayne 的安装使用-阳明的博客|Kubernetes|Istio|Prometheus|Python|Golang|云原生
church of St. John of Nepomuk in Ranui, Italy
Kubernetes
官方本身就提供了一个管理集群的 Dashboard 插件,但是官方的 Dashboard 插件还是有一些局限性,近日360开源了内部使用的 Kubernetes Dashboard 插件:Wayne。 Wayne
是一个通用的、基于 Web 的 Kubernetes 多集群管理平台。通过可视化 Kubernetes 对象模板编辑的方式,降低业务接入成本, 拥有完整的权限管理系统,适应多租户场景,是一款适合企业级集群使用的发布平台。
Wayne 已大规模服务于 360 搜索,承载了公司绝大部分业务,稳定管理了上万个容器。
命名的起源:360 搜索私有云团队多数项目命名都来源于 DC 漫画的角色,Wayne 也不例外,Wayne 是声名显赫的超级英雄蝙蝠侠 Bruce Wayne 的名字。
整体采用前后端分离的方案,其中前端采用 Angular 框架进行数据交互和展示,使用Ace编辑器进行 Kubernetes 资源模版编辑。后端采用 Beego 框架做数据接口处理,使用 Client-go 与 Kubernetes 进行交互,数据使用 MySQL 存储。
架构图
- 基于 RBAC(Role based access control)的权限管理:用户通过角色与部门和项目关联,拥有部门角色允许操作部门资源,拥有项目角色允许操作项目资源,更加适合多租户场景。
- 简化 k8s 对象创建:提供基础 k8s 对象配置文件添加方式,同时支持高级模式直接编辑 Json/Yaml文件创建 k8s 对象。
- LDAP/OAuth 2.0/DB 多种登录模式支持:集成企业级 LDAP 登录及 DB 登录模式,同时还可以实现 OAuth2 登录。
- 支持多集群、多租户:可以同时管理多个 Kubernetes 集群,并针对性添加特定配置,更方便的多集群、多租户管理。
- 提供完整审计模块:每次操作都会有完整的审计功能,追踪用于操作历史,同时支持用户自定义 webhook。
- 提供基于 APIKey 的开放接口调用:用户可自主申请相关 APIKey 并管理自己的部门和项目,运维人员也可以申请全局 APIKey 进行特定资源的全局管理。
- 保留完整的发布历史:用户可以便捷的找到任何一次历史发布,并可轻松进行回滚,以及基于特定历史版本更新 k8s 资源。
- 具备完善的资源报表:用户可以轻松获取各项目的资源使用占比和历史上线频次(天级)以及其他基础数据的报表和图表。
- 提供基于严密权限校验的 web shell:用户可以通过 web shell 的形式进入发布的 Pod 进行操作,自带完整的权限校验。
- 提供站内通知系统:方便管理员推送集群、业务通知和故障处理报告等。
- Web UI: 提供完整的业务开发和平台运维功能体验。
- Worker: 扩展一系列基于消息队列的功能,例如 audit 和 webhook 等审计组件。
Wayne 依赖 MySQL 和 RabbitMQ,其中 MySQL 是必须的服务,用户存储系统的各种数据,RabbitMQ 是可选的,主要用户扩展审计功能使用。
数据库服务
首先部署 MySQL 服务,如果你系统中有一个可访问的 MySQL 服务的话就可以跳过这一步,我们这里在 Kubernetes 集群中部署一个简单的 MySQL 服务,对应的资源清单文件如下:(db.yaml)
apiVersion: apps/v1beta1
kind: Deployment
metadata:
name: mysql
namespace: kube-system
labels:
app: mysql
spec:
template:
metadata:
labels:
app: mysql
spec:
containers:
- name: mysql
image: mysql:5.7.14
imagePullPolicy: IfNotPresent
ports:
- containerPort: 3306
name: dbport
env:
- name: MYSQL_ROOT_PASSWORD
value: rootPassw0rd
volumeMounts:
- name: db
mountPath: /var/lib/mysql
volumes:
- name: db
emptyDir: {}
---
apiVersion: v1
kind: Service
metadata:
name: mysql
namespace: kube-system
spec:
selector:
app: mysql
ports:
- name: mysqlport
protocol: TCP
port: 3306
targetPort: dbport
通过环境变量添加了数据库 root 用户密码(不需要提前创建wayne
数据库),不过需要注意的是我们这里并没有对数据进行持久化,如果需要的话一定要记得做数据的持久化,避免数据丢失。创建上面的资源对象:
$ kubec create -f db.yaml
$ kubectl get pods -n kube-system
NAME READY STATUS RESTARTS AGE
mysql-6ffcf87ddc-7kkbk 1/1 Running 0 1h
......
$ kubectl get svc -n kube-system
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
mysql ClusterIP 10.106.31.171 <none> 3306/TCP 1h
......
部署成功后我们就可以在集群内部通过mysql:3306
来访问 MySQL 服务了。
部署 Wayne
直接 clone Wayne 的 git 代码:
$ git clone https://github.com/Qihoo360/wayne/
其中 hack/kubernetes
目录下面就是我们需要部署的 Wayne 的资源清单文件:
$ ls -la hack/kubernetes
total 24
drwxr-xr-x 5 ych staff 160 Nov 19 13:40 .
drwxr-xr-x 5 ych staff 160 Nov 19 11:33 ..
-rw-r--r-- 1 ych staff 339 Nov 19 11:33 configmap.yaml
-rw-r--r-- 1 ych staff 967 Nov 19 13:40 deployment.yaml
-rw-r--r-- 1 ych staff 229 Nov 19 11:33 service.yaml
我们这里将所有服务都部署到
kube-system
命名空间下面,所以将这里的资源清单中的namespace
都统一改成kube-system
由于我们这里是使用上面集群中部署的 MySQL 服务,所以这里需要对 configmap.yaml 文件进行简单的配置,而 360 文档上面的 ConfigMap 是不完整的,需要使用源码里面的app.conf
文件来进行创建,所以我们这里可以使用--from-file
关键字来创建 ConfigMap 对象,首先配置下app.conf
文件:
appname = wayne httpport = 8080 runmode = prod autorender = false copyrequestbody = true EnableDocs = true EnableAdmin = true StaticDir = public:static # Custom config ShowSql = false ## if enable username and password login EnableDBLogin = true # token, generate jwt token RsaPrivateKey = "./apikey/rsa-private.pem" RsaPublicKey = "./apikey/rsa-public.pem" # token end time. second TokenLifeTime=86400 # kubernetes labels config AppLabelKey= wayne-app NamespaceLabelKey = wayne-ns PodAnnotationControllerKindLabelKey = wayne.cloud/controller-kind # database configuration: ## mysql DBName = wayne DBTns = tcp(mysql:3306) DBUser = root DBPasswd = rootPassw0rd DBLoc = "Asia%2FShanghai" DBConnTTL = 30 # web shell auth appKey = "860af247a91a19b2368d6425797921c6" # Set demo namespace and group id DemoGroupId = 1 DemoNamespaceId = 1 # Sentry LogLevel = 7 SentryEnable = false #SentryDSN = "${SENTRY_DSN}" #SentryLogLevel = "${SENTRY_LOGLEVEL||4}" # Robin EnableRobin = false # api-keys EnableApiKeys = false # Bus BusEnable = false #BusRabbitMQURL = "${MQ_URL||amqp://guest:guest@rabbitmq:5672}" # other # 采用Canary/Production上线模式 # 如果项目配置了metaData {"mode":"beta"},则跳转到beta域名 #BetaUrl = "${BETA_URL||https://beta.wayne.cloud}" #AppUrl = "${APP_URL||https://www.wayne.cloud}" # oauth2 #RedirectUrl = "${REDIRECT_URL||https://www.wayne.cloud}" [auth.qihoo] enabled = false 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 # 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
可以直接使用我这里上面的配置文件,和源码中的区别是runmode
改成了prod
模式,不然运行会出错,另外是配置了数据库相关的信息:
DBName = wayne DBTns = tcp(mysql:3306) DBUser = root DBPasswd = rootPassw0rd DBLoc = "Asia%2FShanghai" DBConnTTL = 30
将DBTns
配置成你的 mysql 服务的地址,另外一个值得注意的是这里的DBUser
必须使用root
,否则第一次安装的时候不能同步数据库,配置好后,然后创建 ConfigMap 对象:
$ kubectl create configmap infra-wayne --namespace kube-system --from-file=app.conf
configmap "infra-wayne" created
然后就可以部署另外两个资源对象了:
$ kubectl create -f deployment.yaml
deployment.extensions "infra-wayne" created
$ kubectl create -f service.yaml
service "infra-wayne" created
创建完成后,可以查看下 Pod 的状态,如果没有错误信息,就证明部署成功了:
$ kubectl get pods -n kube-system -l app=infra-wayne
NAME READY STATUS RESTARTS AGE
infra-wayne-5c5d95cb5c-q6z25 1/1 Running 0 19m
$ kubectl logs -f infra-wayne-5c5d95cb5c-q6z25 -n kube-system
[ORM]2018/11/20 05:08:37 unsupport orm tag int
[ORM]2018/11/20 05:08:37 unsupport orm tag bool
[ORM]2018/11/20 05:08:37 unsupport orm tag int
[ORM]2018/11/20 05:08:37 unsupport orm tag bool
2018/11/20 05:08:39.395 [E] [db.go:53] Ping database: root:rootPassw0rd@tcp(mysql:3306)/ error: Error 1049: Unknown database 'wayne'
2018/11/20 05:08:39.402 [D] [db.go:78] Initialize database connection: root:rootPassw0rd@tcp(mysql:3306)/
create table `user`
-- --------------------------------------------------
-- Table Structure for `github.com/Qihoo360/wayne/src/backend/models.User`
-- --------------------------------------------------
CREATE TABLE IF NOT EXISTS `user` (
`id` bigint AUTO_INCREMENT NOT NULL PRIMARY KEY,
......
$ kubectl get svc -n kube-system -l app=infra-wayne
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
infra-wayne NodePort 10.98.29.98 <none> 8080:31259/TCP 10h
然后我们就可以通过31259
这个 NodePort 来访问 Wayne 了:
使用默认的用户名和密码(都是admin
)登录就可以进入到 Wayne 首页去了:
我们可以看到 Wayne 还是有很多问题的,第一次进来的时候还会报500错误,这是因为没有配置集群,点击右上角的管理员
-> 进入后台
,可以进入到后台管理界面:
在左侧菜单中点击集群
-> 列表
-> +创建集群
,可以新建一个集群:
名字随便填写即可,Master
填写集群的apiserver
地址,然后下面的KubeConfig
是最重要的,如果我们经常使用 kubectl 工具的话就应该知道这个工具的配置文件其实就是一个KubeConfig
,我们只需要把需要管理的集群的KubeConfig
文件复制到这里即可,默认路径是~/.kube/config
文件,创建完成后就可以看到添加的集群信息了:
其他部分就可以自行去体验了,参考文档:https://github.com/Qihoo360/wayne/wiki
目前
Wayne
的确还有很多坑,和不完善的地方,如果你觉得这个项目还不错的话,可以多些耐心或者贡献下项目。
微信公众号
扫描下面的二维码关注我们的微信公众帐号,在微信公众帐号中回复◉加群◉即可加入到我们的 kubernetes 讨论群里面共同学习。
「真诚赞赏,手留余香」
Recommend
About Joyk
Aggregate valuable and interesting links.
Joyk means Joy of geeK