更多技术干货请戳:听云博客

听云线上使用k8s已经有一段时间了,下面对一些听云使用过程中的问题进行一些梳理,包括架构设计,安装部署和后期维护。 目录结构如下:

kubernetes听云实战发布版-LMLPHP

下面进入正题:

我们以听云系统的一个报表系统为例来详细进行说明:

1.系统架构

该应用属于Java Web报表类应用,部署在Ucloud云上。系统架构如下:

kubernetes听云实战发布版-LMLPHP

这是典型web应用的系统架构,在听云内部大部分应用都是此形式,对于并发量不高的业务均可参考此文档。

基本规范:

1.configmap用来管理配置文件

2.deployment用来编排应用,进行升级回滚等

3.pv用于共享存储,后端为glustefsr和nfs

4.daemonset 用于变更不频繁,一台机器一个docker的应用

5.nginx+ingress来做前端负载均衡和自动发现

6.对并发要求很高的应用可以尝试用host模式,不用service做负载均衡

2.部署说明

参考架构图,我们需要nginx-ingress-controller 和 应用的Docker。下面分别进行详细说明。

2.1 准备基础Docker镜像

听云先进行应用的部署,规范是每个项目一个Docker镜像,版本号为jenkins构建的版本号。

为了规范日后上线。我们需要按层次构建镜像,方便日后使用。

构建基础镜像

由于听云的项目中绝大大部分为Java项目,为了精简Docke镜像大小,基础镜像我们没有采用Centos或者Ubuntu,而是采用了alpine,该镜像只有4MB。

Dockerfile内容如下:

构建镜像

docker build -t registry.tingyun.com/common/alpine .

push 到仓库中

docker push registry.tingyun.com/common/alpine

构建JDK镜像

Dockerfile内容如下:

该镜像只添加了一个jdk包,我们build它

run.sh内容如下:

server.xml内容如下:

此处不贴文本了,内容为标准的server.xml 做了字符串替换。

此处将Connector注释掉,改为CONNECTOR

kubernetes听云实战发布版-LMLPHP

此处将access_log和 context部分 删掉 ,替换为图片中字符串。

kubernetes听云实战发布版-LMLPHP

我们进行build

查看该Dockerfile会注意到我们将听云Server探针进行了嵌入。是否启用探针我们会在后续的k8s配置文件进行控制,因为应用在k8s上跑具体跑在哪台机器上是不固定的,原有的zabbix jmx监控无法满足需求,我们利用听云Server来进行监控。

2.2 利用jenkins构建应用镜像

按照上文方式,准备好相关的基础镜像,如jdk7-tomcat6  jdk8-tomcat8等。

下边利用jenkins来构建应用镜像。

由于听云的jenkins本身操作系统版本太低,无法使用docker, 所以要选一台部署了docker的机器作为build机,通过ssh的方式来进行build。(此处视build的数量考虑是否需要利用jenkins slave的方式来进行build。简单测试过mesos 作为slave的方式,流程跑通,没有深测)

听云工程师们是通过写个通用的build脚本,用来build应用的镜像。

vi build_tomcat_docker.sh

vim Dockerfile_template

如果Java探针有更新,需要重新build下前边的基础镜像,在build机器上重新pull镜像后再构建应用镜像。

打开jenkins该项目,标红处添加该行,用于记录要升级的镜像和build号

注意命名规范:中间列是产品线。

kubernetes听云实战发布版-LMLPHP

添加下列用于构建镜像的机器

kubernetes听云实战发布版-LMLPHP

用jenkins build

build 成功。

kubernetes听云实战发布版-LMLPHP

2.3 k8s配置应用

镜像已经准备好了,接下来配置应用

2.3.1 配置configmap

应用的配置文件统一通过conigmap来管理

kubernetes听云实战发布版-LMLPHP

配置文件放到该目录下

2.3.2 配置deployment

下面配置deployment

vim deployment.yaml

kubectl create -f deployment.yaml

kuectl get pods

看pod已经起来了

kubernetes听云实战发布版-LMLPHP

2.3.3 配置Service

下面配置service

vim service.yaml

kubectl create -f service.yaml

kubectl get service

kubernetes听云实战发布版-LMLPHP

2.3.4 配置ingress

下面配置ingress

kubectl create -f ingress.yaml

kubect get ingress

kubernetes听云实战发布版-LMLPHP

2.4 创建nginx-ingress-controller

nginx-ingress-controller  需要监听宿主机的80端口,固定在某几台机器上,为此需要给相关node 定义标签。

kubectl label nodes ucd-ty-k8s-node-001.ucd.tingyun.com role=nginx-lb

kubectl get nodes --show-labels

创建configmap

vim nginx.tmpl

该文件可以去github上下载

https://github.com/kubernetes/contrib/blob/master/ingress/controllers/nginx/nginx.tmpl

kubectl create configmap nginx-template --from-file=nginx.tmpl=nginx.tmpl

为了将为所有在nginx后的项目开启session保持,同时听云的开发工程师要打开后端监控页面,需要修改两个地方。

kubernetes听云实战发布版-LMLPHP

这里暂时先改为无论如何都启用session保持

kubernetes听云实战发布版-LMLPHP

这里直接启用traffic_status

vim rc.yaml

该文件可以去github下载

https://github.com/kubernetes/contrib/blob/master/ingress/controllers/nginx/examples/full/rc-full.yaml

kubectl create rc.yaml

查看nginx_status界面

http://10.10.228.175:8080/nginx_status

kubernetes听云实战发布版-LMLPHP

接下来即可访问该项目

kubernetes听云实战发布版-LMLPHP

原文链接:http://blog.tingyun.com/web/article/detail/825

05-07 15:26