kplcloud是一个基于Kubernetes的轻量级PaaS平台,通过可视化的界面对应用进行管理,降低应用容器化的对度,从而减少应用容器化的时间成本。
Kplcloud已在宜信服务于宜人财富等多个团队,稳定运行了近两年,目前平台已在生产环境跑着上百个应用,近千个容器。
登陆可以分为三种,分别是LDAP登陆、邮箱密码登陆、三方授权登陆,咱们没有注册功能。下面对这三种登陆方式进行讲解。
LDAP与邮箱登陆大同小异,只需要简单的配置即可。
在app.cfg文件找到[server]的login_type参数,设置为 ldap并且找到[ldap]块
[ldap] ldap_host = 127.0.0.1 ldap_port = 389 ldap_base = DC=yourdomain,DC=corp ldap_sseSSL = false ldap_bindDN = ldap_bind_password = ldap_user_filter = (userPrincipalName=%s) ldap_group_filter = (&(objectCategory=Group)) ldap_attr = name;mail [server] ;auth_login login_type = ldap
输入你家LDAP的相关信息即可。
不要设置 auth_login
,应该把它注释掉。
在app.cfg文件找到[server]的login_type参数,设置为 email
[server] ;auth_login login_type = ldap
不要设置 auth_login
,应该把它注释掉。
通过Github授权登陆需要的app.cfg将[server]下的 auth_login参数设置为github
打开github官网,进入https://github.com/settings/developers, 在左侧菜单栏找到“OAuth Apps”并点击进入
如果没有OAuth App则点击“New OAuth App”按钮创建一个新的OAuth App
创建完成之后 找到我们刚刚创建的OAuth App并进入就可以看到Client ID和Client Secret了
将它们复制下来他贴到app.cfg的 [server]
块下的 client_id和client_secret
设置好Homepage URL和Authorization callback URL
授权登陆需要用户把 https://github.com/settings/profile Public Email 设置上,否则无法授权成功
上面设置好之后, 就可以使用github授权登陆的方式进入平台了,默认分配的空间及权限可以在app.cfg文件下的 [server]
块下的 default_namespace和default_role_id
配置。
[server] client_id = balabalabalbabiubiubiu client_secret = balabalabalbabiubiubiu auth_login = github default_namespace = default-app default_role_id = 4C
工作台是我们进入之后看到的第一个页面,主要列出以下一些信息
使用文档
创建应用入口
空间CPU及内存资源使用情况
你可操作的最新的几个应用
该空间下最近应用的动态
您可操作的空间列表
您规属于哪些权限组列表
监控只是简易的集群网络,内存、CPU及语言,详情的监控可以从grafana查看。
本模块主要是对一些应用发布的情况进行一些统计,如应用失败的应用的次数中断及回滚的次数,点击应用名称可以看应用详情。
在创建应用之前,首先我们要做的是在你的git项目上将Dockerfile文件提交上去,并且生成一个Tag或releases版本。
FROM openjdk:latest COPY xxxx.jar /opt/app WORKDIR /opt/app CMD ["java", "xxx.jar"]
进入“创建项目”页面
项目英文名填写项目的“英文名称” 名称的规则: ^[a-z0-9]([-a-z0-9])?([a-z0-9]([-a-z0-9]*[a-z0-9])?)*$
填写“项目描述” 可不填
提交信息,进入第二步
选择项目语言Java
项目地址:输入项目的址 kplcloud/hello
填写完后会自动获取项目的tags列表
选择版本:选择获取回来的tags版本
POMFILE: pom.xml文件的路径
构建路径:这是Dockerfile放到项目所在的路径地址
容器数量:启动的Pods数量
容器规格:该Pods的最大内存上限
启动方式:jar 启动或 tomcat 启动
Args: 选择jar 启动会自动生成简单的 启动命令,如果是tomcat 启动则是其他命令 // 考虑去掉这个选项
dubbo 服务: 如果是dubbo服务则勾选,会为其开放20880端口
如果选择了“增加端口” 会列出端口、协议填写
端口及协议:如果选择了则会创建Service进行负载,注意端口名称的格式,必须是xxx-port,可以添加多个端口,但建议一个应用只启动一个端口。
提交成功之后会显示如下页面,管理就可以在审核页面进行部署。
(创建Golang/Python/NodeJs/静态应用的步骤请参看开源文档。)
应用服务启动可以在多个地方进行调整,以下介绍两种方案,Dockerfile 和 平台详情页调整
看一下简单的例子:
FROM hub.kpaas.nsini.com/app/hello:v0.0.3 CMD ["/go/bin/hello"]
启动命令写在CMD这个后面,如果后面有多个参数可以以逗号隔开例如: CMD ["static-web", "-path", "app", "-port", ":8080"]
打开应用详情页:
在详情这一选卡上找到“命令,参数”,点右边的编辑icon,弹出对话框进行填写:
填定启动的命令和参数,参数用逗号隔开。点提交服务会自动重启动。
注意:在平台详情页修改的命令会覆盖掉Dockerfile 下的CMD命令。
在应用详情页中间有一个叫作“日志采集”的模块
点击右边的“添加”按钮,在弹出的对话框中选择日志的路径及正则规则
文件路径:你日志文件的位置
日志规则:如果没有特殊需求的话默认就好
提交后服务会自动重启动。
如果配置了上面采集器,那么它会向服务所在的Pod注入一个Filebeat采集器对应用服务的业务日志进行采集。把采集到的日志入到kafka集群,然后logstash进行消息处理及格式化。
处理完后入到ES集群,最终我们就可以通过kibana查询到我们的业务日志了。
当然kafka、logstash、es得您自己去搭建。
若您可把这几个服务跑在Kubernetes可以参考我给您生成的yaml 直接apply 进去就能跑。
生成filebeat会用到两个模版,一个是容器的模版FilebeatContainer,另一个是ConfigMap的模版FilebeatConfigMap,您可根据自己的需求调整相应的模版文件。
构建应用的流程是通过创建应用提交一些信息进行处理
从git 仓库获取tags列表
调用jenkins API 将应用的相关参数及版本信息传给它并进行构建
Jenkins Job执行Shell命令 执行docker build并上传致Docker 仓库
平台监听到job已经执行完成并成功了,调用kubernetes API更新应用的Image地址
监听升级情况
发送通知
以上是构建应用的后端流程,而前端就变得比较简单了。只需要在应用详情页点击"Build"按钮,在弹出的对话框中选择相应用的tags版本并提交就行了,如下图:
点击详情页的build日志选项卡,会显示最近的构建记录,点击左侧相应的版本可以查看该版本的构建情况,也可以对正在松建的应用进行中断,如下图:
服务模式切换比较麻烦,需要您的Kubernetes支持,目前我们使用的是istio的方案,也就是说您需要在你的kubernetes上安装istio的相关服务,并且在我们的模版管理将istio所需要的几个模版配置上。才能开启此功能。
如果您没有安装Istio,可跳过此章。
在"模版管理"菜单找到Gateway、VritualService、InitContainer、IstioProxy这几个模版,根据自己环境的情况进行调整。
Gateway: 本平台设计的模式是一个Namespace所对应一个Gateway,多个Namespace空间就会有多个Gateway,VirtualService选择的是本Namespace下的Gateway。
VirtualService: 在生成应用的对外访问入口时与Ingress一起生成。
使用过Istio的同学应该都知道,要实现Istio所提供的相关功能需要在Pods里注入两个容器,一个是proxy_init,另一个是proxyv2
InitContainer: 模版是是初始化设置的yaml,比如将流量通过 iptables的方式转发给 proxy
IstioProxy: 模版就是将pods的所有流量代理的yaml
下图是我们架构流量进入到我们容器所图:
DNS 将域名解析到VIP
VIP 将80的流量转发边缘节点的31380端口(这个是IstioIngressGateway控制器的Service的NodePort)
前面我们所说过每个Namespace都会有至少一个对应的Gateway,Gateway的hosts就是xxx.{namespace}.xxx.com
VirtualService里的destination.host 就是Service的名称。 以上是kplcloud平台的流程,如果您有需要调整的,只需要修改模版就好,不需要调整代码。
如下图,在应用详情页面选择“模式”按钮,在弹出的对话框中选择"Service Mesh"选项目,后点击提交后Pods会自动重起。
你需要在app.cfg文件开起ServiceMesh功能
[server] service_mesh = true
扩容是对Pods的使用资源进行扩容,例如最大使用的CPU及内存资源。
在应用的详情页面,在右上角找到“扩容”按钮,并点开。
在弹出的对话框中拖动CPU和内存,可对其设置一个基础值及一个最大值,如下图:
选择好相应的值后点击“保存”按钮后,会重起该应用的所有POD。重启后的POD可使用的最大CPU及内存资源就是您刚刚设置的值。
所对应用以deployment的yaml参数:
requests: limits: cpu: 1 memory: 128Mi requests: cpu: 500m memory: 64Mi
伸缩是对该应用所启动的pods数量进行一个控制。
同样进入应用的详情页页,在右上角找到“伸缩”按钮并点开。
在弹出来的对话框中选择启动的POD数量,如下图:
提交之后若数量大于之前的数量,则会启动缺少的POD数量,若小于之前的值,将会逐步减少应用的POD。
目前给的最大值是8个pod,资源可使用的内存是16G,若您的应用超过我们所设定的最大值。想办法优化吧,64核128G内存都不够用,这种级别的应用不适合用Docker。
这种级别的应用最好是拆了吧。
本平台是通过storageclass来动态创建PV。也就是说咱们依赖于storageclass,如果您的Kubernetes不支持相应的存储试,将无法非常方便的进行挂载。
目前暂不支持挂载多个PVC,或许以后会更新吧。
这里演示的是用的NFS进行演示,实际使用时可根据自己的需求配置相应的provisioner,其他配置是一样的不需要调整,只需要在“模版管理” 调整StorageClass和PersistentVolumeClaim模版。
在菜单找到“配置与存储”->"持久化存储卷声明"。
选择应用的空间,并点击“创建”按钮
在弹出的对话框中会有几个选项目:
名称:存储卷的名称(规则: ^[a-z0-9]([-a-z0-9])?([a-z0-9]([-a-z0-9]*[a-z0-9])?)*$)
容量:可以使用的存储区大小,最小单位Mi,最大Ti
访问模式:
ReadWriteOnce——该卷可以被单个节点以读/写模式挂载
ReadOnlyMany——该卷可以被多个节点以只读模式挂载
ReadWriteMany——该卷可以被多个节点以读/写模式挂载
存储类:如果没有存储类请查看创建存储类
当存储卷创建好之后就可以在应用进行挂载了。
同样的进入应用详情页面,找到“持久化存储”选项卡,如图:
点击“添加”按钮,在弹出来的对话框加输入相关信息:
持久化存储路径:该路径为容器里的挂载路径
持久化存储卷声明:这里会列出您可以使用的存储卷
填写好路径及选择好存储卷后点击提交,改应用的所有POD的逐步重启动。
挂载完成之后可以看到所挂载的相关信息:
最终生成的yaml结果:
volumes: - name: soup-hello-pvc persistentVolumeClaim: claimName: test-data containers: - volumeMounts: - name: "soup-hello-pvc" mountPath: "/soupzhang"
如果配置了邮箱,用户提交审核之后会给管理员发送邮件,邮件里带有审核地址。
或者您也可以在应用列表里找到未审核的应用进入。
提交的基础信息
生成的kubernetes yaml
代码库中的Dockerfile文件
驳回
如果管理员觉得提交的有问题,可以进行驳回,驳回填定理由会发送至提交者的邮箱。
若没有啥问题,可以点击“开始部署”按钮。
开始部署之后应用会自动在jenkins上创建一个job,并自动进行build。
在我们项目维护过程中,可能会遇到需要修改服务器时间,平台的工具集功能就可以满足您的需求了~
在这需要注意,此功能依赖faketime,请在宿主机编译faketime扩展。路径在 /usr/local/lib/libfaketime.so.1
在项目列表中筛选您要修改的项目,点击 修改时间,确认之后会重启服务生效。
Github: https://github.com/kplcloud/kplcloud
Document: https://docs.nsini.com
Demo: https://kplcloud.nsini.com
作者:宜人金科-财富技术部-创新团队