Kubernetes之多集群统一管理工具 360-wayne
K8s集群环境说明
主机名 | 系统版本 | ip地址 | docker version | kubelet version | kubeadm version | kubectl version | flannel version | 备注 |
---|---|---|---|---|---|---|---|---|
master | centos-release-7-7.1908.0.el7.centos.x86_64 | 192.168.137.101 | Docker 18.09.6 | V1.14.2 | V1.14.2 | V1.14.2 | V0.11.0 | master节点 |
master-woker | centos-release-7-7.1908.0.el7.centos.x86_64 | 192.168.137.102 | Docker 18.09.6 | V1.14.2 | V1.14.2 | V1.14.2 | V0.11.0 | worker&master节点 |
woker | centos-release-7-7.1908.0.el7.centos.x86_64 | 192.168.137.103 | Docker 18.09.6 | V1.14.2 | V1.14.2 | V1.14.2 | V0.11.0 | worker节点 |
wayne环境说明
服务名称 | 版本 | 备注 |
---|---|---|
mysql | 5.7.28 | |
wayne-backend | v1.8.5 | |
wayne-frontend | latest |
一、wayne安装
本文使用kubernetes集群方式安装,其他安装方式请参考https://360yun.org/wayne/
1.克隆代码仓库
该章节在master节点上执行
1.1 代码克隆
[root@master work]# go get github.com/Qihoo360/wayne
如果提示-bash: go: 未找到命令
,则需要先安装go环境,另外由于go命令会识别github.com
域名使用git
进行克隆该代码仓库,所以也需要安装git
命令。如果克隆成功,则直接进入到下一章节。
1.2 git命令安装
[root@master work]# yum install -y git
1.3 go命令安装
参考文档:go环境安装
下载安装包文件
[root@master work]# wget https://dl.google.com/go/go1.13.4.linux-amd64.tar.gz
解压安装文件到/usr/local
目录下
[root@master work]# tar -C /usr/local -xzf go1.13.4.linux-amd64.tar.gz
将 /usr/local/go/bin
写入PATH环境变量(临时写入)
[root@master work]# export PATH=$PATH:/usr/local/go/bin
永久写入PATH环境变量
[root@master work]# vim /root/.bashrc
在之前PATH的基础上添加 /usr/local/go/bin:
1.4 代码克隆
[root@master work]# go get github.com/Qihoo360/wayne
默认会将项目克隆到 /root/go/src
下,刚刚克隆的项目地址为:/root/go/src/github.com/Qihoo360/wayne/
2.MySQL服务安装
wayne依赖于mysql数据库,所以我们需要先安装一个mysql,如果有现成的可用mysql也可以直接使用。
2.1 修改yaml文件
[root@master work]# cd /root/go/src/github.com/Qihoo360/wayne/
[root@master wayne]# vim hack/kubernetes/mysql.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: mysql-wayne
namespace: default
labels:
app: mysql-wayne
spec:
replicas: 1
selector:
matchLabels:
app: mysql-wayne
template:
metadata:
labels:
app: mysql-wayne
spec:
containers:
- name: mysql
image: 'mysql:5.7'
env:
- name: MYSQL_ROOT_PASSWORD
value: 123456
volumeMounts:
- mountPath: /etc/mysql/conf.d/
name: mysql-conf
- mountPath: /var/lib/mysql/
name: mysql-data
volumes:
- hostPath:
path: /data/docker/mysql/conf/
name: mysql-conf
- hostPath:
path: /data/docker/mysql/data/
name: mysql-data
---
apiVersion: v1
kind: Service
metadata:
labels:
app: mysql-wayne
name: mysql-wayne
namespace: default
spec:
type: NodePort
ports:
- nodePort: 30306
port: 3306
protocol: TCP
targetPort: 3306
selector:
app: mysql-wayne
修改了如上图的五个地方,由上至下分别是:
- 根据标签选择节点(因为mysql内存消耗较大,我只有woker节点有足够空间)
- 镜像版本号
- root用户的密码
- 数据及配置的持久化挂载
- 暴露服务,提供集群外机器访问
2.2 安装mysql
[root@master wayne]# kubectl apply -f hack/kubernetes/mysql.yaml
下载镜像过程取决于网速,mysql有三四百兆的大小。
查看是否安装成功
[root@master wayne]# kubectl get pod
使用Navicat验证mysql服务是否可用
2.3 数据库初始化
自动初始化(官方推荐)
Wayne 启动会自动创建数据库并初始化数据,使用自动初始化数据库的方式请勿手动创建数据库,否则系统检测到数据库已存在会跳过数据初始化步骤!
3. 部署 Wayne后端
3.1 修改yaml文件
[root@master wayne]# cd /root/go/src/github.com/Qihoo360/wayne
[root@master wayne]# vim hack/kubernetes/wayne-backend.yaml
主要修改mysql的配置,mysql使用集群的node节点ip地址,例如:192.168.137.103:30306
,使用该地址可以不用担心pod重启的问题。
完整配置文件如下:
apiVersion: v1
kind: ConfigMap
metadata:
labels:
app: wayne-backend
name: wayne-backend
namespace: default
data:
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(192.168.137.103:30306)"
DBUser = "root"
DBPasswd = "123456"
DBConnTTL = 30
# web shell auth
appKey = "860af247a91a19b2368d6425797921c6"
# Set demo namespace and group id
DemoGroupId = "1"
DemoNamespaceId = "1"
# Sentry
LogLevel = "4"
SentryEnable = false
SentryDSN = ""
SentryLogLevel = "4"
# Robin
EnableRobin = false
# api-keys
EnableApiKeys = true
# Bus
BusEnable = true
# Webhook
EnableWebhook = false
WebhookClientTimeout = 10
WebhookClientWindowSize = 16
---
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
app: wayne-backend
name: wayne-backend
namespace: default
spec:
replicas: 1
selector:
matchLabels:
app: wayne-backend
template:
metadata:
labels:
app: wayne-backend
spec:
volumes:
- name: config
configMap:
name: wayne-backend
containers:
- name: wayne
image: 'q8sio/wayne-backend:v1.8.5-12-ga3c729e'
command:
- /opt/wayne/backend
env:
- name: GOPATH # app.conf runmode = dev must set GOPATH
value: /go
volumeMounts:
- name: config
mountPath: /opt/wayne/conf/
readinessProbe:
httpGet:
path: healthz
port: 8080
timeoutSeconds: 1
periodSeconds: 10
failureThreshold: 3
imagePullPolicy: Always
---
apiVersion: v1
kind: Service
metadata:
labels:
app: wayne-backend
name: wayne-backend
namespace: default
spec:
type: NodePort
ports:
- nodePort: 32001
protocol: TCP
port: 8080
targetPort: 8080
selector:
app: wayne-backend
3.2 执行yaml文件
[root@master wayne]# kubectl apply -f hack/kubernetes/wayne-backend.yaml
3.3 查看部署情况
[root@master wayne]# kubectl get pod -o wide
可以看到wayne-backend
已经部署成功
3.4 查看数据库
当wayne-backend
部署成功后,可以到刚刚的数据库中查看,是否有添加wayne
的数据库
可以看到,数据库中自动生成了wayne
的数据库,该库中有42张表。
4. 部署 Wayne前端
4.1 修改yaml文件
[root@master wayne]# vim hack/kubernetes/wayne-frontend.yaml
主要是将服务端的ip地址改为可以访问集群的任意ip
完整配置文件如下:
apiVersion: v1
kind: ConfigMap
metadata:
labels:
app: wayne-frontend
name: wayne-frontend
namespace: default
data:
config.js: |-
window.CONFIG = {
URL: 'http://192.168.137.102:32001',
RAVEN: false,
RAVEN_DSN: 'RAVEN_DSN'
};
---
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
app: wayne-frontend
name: wayne-frontend
namespace: default
spec:
replicas: 1
selector:
matchLabels:
app: wayne-frontend
template:
metadata:
labels:
app: wayne-frontend
spec:
volumes:
- name: config
configMap:
name: wayne-frontend
items:
- key: config.js
path: config.js
containers:
- name: wayne
image: 'q8sio/wayne-frontend:latest'
volumeMounts:
- name: config
mountPath: /usr/local/openresty/nginx/html/config.js
subPath: config.js
imagePullPolicy: Always
---
apiVersion: v1
kind: Service
metadata:
labels:
app: wayne-frontend
name: wayne-frontend
namespace: default
spec:
type: NodePort
ports:
- nodePort: 32000
protocol: TCP
port: 80
targetPort: 80
selector:
app: wayne-frontend
4.2 部署 wayne前端
[root@master wayne]# kubectl apply -f hack/kubernetes/wayne-frontend.yaml
查看部署情况
[root@master wayne]# kubectl get pod
等待部署过程会下载镜像,该过程可能比较久。注意查看日志。
[root@master wayne]# kubectl logs wayne-frontend-849667c9f4-l5hvz
二、开始使用wayne
1.访问wayne
使用浏览器打开可以访问集群的任一ip地址的32000端口,如下:
http://192.168.137.102:32000
2.登录
wayne默认的登录账号密码为 admin:admin
,如果是部署到生产环境,则一定要修改这个账号密码。
登录成功后,默认进入前台页面。我们可以通过右上角,切换至后台模式。
3.配置集群
切换至后台管理页面,进入 集群-列表
标签,点击关联集群
填写相关信息:
- 名称:必填。可以任意填写,该名称即为后面很多操作中的机房名称。
- Master:必填。需要填写k8s集群中master节点的
kube-apiserver
的服务地址,如果是多个apiserver高可用,可以随便填写一个的地址。 - KubeConfig:必填。需要填写搭建集群时,kubelet的配置文件。二进制搭建的集群一般在
/root/.kube/config
目录下。 - 集群状态:可选。有
在线
跟维护中
两个状态,若选择维护中
,则该集群暂时不可被操作。 - MetaData:可选。集群元数据。
- 描述:可选。描述集群的一些文字
配置示例:
注意server
栏需要填写集群外部可以访问的ip地址
KubeConfig参考:
apiVersion: v1
clusters:
- cluster:
certificate-authority-data: LS0tL***
server: https://192.168.137.101:6443
name: kubernetes
contexts:
- context:
cluster: kubernetes
user: admin
name: kubernetes
current-context: kubernetes
kind: Config
preferences: {}
users:
- name: admin
user:
client-certificate-data: LS0tL***
client-key-data: LS0tL***
4. 查看集群信息
集群配置完成后,可以进入到Kubernetes选项卡查看集群信息,这一栏是集成了dashboard的部分功能。
可以看到node节点中,有我们集群可用的worker节点,进入其他各个分类中也可以查看其他集群信息。
5. 创建对应Namespace的wayne部门
进入命名空间-列表
选项卡可以看到有一个默认的demo部门,点击左边的三个点的图案,可以编辑其对应的信息。
我们将k8s对应的命名空间改为集群中已有的命名空间,并勾选刚刚创建的机房,点击提交。
接下来我们再创建一个新的部门test
点击创建命名空间
在k8s命名空间
一栏中,我们填写了一个集群中不存在的namespace,然后再勾选下面的自动创建
选项,则wayne会帮我们在集群中自动创建该namespace,选择机房,并提交。
6. 创建用户
进入 权限-用户列表
选项卡,点击创建用户
按钮
该页面中的展示
一栏是指展示在页面的用户名称,而名称
一栏是用于登录的用户名。
填写相关信息,点击提交。
7. 用户关联部门
右上角点击 进入前台
按钮 ,进入前台页面。点击成员列表
选项卡,此时会右上角会弹出报错窗口。报错内容为:
Expression #1 of SELECT list is not in GROUP BY clause and contains nonaggregated column 'wayne.T0.id' which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by
造成该错误的原因:
MySQL 5.7.5及以上功能依赖检测功能。如果启用了ONLY_FULL_GROUP_BY SQL模式(默认情况下),MySQL将拒绝选择列表,HAVING条件或ORDER BY列表的查询引用在GROUP BY子句中既未命名的非集合列,也不在功能上依赖于它们。(5.7.5之前,MySQL没有检测到功能依赖关系,默认情况下不启用ONLY_FULL_GROUP_BY。有关5.7.5之前的行为的说明,请参见“MySQL 5.6参考手册”。)
7.1 解决sql异常
该部分在woker
节点上操作
进入woker节点(wayne-mysql的pod所在节点)中我们之前挂载的目录,并创建自定义的mysql配置文件。
[root@worker ~]# cd /data/docker/mysql/conf/
[root@worker conf]# vim mysql.cnf
写入如下内容:
[mysqld]
sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
保存退出。
7.2 重启mysql服务
该部分在master
节点上操作
[root@master wayne]# kubectl exec -it mysql-wayne-6d5b84d7db-khc8n -- service mysql restart
命令格式:kubectl exec -it pod名称
– 需要执行的命令
7.3 用户与部门管理
再次打开wayne前台页面。点击成员列表
选项卡,发现现在已经不会报错了。
右上角选择我们刚刚创建的部门test
,再进入成员列表
,点击 关联部门用户
。
- 名称:必填。填写我们之前创建的用户名。
- 所属群组:必填。我这里选择的是访客的身份。
点击提交。
8. 使用新用户登录
我们打开另外一个浏览器,或者在google浏览器中打开一个新的无痕窗口。输入wayne地址:
然后我们发现了这个账号居然没有设置密码。。。
8.1 设置用户密码
回到之前登录的admin的窗口,进入后台页面。进入权限-用户列表
,选择我们之前创建的用户,点击重置密码。
设置完密码后,我们再次进入刚刚新的窗口中登录新的用户。
8.2 新用户登录
这个时候,我们再 进行登录,就可以成功进入前台页面。并且可以选择我们的部门test
,由于我们赋予的角色权限是 访客
,所以这个账号只能进行查看集群的一些信息,而不能做任何更改。
9. 创建项目
使用admin账号,进入前台页面,选择test
部门,进入项目列表
,点击创建项目
按钮。
点击确认,我们就可以在项目列表中看到我们的项目了。同样在登录julian
账号的窗口中,也可以有权限看到我们的项目。
接下来就可以进入该项目,进行创建部署、负载均衡等操作了。这里 不再做展示了,具体请参考官网的使用文档:wayne用户文档