花椒服务端Kubernetes技术实践

640?wx_fmt=jpeg

文章来源:

随着容器技术的快速发展,诸如Kubernetes此类容器编排技术应运而生,当人们逐渐意识到容器是云计算的未来,越来越多的人投入到容器技术的怀抱,也就是在这短短几年里,Kubernetes赢得了这场战争,实际上,Kubernetes的带来的影响已经远超容器管理领域本身。

服务网格的概念已经走进大家视线,而这也恰好让人们意识到,Kubernetes岂不正是实现微服务的一种解决方案,这也进一步将Kubernetes推向风口浪尖。

Kubernetes的核心概念

640?wx_fmt=png

本文是建立在已经对Docker技术有一定了解的基础上的,就不再赘述Docker相关的概念了,初步介绍一下Kubernetes的核心概念和思想,目的是让大家快速熟悉,更好理解接下来的内容。

Pod

这是Kubernetes里定义的最小单元,因为Kubernetes是源于Google,而该项目目标也不仅仅是支持Docker这一种容器技术,抽象出一个Pod的概念,其实Kubernetes本身不关心Pod内部是什么类型容器,可以有多个容器在Pod内启动(官方建议单一Pod单一容器),Pod内容器共享网络,共享存储,Pod可以由控制器启动,控制器也就是Kubernetes负责编排的组件之一,常见的有:

  • Deployment,通过指定副本数量等属性,根据配置的Pod模版,部署无状态的服务,能够提供强力的回滚,滚动更新等能力,这个也是最常用的一种;

  • Statefulset,有状态副本集,一般部署etcd,Elasticsearch等等这种有状态的服务,一般同时会挂载存储卷(也是Kubernetes中定义的一种对象);

  • DeamonSet,守护进程集,一般指定节点部署一些服务,比如CPU监控等。


Service

Pod被启动后,在Kubernetes中是无法从外部访问的,这时候就需要Service将其暴露出去,Service相当于Pod的负载均衡器,一般通过以下方式:

  • CluserIP(默认), 通过iptables做NAT规则转换,将流量转到相应的Pod内,集群内部服务之间访问就是通过这种方式;

  • NodePort,暴露主机随机端口,kube-proxy组件将相应规则写入iptables表,访问主机端口将会被引流至相应的Pod,这种方式能够对集群外部暴露服务;

  • LoadBalancer,NodePort的变种,一般由具体的云服务商实现,比如阿里云,一旦Service创建后,会自动创建一个负载均衡,会自动做80:3xxxx端口的映射,流量通过负载均衡,会转到相应主机端口,最终根据iptables规则将流量转发到Pod内;

  • Ingress,作为7层http负载,作用相当于反向代理的Nginx的服务,流量通过一台负载均衡进来,可由Ingress配置域名或者路径,转发到相应Service。


这里只是简单介绍核心概念,深入学习的话请移步官方文档。

技术对比

640?wx_fmt=png

有几种竞争技术可用于管理大型Docker部署和基于容器的服务。你可能听说过其中一些退役的解决方案:Docker Swarm,Apache Mesos,OpenStack Magnum等。然而,现在Kubernetes已经淘汰了其中大多数竞争对手。

会被与Kubernetes拿来对比的,应该就Docker Swarm可以应战,Swarm是Docker原生的集群工具,部署简单,而且对于熟悉Docker的人,学习成本低,而Kubernetes最令开发者头疼的莫过于非常高的复杂度,和学习成本,不过目前不管是阿里云还是其他云服务商,都同时提供了这两个解决方案,而且都有在生产环境大规模使用的案例,这里拿比较成熟的阿里云的这两种解决方案对比:

  • 资源调度,这一点上两者都都做到可以按集群资源调度分配,只是调度的粒度不同,Swarm是容器,而Kubernetes是Pod;

  • 自动伸缩,Swarm本身不支持,但是依靠阿里云实现了该功能,而Kubernetes有水平自动拓展HPA,可以根据监控数据进行自动伸缩;

  • 负载均衡,Kubernetes本身提供了多种方案,内部Service是通过iptables实现,外部7层负载均衡有Ingress层,阿里云也提供了LoadBalancer支持负载均衡,Swarm本身没有负载均衡层,不过阿里云也通过;

  • 滚动更新,Swarm目前也支持了滚动更新,并且在阿里云上实现了蓝绿部署等,Kubernetes本身的deployment支持滚动升级;

  • 容灾恢复,Swarm没有做到,在节点挂掉的情况下,服务无法快速恢复,Kubernetes是能够做到这一点,副本控制器能够维持副本数量,节点挂掉也会迅速从其他节点启动一定数量的副本,并且比较完善的监控也可以及时发现问题。


而从Swarm本身来看的话,由于其是集成到Docker中的,Swarm集群只会有两层交互,容器启动是毫秒级,要远快于Kubernetes,但是兼容的Docker API也使得其无法进行更精细的管理,相对的Kubernetes有副本控制器可以监控并维护容器的生命周期,有Pod可以进行更加精细的管理。

总结来看,其实Swarm本身的重心是放在了Docker容器编排上,而Kubernetes的却是在考虑如何管理,事实上,现在还是越来越多的人倾向于使用Kubernetes,也正是看中了其诸多优点。

实践

640?wx_fmt=png

我们在使用自建集群的过程中,由于官方的Dashboard操作yaml的学习成本很高,所以我们使用了Wayne这个开源的Kubernetes管理项目,其功能包含但不限于Dashbaord的功能,权限管理,人员划分,部门划分等,属于是一个面向大型项目团队的Kubernetes集群管理后台,以下是一些实例:

640?wx_fmt=jpeg
640?wx_fmt=jpeg

在使用过程中,改后台,确实是带来了许多便利,可以免去Kubernetes的yaml配置的学习成本,通过可视化界面完成服务的创建,我们前期的一些试验性服务都是通过这个部署的。

但是同时也存在一些弊端,在Kubernetes的基础之上,抽象出了更多的概念,包括项目划分,权限管理等等,这些模块的目的是为了针对大型团队,控制项目人员,分配资源,不过同时,这些额外的概念对于使用者,尤其是对Kubernetes也不熟悉,只是关心如何部署服务的开发人员,会混淆Kubernetes本身的概念,导致学习成本进一步上升,针对小型团队,一些复杂的资源划分,项目划分功能反而显得冗余。

当然,正如前文说的,目前我们还是倾向于用现有的云提供商所实现的Kubernetes解决方案;在阿里云上的实践也证明了其带的许多便利,确实会极大减少集群维护人员的负担,其相对完善的后台,也能够满足绝大多数情况的开发人员使用,其优势还主要体现在以下方面:

  1. 阿里云维护的高可用集群,免去了自维护的所面临的机房,网络诸多问题;

  2. 负载均衡的支持,不需要自己搭建配置Ingress组件,创建服务会自动生成负载均衡;

  3. 阿里云镜像仓库支持,可以直接从镜像创建Pod,且有创建模版,可以轻松的创建服务;

  4. 云盘等文件系统支持,非常方便的声明和挂载存储卷;

  5. 优秀的监控报警系统,从多个维度,对服务进行详细的监控,灵活配置报警。


搭建注意事项

640?wx_fmt=png

想要更加深入的理解和使用Kubernetes,通过自建Kubernetes集群是一种不错的手段,搭建方法参考官网即可。

这里有一些搭建过程中的值得注意的一些细节:

建议使用阿里的源:

cat <<EOF > /etc/yum.repos.d/kubernetes.repo	
[kubernetes]	
name=Kubernetes	
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-l7-x86_64	
enabled=1	
gpgcheck=0	
EOF

如果遇到kubelet和Docker的文件驱动不一致,可以修改Docker的驱动:

//;/etc/docker/daemon.json	
{	
  "exec-opts": ["native.cgroupdriver=systemd"]	
}

kube-proxy默认使用iptables,考虑性能可以改为IPVS:

yum install -y ipvsadm

查看内核模块是否加载lsmod|grep ip_vs。

加载内核模块:

modprobe -- ip_vs	
modprobe -- ip_vs_rr	
modprobe -- ip_vs_wrr	
modprobe -- ip_vs_sh	
modprobe -- nf_conntrack_ipv4

修改 kube-proxy 配置。

kubectl edit configmap kube-proxy -n kube-system,把 mode 改为 IPVS,scheduler默认为空,使用轮训方式负载均衡。

压测数据分析

640?wx_fmt=png

自建集群进行了一些性能测试,以下有一些压测数据的分析,仅供参考。

压测环境:Kubernetes集群,并发60。

Task63 | ReqTPS: 4522 | RespTPS: 4522 | RT: 12 | TotalSend: 3144614 | TotalPass: 3144558 | TotalFail: 0 | Thread: 60 | 2019-08-01 18:14:55	
Task63 | ReqTPS: 4538 | RespTPS: 4536 | RT: 12 | TotalSend: 3140137 | TotalPass: 3140081 | TotalFail: 0 | Thread: 60 | 2019-08-01 18:14:54	
Task63 | ReqTPS: 4583 | RespTPS: 4584 | RT: 12 | TotalSend: 3135644 | TotalPass: 3135590 | TotalFail: 0 | Thread: 60 | 2019-08-01 18:14:53	
Task63 | ReqTPS: 4615 | RespTPS: 4616 | RT: 12 | TotalSend: 3131107 | TotalPass: 3131052 | TotalFail: 0 | Thread: 60 | 2019-08-01 18:14:52	
Task63 | ReqTPS: 4525 | RespTPS: 4527 | RT: 12 | TotalSend: 3126538 | TotalPass: 3126482 | TotalFail: 0 | Thread: 60 | 2019-08-01 18:14:51	
Task63 | ReqTPS: 4480 | RespTPS: 4480 | RT: 12 | TotalSend: 3122058 | TotalPass: 3122000 | TotalFail: 0 | Thread: 60 | 2019-08-01 18:14:50	
Task63 | ReqTPS: 4537 | RespTPS: 4531 | RT: 12 | TotalSend: 3117623 | TotalPass: 3117565 | TotalFail: 0 | Thread: 60 | 2019-08-01 18:14:49	
Task63 | ReqTPS: 4529 | RespTPS: 4530 | RT: 12 | TotalSend: 3113131 | TotalPass: 3113079 | TotalFail: 0 | Thread: 60 | 2019-08-01 18:14:48	
Task63 | ReqTPS: 4521 | RespTPS: 4522 | RT: 12 | TotalSend: 3108647 | TotalPass: 3108594 | TotalFail: 0 | Thread: 60 | 2019-08-01 18:14:47	
Task63 | ReqTPS: 4495 | RespTPS: 4496 | RT: 12 | TotalSend: 3104171 | TotalPass: 3104117 | TotalFail: 0 | Thread: 60 | 2019-08-01 18:14:46

相比之下,裸机Java:

Task63 | ReqTPS: 7391 | RespTPS: 7392 | RT: 7 | TotalSend: 3970815 | TotalPass: 3970763 | TotalFail: 0 | Thread: 60 | 2019-08-01 17:42:24	
Task63 | ReqTPS: 7363 | RespTPS: 7366 | RT: 7 | TotalSend: 3963498 | TotalPass: 3963445 | TotalFail: 0 | Thread: 60 | 2019-08-01 17:42:23	
Task63 | ReqTPS: 7231 | RespTPS: 7229 | RT: 7 | TotalSend: 3956209 | TotalPass: 3956153 | TotalFail: 0 | Thread: 60 | 2019-08-01 17:42:22	
Task63 | ReqTPS: 7394 | RespTPS: 7392 | RT: 7 | TotalSend: 3949050 | TotalPass: 3948996 | TotalFail: 0 | Thread: 60 | 2019-08-01 17:42:21	
Task63 | ReqTPS: 7227 | RespTPS: 7228 | RT: 7 | TotalSend: 3941730 | TotalPass: 3941678 | TotalFail: 0 | Thread: 60 | 2019-08-01 17:42:20	
Task63 | ReqTPS: 7078 | RespTPS: 7080 | RT: 8 | TotalSend: 3934575 | TotalPass: 3934522 | TotalFail: 0 | Thread: 60 | 2019-08-01 17:42:19	
Task63 | ReqTPS: 6932 | RespTPS: 6933 | RT: 8 | TotalSend: 3927568 | TotalPass: 3927513 | TotalFail: 0 | Thread: 60 | 2019-08-01 17:42:18	
Task63 | ReqTPS: 6887 | RespTPS: 6882 | RT: 8 | TotalSend: 3920698 | TotalPass: 3920642 | TotalFail: 0 | Thread: 60 | 2019-08-01 17:42:17	
Task63 | ReqTPS: 6837 | RespTPS: 6840 | RT: 8 | TotalSend: 3913880 | TotalPass: 3913829 | TotalFail: 0 | Thread: 60 | 2019-08-01 17:42:16	
Task63 | ReqTPS: 6866 | RespTPS: 6864 | RT: 8 | TotalSend: 3907111 | TotalPass: 3907057 | TotalFail: 0 | Thread: 60 | 2019-08-01 17:42:15

Kubernetes集群,并发40:

Task63 | ReqTPS: 4569 | RespTPS: 4571 | RT: 8 | TotalSend: 1716607 | TotalPass: 1716573 | TotalFail: 0 | Thread: 40 | 2019-08-01 18:58:59	
Task63 | ReqTPS: 4571 | RespTPS: 4568 | RT: 8 | TotalSend: 1712084 | TotalPass: 1712048 | TotalFail: 0 | Thread: 40 | 2019-08-01 18:58:58	
Task63 | ReqTPS: 4517 | RespTPS: 4520 | RT: 8 | TotalSend: 1707559 | TotalPass: 1707526 | TotalFail: 0 | Thread: 40 | 2019-08-01 18:58:57	
Task63 | ReqTPS: 4542 | RespTPS: 4541 | RT: 8 | TotalSend: 1703087 | TotalPass: 1703051 | TotalFail: 0 | Thread: 40 | 2019-08-01 18:58:56	
Task63 | ReqTPS: 4473 | RespTPS: 4473 | RT: 8 | TotalSend: 1698590 | TotalPass: 1698555 | TotalFail: 0 | Thread: 40 | 2019-08-01 18:58:55	
Task63 | ReqTPS: 4510 | RespTPS: 4514 | RT: 8 | TotalSend: 1694162 | TotalPass: 1694127 | TotalFail: 0 | Thread: 40 | 2019-08-01 18:58:54	
Task63 | ReqTPS: 4539 | RespTPS: 4536 | RT: 8 | TotalSend: 1689697 | TotalPass: 1689658 | TotalFail: 0 | Thread: 40 | 2019-08-01 18:58:53	
Task63 | ReqTPS: 4563 | RespTPS: 4561 | RT: 8 | TotalSend: 1685203 | TotalPass: 1685167 | TotalFail: 0 | Thread: 40 | 2019-08-01 18:58:52	
Task63 | ReqTPS: 4573 | RespTPS: 4575 | RT: 8 | TotalSend: 1680686 | TotalPass: 1680652 | TotalFail: 0 | Thread: 40 | 2019-08-01 18:58:51	
Task63 | ReqTPS: 4555 | RespTPS: 4555 | RT: 8 | TotalSend: 1676159 | TotalPass: 1676123 | TotalFail: 0 | Thread: 40 | 2019-08-01 18:58:50

总的来说,使用Kubernetes集群的优势在于使用镜像,方便快速部署,以及集群的资源控制等方面,性能相对裸机会有一些损耗,不过这些损耗对于绝大多数服务是没有任何影响的。

Kubernetes入门与实战培训

640?wx_fmt=png

Kubernetes入门与实战培训将于2019年11月22日在北京开课,3天时间带你系统掌握Kubernetes,学习效果不好可以继续学习。本次培训包括:Docker基础、容器技术、Docker镜像、数据共享与持久化、Docker实践、Kubernetes基础、Pod基础与进阶、常用对象操作、服务发现、Helm、Kubernetes核心组件原理分析、Kubernetes服务质量保证、调度详解与应用场景、网络、基于Kubernetes的CI/CD、基于Kubernetes的配置管理等等,点击下方图片或者阅读原文链接查看详情。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值