kubernetes听云实战发布版

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

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

下面进入正题:

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

1.系统架构

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

这是典型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内容如下:

FROM registry.tingyun.com/docker.io/alpine
MAINTAINER netop "[email protected]"
ENV REFRESHED_AT 2016-03-18
RUN apk add --no-cache --update-cache bash
ENV GLIBC_PKG_VERSION=2.23-r1
RUN apk add --no-cache --update-cache curl ca-certificates bash &&   curl -Lo /etc/apk/keys/andyshinn.rsa.pub "https://github.com/andyshinn/alpine-pkg-glibc/releases/download/${GLIBC_PKG_VERSION}/andyshinn.rsa.pub" &&   curl -Lo glibc-${GLIBC_PKG_VERSION}.apk "https://github.com/andyshinn/alpine-pkg-glibc/releases/download/${GLIBC_PKG_VERSION}/glibc-${GLIBC_PKG_VERSION}.apk" &&   curl -Lo glibc-bin-${GLIBC_PKG_VERSION}.apk "https://github.com/andyshinn/alpine-pkg-glibc/releases/download/${GLIBC_PKG_VERSION}/glibc-bin-${GLIBC_PKG_VERSION}.apk" &&   curl -Lo glibc-i18n-${GLIBC_PKG_VERSION}.apk "https://github.com/andyshinn/alpine-pkg-glibc/releases/download/${GLIBC_PKG_VERSION}/glibc-i18n-${GLIBC_PKG_VERSION}.apk" &&   apk add glibc-${GLIBC_PKG_VERSION}.apk glibc-bin-${GLIBC_PKG_VERSION}.apk glibc-i18n-${GLIBC_PKG_VERSION}.apk
add Shanghai /etc/localtime
ENV LANG en_US.UTF-8

构建镜像

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

push 到仓库中

docker push registry.tingyun.com/common/alpine

构建JDK镜像

Dockerfile内容如下:

FROM registry.tingyun.com/common/alpine
MAINTAINER netop "[email protected]"
ENV REFRESHED_AT 2016-03-14
ADD  jdk1.7.0_45.tar.gz /opt
ENV LANG en_US.UTF-8
ENV JAVA_VERSION  1.7.0_45
ENV JAVA_HOME  /opt/jdk1.7.0_45
ENV PATH $JAVA_HOME/bin:$PATH

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

docker build -t registry.tingyun.com/common/jdk7 .
push 到仓库中
docker push registry.tingyun.com/common/jdk7
构建tomcat镜像
Docker内容如下:
FROM registry.tingyun.com/common/jdk7
MAINTAINER netop "[email protected]"
ENV REFRESHED_AT 2016-03-14
ADD  apache-tomcat-6.0.45.tar.gz /opt
RUN ln -s /opt/apache-tomcat-6.0.45 /opt/apache-tomcat
ADD server.xml /opt/apache-tomcat/conf/server.xml
ENV CATALINA_HOME /opt/apache-tomcat
ENV PATH $CATALINA_HOME/bin:$PATH
ENV TOMCAT_MAJOR 6
ENV TOMCAT_VERSION 6.0.45
ENV JAVA_OPTS   -server -Djava.library.path=/opt/apache-tomcat/lib -XX:+UseConcMarkSweepGC  -XX:+PrintGCDetails  -XX:+PrintGCDateStamps -Xloggc:/opt/apache-tomcat/logs/gc.log
WORKDIR $CATALINA_HOME
ENV TINGYUN_APP_NAME="Java Application" TINGYUN_LICENSE_KEY=f451bae910b4c3f4473e0c83d2113742
RUN curl -o /tingyun-agent-java-latest.zip  http://download.tingyun.com/agent/java/latest/tingyun-agent-java-latest.zip
RUN mkdir /opt/tingyun_agent;unzip /tingyun-agent-java-latest.zip -d /opt/tingyun_agent
RUN rm /tingyun-agent-java-latest.zip -rf
ENV CONNECTOR=‘<Connector port="8080" maxHttpHeaderSize="8192"    maxThreads="300" minSpareThreads="25" maxSpareThreads="300"      enableLookups="false" redirectPort="8443" acceptCount="100"     connectionTimeout="20000" disableUploadTimeout="true" />‘
ENV CONTEXT=""
ENV ACCESS_LOG="<Valve className=\"org.apache.catalina.valves.AccessLogValve\" directory=\"logs\"               prefix=\"access_log.\" suffix=\".log\"               pattern=‘%{X-Request-Start}i %{X-Queue-Start}i  %{X-Forwarded-For}i %h %l %u %t \"%r\" %s %b \"%{Referer}i\" \"%{User-Agent}i\" %T‘ resolveHosts=\"false\"/>"
ADD run.sh /run.sh
EXPOSE 8080
CMD ["/run.sh"]

run.sh内容如下:

#!/bin/bash
TINGYUN_AGENT_PATH="/opt/tingyun_agent/tingyun/tingyun.properties"
TOMCAT_CONF_PATH="/opt/apache-tomcat/conf/server.xml"
sed -i "s/Java Application/$TINGYUN_APP_NAME/"  $TINGYUN_AGENT_PATH
sed -i "s/<%=license_key%>/$TINGYUN_LICENSE_KEY/"  $TINGYUN_AGENT_PATH
sed -i "s#CONNECTOR#$CONNECTOR#"  $TOMCAT_CONF_PATH
sed -i "s#CONTEXT#$CONTEXT#"  $TOMCAT_CONF_PATH
sed -i "s#ACCESS_LOG#$ACCESS_LOG#"  $TOMCAT_CONF_PATH
catalina.sh run

server.xml内容如下:

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

此处将Connector注释掉,改为CONNECTOR

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

我们进行build

docker build -t registry.tingyun.com/common/jdk7-tomcat6 .
docker push registry.tingyun.com/common/jdk7-tomcat6

查看该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

#!/bin/bash
FUN_DIR=$1
APP_DIR=$2
PACK_NAME=$3
PACK_MD5=$4
APP_NAME=$5
BASE_IMG=$6
FINISH_IMG=$7
BUILD_NUM=$8
if [ -d "/data/tmp" ];then
    rm /data/tmp/* -rf 
else
    mkdir /data/tmp -p
fi
if [ ! -n "$1" ] || [ ! -n "$2" ] || [ ! -n "$3" ] || [ ! -n "$4" ] || [ ! -n "$5" ] || [ ! -n "$6" ] || [ ! -n "$7" ] || [ ! -n "$8" ] ;then
    echo "build error,please input  vars"
else
    PACK_URL=http://192.168.1.16/tingyun/${PACK_NAME}
    MD5_URL=http://192.168.1.16/tingyun/${PACK_MD5}
    /usr/bin/curl -o /data/tmp/${PACK_NAME} $PACK_URL
    /usr/bin/curl -o /data/tmp/${PACK_MD5} $MD5_URL
    MD5_ORIGN=`/usr/bin/curl $MD5_URL | awk ‘{print $1}‘`
    MD5_WGET=`cat /data/tmp/${PACK_MD5} | awk ‘{print $1}‘`
    if [ "$MD5_ORIGN" = "$MD5_WGET" ]; then
        echo "md5sum sucess"
        /usr/bin/unzip /data/tmp/${PACK_NAME} -d  /data/tmp/${APP_NAME}
        ADD_FILE="ADD ${APP_NAME} /opt/${FUN_DIR}/${APP_DIR}/${APP_NAME}"
        cp /data/build/Dockerfile_template /data/tmp/Dockerfile 
        sed -i "s#BASE_IMG#$BASE_IMG#" /data/tmp/Dockerfile
        sed -i "s#ADD_FILE#$ADD_FILE#" /data/tmp/Dockerfile
        docker build --no-cache=true -t  ${FINISH_IMG}:${BUILD_NUM} /data/tmp/
        docker push ${FINISH_IMG}:${BUILD_NUM}
        echo  "build img is ${FINISH_IMG}:${BUILD_NUM}"
    else
        echo "md5sum failed"
    fi  
fi

vim Dockerfile_template

FROM BASE_IMG
MAINTAINER netop "[email protected]"
ENV REFRESHED_AT 2016-02-18
ADD_FILE

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

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

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

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

用jenkins build

build 成功。

2.3 k8s配置应用

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

2.3.1 配置configmap

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

mkdir configmap
cd configmap
ls -al

配置文件放到该目录下

vim create_configmap.sh
kubectl create configmap report-app-beta-config --from-file=configmap
vim reload_configmap.sh 
kubectl delete configmap report-app-beta-config
kubectl create configmap report-app-beta-config --from-file=configmap

2.3.2 配置deployment

下面配置deployment

vim deployment.yaml

apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: report-app-beta     #应用名称
spec:
  replicas: 10               #启动副本个数
  minReadySeconds: 60     #滚动升级时60s后认为该pod就绪
  strategy:
    rollingUpdate:
      maxSurge: 50%      #滚动升级时会先启动20%的pod
  template:
    metadata:
      labels:
        name: report-app-beta
    spec:
      volumes:
      - name: config-volume               #configmap的挂载点
        configMap:                      
          name: report-app-beta-config
      - name: pv-mapping-files             #pvc的挂载点
        persistentVolumeClaim:
          claimName: mapping-files
      nodeSelector:                     #选择调度的node节点
        zone: low
#      hostNetwork: true
      containers:
      - name: report-app-beta
#        livenessProbe:                  #监控
#          httpGet:
#            path: /healthCheck
#            port: 8080
#          initialDelaySeconds: 30
#          timeoutSeconds: 10
        image: registry.tingyun.com/app/report-app:1
        command:             #小hack,为了不重打镜像,不执行默认的命令
          - sh
          - "-c"
          - ln -s /opt/mapping_files/puuid /bin/puuid && /run.sh
           env:                               #环境变量
        - name: TINGYUN_APP_NAME
          value: report-app
        - name: TINGYUN_LICENSE_KEY
          value: f451bae910b4c3f4473e0c83d2113742
        - name: JAVA_OPTS
          value: "-server -Djava.library.path=/opt/apache-tomcat/lib -Xms512m -Xmx2048m -XX:NewRatio=4 -Xss1024k  -XX:PermSize=64M -XX:MaxPermSize=256M   -XX:+UseConcMarkSweepGC  -XX:+PrintGCDetails  -XX:+PrintGCDateStamps -Xloggc:/opt/apache-tomcat/logs/gc.log -javaagent:/opt/tingyun_agent/tingyun/tingyun-agent-java.jar -Duser.language=zh -Duser.region=CN -Duser.timezone=GMT+08 -DappName=report-app"
        - name: CONNECTOR
          value: ‘<Connector port="8080" maxHttpHeaderSize="8192"    maxThreads="300" minSpareThreads="25" maxSpareThreads="300"      enableLookups="false" redirectPort="8443" acceptCount="100"     connectionTimeout="20000" disableUploadTimeout="true" /> ‘
        - name: CONTEXT
          value: ‘<Context path="/mobile" reloadable="false" allowLinking="true"  docBase="/opt/tingyun/report-app/webapp/" workDir="/opt/tingyun/report-app/work/"/>   ‘
        ports:
         - containerPort: 8080
        volumeMounts:                     #上边的挂载点挂载到容器中的路径
        - name: config-volume                           
          mountPath: /opt/tingyun/report-app/conf      
        - name: pv-mapping-files
          mountPath: /opt/mapping_files

kubectl create -f deployment.yaml

kuectl get pods

看pod已经起来了

2.3.3 配置Service

下面配置service

vim service.yaml

apiVersion: v1
kind: Service
metadata:
  name: report-app-beta
  labels:
    name: report-app-beta
spec:
 # sessionAffinity: ClientIP   #在基于新的nginx-ingress-controller已经不需要配置该项,session绑定在nginx处配置
  ports:
    - port: 8080
  selector:
    name: report-app-beta

kubectl create -f service.yaml

kubectl get service

2.3.4 配置ingress

下面配置ingress

vim ingress.yaml
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: report-app-beta
spec:
  rules:
  - host: report-beta.tingyun.com     #域名
    http:
      paths:
      - path: /mobile               #访问路径
        backend: 
          serviceName: report-app-beta    #service名称
          servicePort: 8080              #service端口

kubectl create -f ingress.yaml

kubect get ingress

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保持,同时听云的开发工程师要打开后端监控页面,需要修改两个地方。

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

这里直接启用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

接下来即可访问该项目

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

时间: 2024-10-27 13:25:41

kubernetes听云实战发布版的相关文章

听云平台发布:移动应用性能黑洞报告

1秒,2秒,3秒……据听云平台(www.tingyun.com)观测:在移动应用出现性能问题导致延时响应10秒后,有近5%的真实用户放弃使用该应用,并永久离开.而应用性能问题出现的频率与错误种类却绝对超乎你的想象,听云平台对5079个不同机型.1172种操作系统以及18家运营商进行整合分析得出“应用性能问题组合超1亿零700万种”,你永远不知道下一个导致用户流失的性能问题是什么.听云平台监测发现有十种应用性能问题最具危害,将之定义为应用性能黑洞Top10. 一.移动应用性能问题种类汇总分析 你知

听云平台发布:移动应用性能黑洞报告

1秒,2秒,3秒……据听云平台(www.cntingyun.com)观测:在移动应用出现性能问题导致延时响应10秒后,有近5%的真实用户放弃使用该应用,并永久离开.而应用性能问题出现的频率与错误种类却绝对超乎你的想象,听云平台对5079个不同机型.1172种操作系统以及18家运营商进行整合分析得出“应用性能问题组合超1亿零700万种”,你永远不知道下一个导致用户流失的性能问题是什么.听云平台监测发现有十种应用性能问题最具危害,将之定义为应用性能黑洞Top10.  一.移动应用性能问题种类汇总分析

基于开源SuperSocket实现客户端和服务端通信项目实战(发布版)

摘要 本期带给大家分享的是阿笨在实际工作中遇到的真实业务场景,请跟随阿笨的视角去如何一步步解决WEB网页快速批量打印,如果您对本期的教程内容感兴趣,那么请允许让阿笨带着大家一起学习吧! 废话不多说,直接上干货,我们不生产干货,我们只是干货的搬运工. 你准备好了吗,老夫要开始撸了 一.需求背景介绍 大概是2年以前工作中碰到的一个实际项目,在仓储物流系统中,打印是一个很频繁的操作环节,仓库每天经常需要大批量的在WEB网页上打印功能.比如内部HTML标签.邮递标签(10x10,10x16.5,10x2

利用听云Server和听云Network实测Kubernetes和Mesos在高并发下的网络性能

文章出自:听云博客 随着公司业务的不断增长,我们的应用数量也有了爆发式增长.伴随着应用爆发式的增长,管理的难度也随之加大.如何在业务爆发增长的同时快速完成扩容成了很大的挑战.Docker的横空出世恰巧解决了我们的问题.利用Docker我们可以快速完成扩容缩容,且配置统一,不易出错. 在Docker的集群管理选型上,我们比较纠结,目前比较流行的是Mesos和Kubernetes.从功能来说,我们更倾向于使用Kubernetes,他在容器编排方面的能力强于Meoso,且提供了持久化存储方案,更适合我

阿里云重磅发布RDS for SQL Server AlwaysOn集群版

2018年双十一刚过,阿里云数据库发布RDS for SQL Server AlwaysOn集群版,这是业界除微软云SQL Database外,首家云计算公司基于SQL Server最新AlwaysOn核心技术实现的数据库集群版,并且是经过双十一检验的商业化版本. 全形态的产品集合 纵观整个RDS for SQL Server的产品迭代图,AlwaysOn集群版的上线标志这SQL Server数据库在阿里云RDS平台的全面覆盖,阿里云数据库实现了针对企业客户不同阶段的产品体系的匹配. 基础版针对

感受SaaS版“服务器端应用私人医生”—— 听云Server APM内测手记

平时一直对应用性能优化和网络安全比较感兴趣,最近看到号称"服务器端应用私人医生"的听云Server在内测,就申请了一个试试. 这是基调网络开发的一款应用性能管理服务,名叫"听云Server".看介绍上说,它可以监控应用代码的响应时间,通过慢追踪,定位有问题的代码.监控关系型数据库的查询操作:监控NoSQL的响应时间:监控当前应用调用的外部服务的响应时间:最快的帮助你定位和解决问题-- 是不是真的这么好,还是用用看再说吧. 申请到账号之后登录系统,迎面而来的是App.

Java企业级电商项目架构演进之路 Tomcat集群与Redis分布式百度云实战分享

muke慕课实战课程分享QQ313675301 新增课程: Java企业级电商项目架构演进之路 Tomcat集群与Redis分布式百度云实战分享 后端开发: 1.高级java软件架构师实战培训视频教程2.大型SpringMVC,Mybatis,Redis,Solr,Nginx,SSM分布式电商项目视频教程3.Spark Streaming实时流处理项目实战4.Java校招面试 Google面试官亲授5.Java开发企业级权限管理系统6.Java大牛 带你从0到上线开发企业级电商项目7.Java

听云第六期应用性能管理大讲堂——北京、上海、成都三站同时开启!

9月19日 北京 上海 成都 三地同时上演 应用性能管理大讲堂 好戏精彩不断! 北京站: 应用性能管理大讲堂——互联网时代新标配 演讲嘉宾: e袋洗 CTO 岑永洪 听云研发副总裁 廖雄杰 听云研发副总裁架构师,现任听云技术副总裁,致力于应用性能优化及流式数据处理,对构建高性能Java应用有深入研究. 神秘嘉宾 即将揭晓 沙龙时间:9月19日 13:00——17:00 沙龙地点:#北京市中关村创业大街3W咖啡# 上海站: 听云&Ucloud应用性能管理大讲堂——O2O电商 如何借助“云+APM”

听云助力陌陌打造完美用户性能体验

截止到2014年6月30日,陌陌总注册用户数1.48亿,月活跃用户数5243万,这是陌陌上线运营3年后交出的一份答案,这是一个绚烂的成绩,陌陌三年来给大家带来的不仅仅是一款移动社交软件,在总有新奇在身边理念的注入下,基于兴趣与地理位置的群组社交功能,让人与人通过趋同认知连接在一起,健康的移动社交生态圈已初步形成.可以说在陌陌里,人并不陌生,在这个趋势的背后,是陌陌通过完美用户性能体验的改善来支撑的. 1.5亿用户跨越150个国家连接在一起 陌陌作为国内首屈一指的移动社交软件,有近1.5亿的用户量