htc u 11 什么时候友盟推送u push安卓8.0

e人e本K8s(32GB/8英寸)(
K8s(32GB/8英寸) )
IPS屏幕2GB32GB8英寸重力感应
处理器型号
高通骁龙410(MSM8916)
处理器核心
商务平板电脑
处理器品牌
高通骁龙410(MSM8916)
处理器核心
处理器主频(GHz)
处理器主频范围(GHz)
扩展内存容量
支持Micro SD(TF)卡
电磁式触摸屏,多点式触摸屏
IPS屏幕,支持原笔迹手写
屏幕尺寸范围
触摸屏,电磁笔
4G LTE(三网通)
多媒体功能
支持录制1080P视频
支持播放720P视频
支持MP3等格式
支持H.263,H.264,AVC,MPEG-4,SP格式
支持TXT,WORD,EXCEL,PPT,PDF等格式
支持JPG,JPEG,BMP,GIF,PNG格式
1×USB-HOST,1×Micro-USB2.0
3.5mm耳机接口
电源接口,存储卡接口,SIM/UIM卡插槽
Home按键,开关按键,音量按键
内置GPS导航,支持A-GPS定位
Office软件,电子邮件,记事本,日历功能等
预装应用智能办公套件,云平台等
其他功能特性
支持国家密码管理局认证的安全芯片,拥有256位加密算法,非法软件无法攻入,支持安全分区技术,加密区域可独立运行软件,分类管理文件,避免私密信息被查阅
聚合物锂电池,4600毫安
电源适配器
100V-240V 自适应交流电源供应器
8小时左右,具体时间视使用环境而定
支持多国语言
平板电脑主机×1,电磁触控笔×1,数据线×1,皮套×1,充电器×1, 说明书×1,保修卡×1,合格证×1
e人e本K8s(32GB/8英寸)网友点评
基于个网友评分,其中:
微博热议话题
精彩提问标题作者回复19311111
接下来您可以
指导价:¥5580
市场价:¥5050-¥5580
产品图片赏析
平板电脑新品推荐
平板电脑品牌排行
商家促销信息
免责声明:此页面(本网站)所显示的维修商主体资格、经营资质、报价、售后服务等承诺、以及所发布的商务信息等内容的真实性、准确性和合法性由发布维修商负责,不代表天极网观点,天极网亦对此不作任何承诺与保证,天极网所提供(本站显示)的信息资料仅作为市场资讯供用户参考。页面上带有"官"字图标的为官方授权维修点,带有"认"字图标的为天极网平台认证维修点,带有"保"字图标的为提交了保证金的维修点。天极网建议您选择同城具有相当资质的维修商当面交易,不要先直接打款给维修商,以降低自身风险。网络用户依其意志自主选择维修主体、维修物品,并自行承担后续风险,本站不承担任何法律责任。
||||||||||Copyright (C) 1999-, All Rights Reserved 版权所有 天极网络京公网安备84号微服务动态路由实现:OpenResty K8s
我的图书馆
微服务动态路由实现:OpenResty K8s
『发送关键字“OpenResty”至此公众号,获取完整PPT下载』 &&K8sService能够提供很强大的功能,通过提供ClusterIP可以作为Pod的对外访问接口,并提供软负载均衡。但是Service的ClusterIP地址只能在集群内部访问,如何让集群外部的用户访问Service呢,如果选择了NodePort方式对外暴露服务,会造成用户对端口敏感,端口的变化会对用户造成不便,如何既能享受到Service的好处,又不让用户需要敏感内部实现呢?大家好,今天向各位分享的主题是《微服务的路由实现: OpenResty K8s》,介绍在新一代平台中如何将OpenResty与Kubernetes结合使用的经验,有些理解不对或者使用不对的地方还请大家指正。本次分享分为:1.介绍OpenResty是什么,以及通过一个hello world简单了解下OpenResty2.为什么需要OpenResty,主要解决哪些问题?3.如何在K8s上部署OpenResty,如何使用ConfigMap,DaemonSet4.新的选择:Ingress第一部分:OpenResty是什么OpenResty是一个基于&Nginx&与Lua的高性能 Web 平台,其内部集成了大量精良的Lua库、第三方模块以及大多数的依赖项。用于方便地搭建能够处理超高并发、扩展性极高的动态Web 应用、Web 服务和动态网关。主要有章亦春维护。&OpenResty通过汇聚各种设计精良的 Nginx 模块(主要由OpenResty团队自主开发),从而将 Nginx 有效地变成一个强大的通用 Web 应用平台。右边的列表中的组件被用于构建OpenResty。&先通过一个hello world的例子,来对OpenResty有个大概了解。&编写一个nginx.conf,在nginx.conf使用了content_by_lua,主要是ngx.say(“&p&hello,world&/p&”),然后使用该配置文件启动nginx。当浏览器访问 http://xxx.xxx.xxx.xxx时,会看到页面显示的是 hello,world。&通过这个例子大概可以看到OpenResty能做些什么事,可以直接在nginx.conf中通过编写Lua脚本,实现一些需要编写代码来完成的功能。后面我们会继续介绍如何使用OpenResty。第二部分:为什么要需要OpenResty先来看看遇到的问题,大家都知道K8s Service能够提供很强大的功能,通过提供ClusterIP可以作为Pod的对外访问接口,并提供软负载均衡。但是Service的ClusterIP地址只能在集群内部访问,如果是集群外部的用户要如何访问Service呢?Kubernetes通过两种方式来实现上述需求,一个是“NodePort”,另一个是“LoadBalancer”。&我们现在用的是NodePort的方式来使得Service可以被外部用户访问,这样带来的问题是:1.外部访问服务时需要带NodePort2.每次部署服务后,NodePort端口会改变&对于这2个问题,我们选择的是使用Nginx做反向代理,给服务暴露的http的端口起一个端口名(如web),通过“http://web. svc01.tenant01.cluster01.devops.tp”来代替“http:// svc01.tenant01.cluster01.devops.tp:35089”去访问服务,这样对于用户就屏蔽NodePort,多次部署后用户也不需要知道新的NodePort。前面介绍了遇到的问题:需要屏蔽NodePort,这里介绍下为什么需要OpenResty,引入了OpenResty后如何做动态路由。按照设想希望用户通过输入“http://web.svc01.tenant01.cluster01.devops.tp”地址来访问服务,这样就可以对用户屏蔽NodePort。这样就需要一层host转换来实现动态路由,如果直接使用nginx,就需要动态的修改nginx.conf,这样带来的问题就是需要能够动态的对nginx.conf做内容增减(添加/删除服务时),以及需要同时修改多个nginx.conf。这个听起来好像也不算方便。&使用OpenResty的话,可以和Redis结合。Redis里保存了service的host和clusterip:port的映射,当用户访问“http://web.svc01.tenant01.cluster01.devops.tp”时请求会被OpenResty拦截,OpenResty根据请求的host到redis里查询对应的service的clusterip:port,根据clusterip:port再做一次upstream去访问K8s Service。如果没有找到host对应的value则会抛出相应的httpstatus code(500,400)。前面介绍了OpenResty如何利用Redis中的数据做动态路由,那么Redis中的数据是在何时写进去的?因为使用了Reids,服务信息维护也相对简单,只需要在服务有变更时去操作Redis的主结点进行信息的增/删即可。&现在在新一代里在以下几个时机会去操作Redis中的数据:·&服务创建:在服务创建后,如果服务的端口名带有web,则会向Redis写入服务的域名(key)以及对应的clusterip:port(value)。· 服务销毁:在服务删除前,删除Redis中相应的服务的域名。· 租户拉黑:查找租户相应的所有环境[开发、测试、…..],把这些环境里的所有服务在Redis里的key加上“$_.”前缀。· 租户恢复:将租户拉黑时修改的key,去掉“$_.”的前缀。· 租户销毁:查找租户相应的所有环境[开发、测试、…..],把这些环境里的所有服务在Redis里的key删除。第三部分:如何在K8s上部署OpenResty前面介绍完大致思路,接下来就进入实际操作阶段,第一步就是制作镜像。使用到的镜像为:OpenResty1.9.15.1Redis3.2.1phpRedisAdminmaster镜像制作完成后提交到镜像私库供后续使用。&镜像制作时需要考虑镜像的配置可以通过配置文件,命令行参数和环境变量的组合配置来完成。这些配置应该从image内容中解耦,以此来保持容器化应用程序的便携性。所以我们在制作镜像时将配置文件和启动脚本可以从外部mount,这样在调试时方便修改,不需要每次重新打镜像。这里插播一下K8s ConfigMap,前面说了镜像制作时需要配置和镜像分离,那么在真正使用时,就需要将配置注入容器,这时候使用的就是K8s ConfigMap特性。&ConfigMap提供了将配置数据注入容器的方式,同时保持容器是不知道Kubernetes的。ConfigMap可以被用来保存单个属性,也可以用来保存整个配置文件或者JSON二进制大对象。&ConfigMap使用键-值对配置数据,这个数据可以在pods里使用。data&一栏包括了配置数据。就如同看到的那样,ConfigMap可以被用来保存单个属性,也可以用来保存一个配置文件。&配置数据可以通过很多种方式在Pods里被使用。ConfigMaps可以被用来:·&设置环境变量的值· 在容器里设置命令行参数·&在数据卷里面创建config文件在OpenResty部署中我们使用的是在数据卷里面创建config文件&先创建一个configmap目录,在configmap目录里有2个文件:· redis.conf:保存的是reids的配置。·&run.sh:保存的是redis的启动脚本,根据环境变量来确定按那种模式启动redis。&通过使用”kubectl --namespace=euler-system createconfigmapsem-redis-configmap --from-file redis/configmap”可以将目录创建为ConfigMap。ConfigMap里会有2个key,一个是”redis.conf”,一个是”run.sh”。 value分别对应的是文件内容。&创建完成后可以执行” kubectl --namespace=euler-system get configmapsem-redis-configmap-o yaml”查看ConfigMap的内容。&在部署时可以通过volume将ConfigMap的内容变成文件挂载到容器内。Redis是按主从方式部署,主结点上还会安装phpRedisAdmin方便查看维护Redis的信息。从结点部署时需要指定需要关联主结点的服务名和端口号。&使用时需要注意volumes和volumeMounts。无论主从在部署时,都需要将ConfigMap作为一个volume,并且要将ConfigMap的key对应的内容保存成指定的文件名,如key=“redis.conf”,path=“redis.conf”表示将ConfigMap中key=”redis.conf”的内容保存到path=“redis.conf”的文件。&这个ConfigMap的volume会mount到容器内的一个目录”/app/configmap”。因为前面制作的镜像就会在/app/configmap目录下查找run.sh的启动脚本,并且脚本在启动时也使用到了/app/configmap/redis.conf的配置。这样就能正常启动。&这里没有使用Redis的sentinel,而是使用了K8s的RS来保证Redis主结点的可用性(Master停止后自动重启)。步骤和创建Redis的ConfigMap一样,先创建一个configmap目录,在configmap目录里有2个文件:· nginx.conf:保存的是nginx的配置。· run.sh:保存的是nginx的启动脚本。&通过使用”kubectl --namespace=euler-system createconfigmapsem-openresty-configmap --from-file openresty/configmap”可以将目录创建为ConfigMap。&需要注意的是nginx.conf中的%resolver%,%redis_slave_svc_host%,%redis_slave_svc_port%· resolver:是告诉nginx用哪个dns server去解析域名。在这里使用的是K8s集群里的skydns的地址。· redis_slave_svc_host:指定需要连接到redis的slave的host地址。· redis_slave_svc_port:指定需要连接到redis的slave的port。&这3个变量在容器启动时会由run.sh先进行变量替换,再启动ngixn这里先介绍一下K8s Daemon Set,因为OpenResty的部署用到了Daemon Set,而不是Deployment。Daemon Set可确保所有的节点运行一个Pod。有新的节点添加到群集时,Pod会被被添加到其中。当节点从群集中移除,Pod会被删除。&DaemonSet的一些典型的用途是︰· 在每个节点上运行群集存储守护进程,如&glusterd,ceph。· 在每个节点上运行日志收集守护进程,如&fluentd&,logstash。· 在每个节点上运行监控守护进程,如collectd,gmond。&可以看到主要用途是在每个节点上装一些守护进程,而我们的需求正好是在每个节点上都装一个OpenResty,这样经过前端DNS解析后可以转到任意一个节点的OpenResty。本来打算是在每个节点上通过systemd管理这些服务,然后发现不是很方便,而K8s正好提供了Daemon Set,就用了Daemon Set。&OpenResty是按DaemonSet方式部署,注意kind是DaemonSet,然后需要设置REDIS_HOST和REDIS_PORT,告诉OpenResty需要连接哪的Redis。&需要注意volumes和volumeMounts。将ConfigMap作为一个volume,并且将ConfigMap的key对应的内容保存成指定的文件名,如key=“nginx.conf”,path=“nginx.conf”表示将ConfigMap中key=”nginx.conf”的内容保存到path=“ngixn.conf”的文件。&这个ConfigMap的volume会mount到容器内的一个目录”/app/configmap”。因为前面制作的镜像就会在/app/configmap目录下查找run.sh的启动脚本,并且脚本在启动时也使用到了/app/configmap/nginx.conf的配置。这样就能正常启动。&到了这里OpenResty就部署完成了,可以看到在整个K8s集群中的每个monion节点上都部署了一个OpenResty的Pod,并在集群里部署了1个Redismaster Pod,2个Redis slave Pod。可以执行kubectl --namespace=euler-system get pod 查看namespace下的所有Pod。&当有K8s的Service被创建后,SEM会向Redis Master注册服务域名和clusterip:port的键值对。这样用户就可以通过如“http://web.svc01.tenant01.cluster01.devops.tp”的url访问到服务了。第四部分:新的选择Ingress说是新的选择,不是指它是个新特性,是我自己知道的比较晚,原本以为ingress只能用于GCE/GKE环境,经我司春龙、潇男提醒,也可以用于本地环境。&一个Ingress(入口)是一系列允许访问集群服务的连接规则. 它可以为服务配置一个外部访问&url,负载均衡,SSL,以及提供基于名称的虚拟主机等。用户通过将入口资源发布到&API&服务器请求入口。进入控制器(Ingress Controller)负责履行入口,通常与一个负载均衡器一起工作。如在GoogleGCE上的Http Load Balancer,或者本地的Nginx。&IngressController 的大概工作流程是监控Ingress的变化,并将变化写Load Balancer的配置。在Nginx的Ingress Controller实现中会监听Ingress、Service、Endpoints、Secret对象的变化,并将变化写入nginx.conf文件,并重新加载nginx.conf。&上面的示例就是创建了一个Ingress,按照hostname和path可以将请求路由到K8s Service对应的Pod上。今天的分享就到这里,谢谢大家。关于作者:
发表评论:
TA的最新馆藏kubernetes听云实战发布版
kubernetes听云实战发布版
如需转载请联系听云College团队成员小尹 邮箱:听云线上使用k8s已经有一段时间了,下面对一些听云使用过程中的问题进行一些梳理,包括架构设计,安装部署和后期维护。 目录结构如下:下面进入正题:我们以听云系统的一个报表系统为例来详细进行说明:1.系统架构该应用属于Java Web报表类应用,部署在Ucloud云上。系统架构如下:这是典型web应用的系统架构,在听云内部大部分应用都是此形式,对于并发量不高的业务均可参考此文档。基本规范:1.configmap用来管理配置文件2.deployment用来编排应用,进行升级回滚等3.pv用于共享存储,后端为glustefsr和nfs4.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&/docker.io/alpine
MAINTAINER&netop&&&
ENV&REFRESHED_AT&
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&&/andyshinn/alpine-pkg-glibc/releases/download/${GLIBC_PKG_VERSION}/andyshinn.rsa.pub&&&&&\
&&curl&-Lo&glibc-${GLIBC_PKG_VERSION}.apk&&/andyshinn/alpine-pkg-glibc/releases/download/${GLIBC_PKG_VERSION}/glibc-${GLIBC_PKG_VERSION}.apk&&&&&\
&&curl&-Lo&glibc-bin-${GLIBC_PKG_VERSION}.apk&&/andyshinn/alpine-pkg-glibc/releases/download/${GLIBC_PKG_VERSION}/glibc-bin-${GLIBC_PKG_VERSION}.apk&&&&&\
&&curl&-Lo&glibc-i18n-${GLIBC_PKG_VERSION}.apk&&/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 /common/alpine .push 到仓库中docker push /common/alpine构建JDK镜像Dockerfile内容如下:FROM&/common/alpine
MAINTAINER&netop&&&
ENV&REFRESHED_AT&
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&/common/jdk7&.
push&到仓库中
docker&push&/common/jdk7
构建tomcat镜像
Docker内容如下:
FROM&/common/jdk7
MAINTAINER&netop&&&
ENV&REFRESHED_AT&
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=f451bae910b4c3fd2113742
RUN&curl&-o&/tingyun-agent-java-latest.zip&&/agent/java/latest/tingyun-agent-java-latest.zip
RUN&mkdir&/opt/tingyun_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&runserver.xml内容如下:此处不贴文本了,内容为标准的server.xml 做了字符串替换。此处将Connector注释掉,改为CONNECTOR此处将access_log和 context部分 删掉 ,替换为图片中字符串。我们进行builddocker&build&-t&/common/jdk7-tomcat6&.
docker&push&/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&
&&&&mkdir&/data/tmp&-p
if&[&!&-n&&$1&&]&||&[&!&-n&&$2&&]&||&[&!&-n&&$3&&]&||&[&!&-n&&$4&&]&||&[&!&-n&&$5&&]&||&[&!&-n&&$6&&]&||&[&!&-n&&$7&&]&||&[&!&-n&&$8&&]&;then
&&&&echo&&build&error,please&input&&vars&
&&&&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}&
&&&&&&&&echo&&md5sum&failed&
fivim Dockerfile_templateFROM&BASE_IMG
MAINTAINER&netop&&&
ENV&REFRESHED_AT&
ADD_FILE如果Java探针有更新,需要重新build下前边的基础镜像,在build机器上重新pull镜像后再构建应用镜像。打开jenkins该项目,标红处添加该行,用于记录要升级的镜像和build号注意命名规范:中间列是产品线。添加下列用于构建镜像的机器用jenkins buildbuild 成功。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=configmap2.3.2 配置deployment下面配置deploymentvim deployment.yamlapiVersion:&extensions/v1beta1
kind:&Deployment
&&name:&report-app-beta&&&&&#应用名称
&&replicas:&10&&&&&&&&&&&&&&&#启动副本个数
&&minReadySeconds:&60&&&&&#滚动升级时60s后认为该pod就绪
&&strategy:
&&&&rollingUpdate:
&&&&&&maxSurge:&50%&&&&&&#滚动升级时会先启动20%的pod
&&template:
&&&&metadata:
&&&&&&labels:
&&&&&&&&name:&report-app-beta
&&&&&&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:&/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:&f451bae910b4c3fd2113742
&&&&&&&&-&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_fileskubectl create -f deployment.yamlkuectl get pods&看pod已经起来了2.3.3 配置Service下面配置servicevim service.yamlapiVersion:&v1
kind:&Service
&&name:&report-app-beta
&&&&name:&report-app-beta
&#&sessionAffinity:&ClientIP&&&#在基于新的nginx-ingress-controller已经不需要配置该项,session绑定在nginx处配置
&&&&-&port:&8080
&&selector:
&&&&name:&report-app-betakubectl create -f service.yamlkubectl get service2.3.4 配置ingress下面配置ingressvim&ingress.yaml
apiVersion:&extensions/v1beta1
kind:&Ingress
&&name:&report-app-beta
&&-&host:&report-&&&&&#域名
&&&&&&paths:
&&&&&&-&path:&/mobile&&&&&&&&&&&&&&&#访问路径
&&&&&&&&backend:&
&&&&&&&&&&serviceName:&report-app-beta&&&&#service名称
&&&&&&&&&&servicePort:&8080&&&&&&&&&&&&&&#service端口kubectl create -f ingress.yamlkubect get ingress2.4 创建nginx-ingress-controllernginx-ingress-controller &需要监听宿主机的80端口,固定在某几台机器上,为此需要给相关node 定义标签。kubectl label nodes ucd-ty-k8s-node-001. role=nginx-lbkubectl get nodes --show-labels创建configmapvim nginx.tmpl该文件可以去github上下载kubectl create configmap nginx-template --from-file=nginx.tmpl=nginx.tmpl为了将为所有在nginx后的项目开启session保持,同时听云的开发工程师要打开后端监控页面,需要修改两个地方。这里暂时先改为无论如何都启用session保持这里直接启用traffic_statusvim rc.yaml该文件可以去github下载kubectl create rc.yaml查看nginx_status界面http://10.10.228.175:8080/nginx_status接下来即可访问该项目想阅读更多技术文章,请访问,访问感受更多应用性能优化魔力。
扫一扫分享到朋友圈
我们可以使用Docker简单而高效的部署Python应用,同时,也有一些最佳实践来帮助我们愉快的完成部署。当然,也不是说这些最佳实践就是完成部署的唯一方式,只不过我们团队发现它们具有高可用性,并且容易维护。
LinkedIn Staff Software Engineer 庄振运于基于云架构的性能优化专场发表了题为《容器里面乾坤大:采用容器部署应用的性能考虑》的演讲,现场解读了LinkedIn使用容器部署中的一些经验,重点介绍容器部署中几种影响性能的场景,比如内存压力场景,JVM在容器内运行的场景,不同容器互相干扰的场景等。
我们不支持匿名的评论和回复,请您后再来吧~
评论请先,或

我要回帖

更多关于 ios11.2什么时候推送 的文章

 

随机推荐