运用Kubernetes进行分布式负载测试

  categories:资料  author:

前言

Github地址https://github.com/rootsongjc/distributed-load-testing-using-kubernetes该教程描述如何在Kubernetes中进行分布式负载均衡测试,包括一个web应用、docker镜像和Kubernetes controllers/services。更多资料请查看Distributed Load Testing Using Kubernetes 。

注意:该测试是在我自己本地搭建的kubernetes集群上测试的,不需要使用Google Cloud Platform。

准备

不需要GCE及其他组件,你只需要有一个kubernetes集群即可。

如果你还没有kubernetes集群,可以参考kubernetes-handbook部署一个。

部署Web应用

sample-webapp 目录下包含一个简单的web测试应用。我们将其构建为docker镜像,在kubernetes中运行。你可以自己构建,也可以直接用这个我构建好的镜像index.tenxcloud.com/jimmy/k8s-sample-webapp:latest

在kubernetes上部署sample-webapp。

$ cd kubernetes-config
$ kubectl create -f sample-webapp-controller.yaml
$ kubectl create 
阅读全文

在阿里云上部署生产级别Kubernetes集群

  categories:资料  author:

阿里云是国内非常受欢迎的基础云平台,随着Kubernetes的普及,越来越多的企业开始筹划在阿里云上部署自己的Kubernetes集群。 本文将结合实战中总结的经验,分析和归纳一套在阿里云上部署生产级别Kubernetes集群的方法。 文中所采取的技术方案具有一定的主观性,供各位读者参考。在实践中可以根据具体使用场景进行优化。

目标

当我们刚接触Kubernetes进行测试集群的搭建时,往往会选择一篇已有的教程,照着教程完成集群搭建。我们很少去质疑教程作者每一步操作的合理性, 只想快点把集群搭建起来,早点开始实际的上手体验。

与测试集群不同,对于生产级别的部署,我们会有更加严格的要求,更加强调合理的规划以及每个步骤的合理性以及可管理性。以下是我们设定的目标:

  • 没有单点故障。任何一台服务器离线不会影响到整个集群的正常运转
  • 充分利用阿里云原生提供的SLB,云盘等工具,支持Volume挂载,LoadBalancer类型的Service等Kubernetes基础功能。 获得完整的Kubernetes使用体验。
  • 在不牺牲安全性和稳定性的前提下,尽可能降低日常运维所需要的投入,将可以由程序完成的重复性工作自动化
  • 支持随着业务规模扩展的动态集群规模扩展

因为篇幅的原因,以下内容将不作为本文的目标,留待日后再做分享:

  • 集群运行成本控制
  • 监控、日志等运维系统的搭建
  • 安全防护以及权限设计

现状

目前Kubernetes主要支持的云平台还是海外的几大主流平台,但是对比阿里云提供的基础设施,我们已经具有了基本相同的底层环境。 阿里云提供的VPC,云盘,SLB,NAS等组件,都为搭建生成级别Kubernetes集群提供了很好的支持。充分利用这些组件, 我们应该可以搭建出完整可用的Kubernetes集群。但是仔细研究Kubernetes的代码我们会发现,阿里云的CloudProvider暂时没有被合并到上游当中, 所以我们需要设计方案来解决Kubernetes暂时还没有原生阿里云支持的问题。

Kubernetes生态圈发展迅速,目前已经有了像kops这种集群自动创建工具帮助运维工程师创建集群。但是目前已有的集群创建工具均只支持国外的云平台, 使得国内云平台的用户只能采取手动搭建的办法。像kubeadm这种半自动工具还可以使用,也算是减轻了不少负担。从目前状况来看, 运维的负担依然很严重,为我们实现生产级别部署所追求的自动化、规模化的目标带来了不小的障碍。

由于网络原因造成的镜像拉取困难也给我们创建Kubernetes集群制造了不小的麻烦,好在阿里云一直在致力于解决这个问题,为用户提供了镜像拉取加速服务以及重要镜像的Mirror。

另一个问题是操作系统镜像的问题,在后面分析操作系统的时候再详细展开。

架构

基于消除单点故障以及降低复杂度的考虑,我们设计了由5台服务器,分两个服务器组构成的Kubernetes集群的控制节点,并视业务需求情况由N台服务器, 分多个服务器组,构成集群的运行节点。如下图所示:

在设计这一架构时,我们考虑了以下几点:

  • 整个集群的主要构成元素为服务器组。一组服务器具有相同的硬件配置,服务相同的功能,在软件配置上也基本相同。这样为服务器的自动化管理打下了很好的基础。
  • 由3台服务器组成的etcd集群,在其中任何一台服务器离线时,均可以正常工作。为整个Kubernetes集群的数据持久化保存提供了稳定可靠的基础
  • 2台同时运行着Kubernetes核心组件kube-apiserver,kube-controller-manager,kube-scheduler的服务器,为整个集群的控制平面提供了高可用性。
  • 多个运行节点服务器组,有着不同的CPU,内存,磁盘配置。让我们可以灵活的根据业务对运行环境的要求来选择不同的服务器组。

集群搭建

在有了架构蓝图后,接下来让我们来实际搭建这个集群。

操作系统选型

搭建集群首先会面临的问题是,选什么配置的服务器,用什么操作系统。服务器硬件配置相对好解决,控制节点在业务量不大的时候选择入门级别的配置再随着业务增长不断提升即可, 运行节点应当根据业务需要来选择,可能要做一些尝试才能定下来最适合的硬件配置。比较困难的选择是操作系统的选型。

只要是使用较新的Kernel的Linux主机,均可以用来运行Kubernetes集群,但是发行版的选择却需要从多个方面来考虑。在这里我们选择了CoreOS作为最基础的操作系统。

阅读全文

Kubernetes网络原理及方案

  categories:资料  author:

大家好,说到容器、Docker,大家一定会想到Kubernetes,确实如此,在2016年ClusterHQ容器技术应用调查报告显示,Kubernetes的使用率已经达到了40%,成为最受欢迎的容器编排工具;那么Kubernetes到底是什么呢?它是一个用于容器集群的自动化部署、扩容以及运维的开源平台;那么通过Kubernetes能干什么呢?它能快速而有预期地部署你的应用,极速地扩展你的应用,无缝对接新的应用功能,节省资源,优化硬件资源的使用。

随着Kubernetes王者时代的到来,计算、网络、存储、安全是Kubernetes绕不开的话题,本次主要分享Kubernetes网络原理及方案,后续还会有Kubernetes其它方面的分享,另外有容云5.22发布了基于Kubernetes的容器云平台产品UFleet,想要获取新品试用,欢迎联系有容云。

一、Kubernetes网络模型

在Kubernetes网络中存在两种IP(Pod IP和Service Cluster IP),Pod IP 地址是实际存在于某个网卡(可以是虚拟设备)上的,Service Cluster IP它是一个虚拟IP,是由kube-proxy使用Iptables规则重新定向到其本地端口,再均衡到后端Pod的。下面讲讲Kubernetes Pod网络设计模型:

1、基本原则:

每个Pod都拥有一个独立的IP地址(IPper Pod),而且假定所有的pod都在一个可以直接连通的、扁平的网络空间中。

2、设计原因:

用户不需要额外考虑如何建立Pod之间的连接,也不需要考虑将容器端口映射到主机端口等问题。

3、网络要求:

所有的容器都可以在不用NAT的方式下同别的容器通讯;所有节点都可在不用NAT的方式下同所有容器通讯;容器的地址和别人看到的地址是同一个地址。

二、Docker网络基础

  • Linux网络名词解释:

1、网络的命名空间:Linux在网络栈中引入网络命名空间,将独立的网络协议栈隔离到不同的命令空间中,彼此间无法通信;docker利用这一特性,实现不容器间的网络隔离。

2、Veth设备对:Veth设备对的引入是为了实现在不同网络命名空间的通信。

3、Iptables/Netfilter:Netfilter负责在内核中执行各种挂接的规则(过滤、修改、丢弃等),运行在内核 模式中;Iptables模式是在用户模式下运行的进程,负责协助维护内核中Netfilter的各种规则表;通过二者的配合来实现整个Linux网络协议栈中灵活的数据包处理机制。

4、网桥:网桥是一个二层网络设备,通过网桥可以将linux支持的不同的端口连接起来,并实现类似交换机那样的多对多的通信。

5、路由:Linux系统包含一个完整的路由功能,当IP层在处理数据发送或转发的时候,会使用路由表来决定发往哪里。

  • Docker生态技术栈

下图展示了Docker网络在整个Docker生态技术栈中的位置:

20170526205252

  • Docker网络实现

1、单机网络模式:Bridge 、Host、Container、None,这里具体就不赘述了。

2、多机网络模阅读全文

基于Kubeadm的Flannel分析

  categories:资料  author:

Flannel概述

Flannel是将多个不同子网(基于主机Node)通过被Flannel维护的Overlay网络拼接成为一张大网来实现互联的,通过官方的一张网络拓扑图我们可以对其基本原理一目了然:

值得探讨的是,flannel的这个overlay网络支持多种后端实现,除上图中的UDP,还有VXLAN和host-gw等。此外,flannel支持通过两种模式来维护隧道端点上FDB的信息,其中一种是通过连接Etcd来实现,另外一种是直接对接K8S,通过K8S添加删除Node来触发更新。

Flannel部署常见问题

1. Node状态显示为“NotReady”

我的K8S环境使用kubeadm来容器化运行K8S的各个组件(除kubelet直接运行在裸机上外),当我使用kubeadm join命令加入新的Minion Node到K8S集群中后,通过kubectl get node会发现所有的node都还是not ready状态,这是因为还没有配置好flannel网络。

2. 使用kube-flannel.yml无法创建DaemonSet

我使用的是K8S的1.6.4的版本,然后按照官方的说明,使用kube-flannel.yml来创建flannel deamon set,结果始终报错。正确的姿势是先使用kube-flannel-rbac.yml来创建flannel的ClusterRole并授权。该yml的主要作用是创建名叫flannel的ClusterRole,然后将该ClusterRole与ServiceAccount(flannel)绑定。接下来,当我们使用kube-flannel.yml来创建flannel daemon set的时候,该daemon set明确指定其Pod的ServiceAccount为flannel,于是通过它启动起来的Pod就具有了flannel ClusterRole中指定的权限。

3.flannel Pod状态为Running,网络不通

我之前在我的Mac Pro上跑了三个VM,为了能够访问公网拉取镜像,我为每个VM分配了一张网卡使用NAT模式,其分配到的IP地址可能重启后发生变化。另外,为了我本机方便管理,我为每台VM又分配了一张网卡使用Host-Only网络模式,每个网卡都有一个固定的IP地址方便SSH。然后,奇怪的事情就这样发生了….

原因在与在kube-flannel.yml中,kube-flannel容器的command被指定为:

command: [ "/opt/bin/flanneld", "--ip-masq", "--kube-subnet-mgr"]

可见,其并没有指定使用哪一张网卡作为flanneld对外通信的物理网卡,于是,可能由于机器上面路由配置的差异,导致三台机器并没有一致通过Host-Only网络模式的网卡来打通Overlay网络。遇到这种情况,如果几台机器的配置一致,可以手动修改kube-flannel.yml文件中kube-flannel的command的值,添加参数–iface=ethX,这里的ethX就为我们希望flanneld通信使用的网卡名称。

4.flannel启动异常,显示install-cni错误

这个现象比较坑,遇到这种情况的第一反应就是去查看install-cni容器到底做了什么。我们打开kube-flannel.yml可以看到,该容器的command字段只有简单的一行Shell:

command:
阅读全文

Kubernetes-部署高可用的MySQL

  categories:资料  author:

1、MySQL简介

MySQL 是一个开源的关系型数据库管理系统,使用标准的sql语言,由瑞典 MySQL AB 公司开发,当前属于 Oracle 公司。能够 支持大型的数据库,可以处理上千万条的数据记录。可以运行于在Windows、Linux等多种系统上;支持C、C++、Python、Java、Perl、PHP、Eiffel、Ruby和Tcl等编程语言。对于32位系统,MySQL的表文件最大可支持4GB,对于64位系统,MySQL支持最大的表文件为8TB。

2、MySQL的高可用方案

本文的MySQL高可用方案为主从复制+读写分离,即由单一的master和多个slave所构成。其中,客户端通过master对数据库进行写操作,通过slave端进行读操作。master出现问题后,可以将应用切换到slave端。 此方案是MySQL官方提供的一种高可用解决方案,节点间的数据同步采用MySQL Replication技术。

MySQL Replication从一个MySQL数据库服务器(master)的数据复制到一个或多个MySQL数据库服务器(slave)。在默认情况下,复制是异步的;slave不需要一直接收来自主机的更新。根据配置,可以复制数据库中的所有数据库、选定的数据库,或者特定的表。

MySQL中复制的优点包括:

  • 扩容解决方案:在多个slave之间扩展负载以提高性能。在这种模式下,所有的写入和更新操作都必须在主服务器上进行。然而,读取操作通过slave镜像。该模型可以提高写入操作的性能,同时,也能够通过增加slave的节点数量,从而显著地提升读取速度。
  • 数据安全:数据从master被复制到slave,并且slave可以暂停复制过程。因此,可以在不损坏master的情况下,在slave上运行备份服务。
  • 分析:现场数据可以在master上创建,而对信息的分析可以在slave进行,而不影响master的性能。
  • 远程数据分发:可以使用复制为远程站点创建本地数据的副本,而不必一直通过访问master。

此高可用的解决方案适用于对数据实时性要求不是特别严格的场景,在使用时可以通过廉价的硬件来扩展slave的节点数量,将读压力分散到多台slave的机器上面。此方案能够在很大的程度上解决数据库读取数据的压力瓶颈问题,这是因为在大多的应用系统中,读压力要比写压力大很多多。

3、安装部署

3.1 环境要求

  • 已有Kubernetes 1.6+环境;
  • 在Kubernetes中提供多个(具体数量根据有状态副本集的个数而定)容量大于10g的持久化存储卷。

3.2 部署MySql

此示例由一个ConfigMap、两个Service和一个StatefulSet所组成。

3.2.1 创建ConfigMap

通过YAML文件创建名为mysql的ConfigMap:

$ kubectl create -
阅读全文

构建与定制:唯品会PaaS基于Kubernetes的实践

  categories:资料  author:

数人云上海&深圳两地“容器之Mesos/K8S/Swarm三国演义”的嘉宾精彩实录第三更来啦。唯品会是数人云Meetup的老朋友,去年曾做过RPC服务框架和Mesos容器化的分享。本次分享中,嘉宾王成昌分享了唯品会在Kubernetes上两年的PaaS实践,干货满满诚意奉上~

王成昌,唯品会PaaS平台高级开发工程师
主要工作内容包括:平台DevOps方案流程优化,持续部署,平台日志收集,Docker以及Kubernetes研究。

大家好,我是唯品会PaaS团队的王成昌,与大家分享一下PaaS在Kubernetes的实践。基于2014年底或2015年初PaaS没有推广的现状,唯品会PaaS部门目前已经做了两年的时间。

PaaS 主要工作将分为三个部分进行介绍,首先,PaaS定义的标准构建流程,持续集成和持续部署的架构以及已有组建上的功能定制;第二部分,基于Kubernetes实现的网络方案,以及根据网络方案做的扩展定制;第三部分,PaaS如何做日志收集和监控方案,最后列一下唯品会目前为止所遇到的问题和总结。

唯品会现状

 

20170118090757

 

唯品会目前线上有一千多个域,每个域之间相互的依赖比较复杂,每次的部署发布困难。线下有多套的测试环境,每套测试环境都要去维护单独的应用升级和管理。公司层面也没有统一的持续集成和部署的流程,大家各自去维护一个Jenkins或者一个Jenkins slave,看工程师的个人追求是否能够写一个完整的从源代码、到打包、最后到部署的脚本。

唯品会线上全部用物理机在跑,之前Openstack方式没有在线上,只是在测试环境跑,物理机的使用效率还是比较低的。即使在7周年大促的高峰时段,60~80%的物理机利用率也均低于10%。

唯品会PaaS构建流程

 

20170118090806

 

基于前面提到的现状,唯品会的PaaS定义了一个构建流程,整个流程不是一蹴而就,这是目前为止的定义,首先从源代码的角度出发,即Git,所有的7个Phase全部包括在Jenkins Pipeline里,由于是基于Kubernetes,所以Jenkins Pipeline的执行是通过Jenkins k8s Plugin去调度后台的k8s Cluster,由k8s产生的Pod去运行Pipeline。整个Pipeline的几个阶段,除了传统的编译单元测试和打包之外,加入了烘焙镜像、部署以及集成公司的集成测试(即VTP),打包和镜像完成后会正常上传到公司统一的包管理系统Cider和平台维护的Docker registry。

部署完成后会触发集成测试,如果通过测试的话,会把这个包或者是镜像标记为可用的状态,一般先从测试环境标记,然后通过到staging环境。目前PaaS 平台主要是维护测试环境和staging环境,线上还没有,但是已经定义了一个审批的流程,如果标记了这个包为可用的状态,需要一个审批来决定它是否可以上线。部署后通过k8s client,由另外一套k8s的集群来管理部署里面所有的节点。

 

20170118090814

 

这是唯品会的PaaS架构,主要包含持续集成和持续部署。首先由一个统一UI的入口Dashboard,使用Nginx和Tomcat作为服务的网关。其背后有两套系统——CPMS和API server,CPMS主要管理持续集成的各个流程,API server主要管理应用部署,在CPMS背后是使用多个Jenkins server统一连到一个Kubernetes集群上产生Pod作为Jenkins slave去运行,不同的构建有多种语言也有不同的模板,这里会提供各种方案让不同的Jenkins Pipeline运行在不同的Kubernetes node里面。

在部署实现一个Cloud Framework,可以接入各种cloud provider,目前使用的是k8s provider,背后的服务发现也是k8s推荐使用的Skydns。为了兼容公司基于包发布的这样一套模式,镜像管理这部分会把包管理系统Cider接入进入,平台的Docker Registry,以及应公司安全方面的要求,通过Clair对镜像的内容进行检查。

在日志收集方面,使用fluentd+ELK的组合,采用Prometheus做监控。在PaaS架构里,安全是通过接入公司的CAS做认证的动作,有一个Oauth组件做鉴权机制,通过Gnats做消息传输的系统。配额的问题在构建和部署中都会有所体现,包括用户对于Pipeline的个数控制或者Pipeline触发的个数,以及对应用上的物理配额或者逻辑资源配额等。

阅读全文

Servlet 3.0 新特性详解

  categories:资料  author:

Servlet 3.0 新特性概述

Servlet 3.0 作为 Java EE 6 规范体系中一员,随着 Java EE 6 规范一起发布。该版本在前一版本(Servlet 2.5)的基础上提供了若干新特性用于简化 Web 应用的开发和部署。其中有几项特性的引入让开发者感到非常兴奋,同时也获得了 Java 社区的一片赞誉之声:

  1. 异步处理支持:有了该特性,Servlet 线程不再需要一直阻塞,直到业务处理完毕才能再输出响应,最后才结束该 Servlet 线程。在接收到请求之后,Servlet 线程可以将耗时的操作委派给另一个线程来完成,自己在不生成响应的情况下返回至容器。针对业务处理较耗时的情况,这将大大减少服务器资源的占用,并且提高并发处理速度。
  2. 新增的注解支持:该版本新增了若干注解,用于简化 Servlet、过滤器(Filter)和监听器(Listener)的声明,这使得 web.xml 部署描述文件从该版本开始不再是必选的了。
  3. 可插性支持:熟悉 Struts2 的开发者一定会对其通过插件的方式与包括 Spring 在内的各种常用框架的整合特性记忆犹新。将相应的插件封装成 JAR 包并放在类路径下,Struts2 运行时便能自动加载这些插件。现在 Servlet 3.0 提供了类似的特性,开发者可以通过插件的方式很方便的扩充已有 Web
阅读全文

关于web.xml配置的那些事儿

  categories:资料  author:

1.简介

web.xml文件是Java web项目中的一个配置文件,主要用于配置欢迎页、Filter、Listener、Servlet等,但并不是必须的,一个java web项目没有web.xml文件照样能跑起来。Tomcat容器/conf目录下也有作用于全局web应用web.xml文件,当一个web项目要启动时,Tomcat会首先加载项目中的web.xml文件,然后通过其中的配置来启动项目,只有配置的各项没有错误时,项目才能正常启动。

那么web.xml文件中到底有些什么内容呢?我们要如何去配置它以适应我们的项目呢?
首先让我们从Tomcat加载资源的顺序开始,一步步分析web.xml文件的作用。

2.Tomcat加载资源顺序

Tomcat启动时加载资源主要有三个阶段:

  • 第一阶段:JVM相关资源
    (1)$JAVA_HOME/jre/lib/ext/*.jar
    (2)系统classpath环境变量中的*.jar和*.class 
  • 第二阶段:Tomcat自身相关资源
    (1)$CATALINA_HOME/common/classes/*.class  
    (2)$CATALINA_HOME/commons/endorsed/*.jar   
    (3)$CATALINA_HOME/commons/i18n/*.jar   
    (4)$CATALINA_HOME/common/lib/*.jar
阅读全文

ajax使用error调试错误的方法

  categories:资料  author:

代码:$(document).ready(function() {

            jQuery(“#clearCac”).click(function() {
jQuery.ajax({
url: “/Handle/Do.aspx”,
type: “post”,
data: { id: ‘0’ },
dataType: “json”,
success: function(msg) {
alert(msg);
},
error: function(XMLHttpRequest, textStatus, errorThrown) {
alert(XMLHttpRequest.status);
alert(XMLHttpRequest.readyState);
alert(textStatus);
},
complete: function(XMLHttpRequest, textStatus) {
this; // 调用本次AJAX请求时传递的options参数
}
});
});

阅读全文

从锦囊妙计想到的17–同步和异步

  categories:儿童计算机  author:

很久都没时间写这个系列的东西了, 今天感觉还得继续下去,因此在继续继续一下, 今天要谈的是什么是同步, 什么是异步, 为了说明这个问题,先讲个故事,来说明一下 同步和异步的重要性!

 

一。 听对了,说对了, 不等于都对了!

先说一下, 甲对乙说了一句话, 甲说对了, 乙也听对了, 然后乙就去按照甲的意思去办理了, 那么乙一定能办对吗?当然假设乙在办理事情的过程中没有任何失误等等。

其实结果是大家 未必像大家想象的!

不啰嗦了,说故事。

本人现在在北京居住了很多年, 一天吃饭时, 家里发出了一个奇怪的声音, 于是我就去找一下, 别是什么电器什么坏了前兆, 若是发现了, 好及时修理。

找了几个地方, 都没找到, 于是我就说, 哪里来的声音?  一旁的老婆说了, 是南京大陆分吹过大陆架发出的声音。

我听后就特别奇怪, 我在北京怎么能听到 远在地球最南边的南极的声音?  我真要成为 顺风耳不成? 奇怪呀奇怪!

我不解的说着, 怎么可能是南极的声音, … 阅读全文



快乐成长 每天进步一点点      京ICP备18032580号-1