奇技指南java
随着容器技术的快速发展,诸如Kubernetes(如下简称k8s)此类容器编排技术应运而生,当人们逐渐意识到容器是云计算的将来,愈来愈多的人投入到容器技术的怀抱,也就是在这短短几年里,k8s赢得了这场战争,实际上,k8s的带来的影响已经远超容器管理领域自己。nginx
本文转载自花椒技术公众号docker
随着容器技术的快速发展,诸如Kubernetes(如下简称k8s)此类容器编排技术应运而生,当人们逐渐意识到容器是云计算的将来,愈来愈多的人投入到容器技术的怀抱,也就是在这短短几年里,k8s赢得了这场战争,实际上,k8s的带来的影响已经远超容器管理领域自己。 服务网格的概念已经走进你们视线,而这也刚好让人们意识到,k8s岂不正是实现微服务的一种解决方案,这也进一步将k8s推向风口浪尖。json
本文是创建在已经对docker技术有必定了解的基础上的,就再也不赘述docker相关的概念了,初步介绍一下k8s的核心概念和思想,目的是让你们快速熟悉,更好理解接下来的内容。bash
这是k8s里定义的最小单元,由于k8s是源于google,而该项目目标也不只仅是支持docker这一种容器技术,抽象出一个pod的概念,其实k8s自己不关心pod内部是什么类型容器,能够有多个容器在pod内启动(官方建议单一pod单一容器),pod内容器共享网络,共享存储,pod能够由控制器启动,控制器也就是k8s负责编排的组件之一,常见的有网络
pod被启动后,在k8s中是没法从外部访问的,这时候就须要service将其暴露出去,service至关于pod的负载均衡器,通常经过如下方式:并发
这里只是简单介绍核心概念,深刻学习的话请移步官方文档负载均衡
有几种竞争技术可用于管理大型Docker部署和基于容器的服务。你可能据说过其中一些退役的解决方案:Docker Swarm,Apache Mesos,OpenStack Magnum等。然而,如今Kubernetes已经淘汰了其中大多数竞争对手 会被与k8s拿来对比的,应该就Docker Swarm能够应战,swarm是docker原生的集群工具,部署简单,并且对于熟悉docker的人,学习成本低,而k8s最令开发者头疼的莫过于很是高的复杂度,和学习成本,不过目前不论是阿里云仍是其余云服务商,都同时提供了这两个解决方案,并且都有在生产环境大规模使用的案例,这里拿比较成熟的阿里云的这两种解决方案对比:elasticsearch
资源调度 这一点上二者都都作到能够按集群资源调度分配,只是调度的粒度不一样,swarm是容器,而k8s是pod;微服务
自动伸缩 swarm自己不支持,可是依靠阿里云实现了该功能,而k8s有水平自动拓展HPA,能够根据监控数据进行自动伸缩;
负载均衡 k8s自己提供了多种方案,内部service是经过iptables实现,外部7层负载均衡有ingress层,阿里云也提供了LoadBalancer支持负载均衡; swarm自己没有负载均衡层,不过阿里云也经过
滚动更新 swarm目前也支持了滚动更新,而且在阿里云上实现了蓝绿部署等,k8s自己的deployment支持滚动升级
容灾恢复 swarm没有作到,在节点挂掉的状况下,服务没法快速恢复; k8s是可以作到这一点,副本控制器可以维持副本数量,节点挂掉也会迅速从其余节点启动必定数量的副本,而且比较完善的监控也能够及时发现问题;
而从swarm自己来看的话,因为其是集成到docker中的,swarm集群只会有两层交互,容器启动是毫秒级,要远快于k8s, 可是兼容的docker API也使得其没法进行更精细的管理, 相对的k8s有副本控制器能够监控并维护容器的生命周期,有pod能够进行更加精细的管理, 总结来看,其实swarm自己的重心是放在了docker容器编排上,而k8s的倒是在考虑如何管理,事实上,如今仍是愈来愈多的人倾向于使用k8s,也正是看中了其诸多优势。
咱们在使用自建集群的过程当中,因为官方的dashboard操做yaml的学习成本很高,因此咱们使用了wayne这个开源的k8s管理项目,其功能包含但不限于dashbaord的功能,权限管理,人员划分,部门划分等,属因而一个面向大型项目团队的k8s集群管理后台,如下是一些实例
可是同时也存在一些弊端,在k8s的基础之上,抽象出了更多的概念,包括项目划分,权限管理等等,这些模块的目的是为了针对大型团队,控制项目人员,分配资源,不过同时,这些额外的概念对于使用者,尤为是对k8s也不熟悉,只是关心如何部署服务的开发人员,会混淆k8s自己的概念,致使学习成本进一步上升,针对小型团队,一些复杂的资源划分,项目划分功能反而显得冗余。
固然,正如前文说的,目前咱们仍是倾向因而用现有的云提供商所实现的k8s解决方案;在阿里云上的实践也证实了其带了的许多便利,确实会极大减小集群维护人员的负担,其相对完善的后台,也可以知足绝大多数状况的开发人员使用,其优点还主要体如今如下方面:
1.阿里云维护的高可用集群,免去了自维护的所面临的机房,网络诸多问题;
2.负载均衡的支持,不须要本身搭建配置ingress组件,建立服务会自动生成负载均衡
3.阿里云镜像仓库支持,能够直接从镜像建立pod,且有建立模版,能够轻松的建立服务;
4.云盘等文件系统支持,很是方便的声明和挂载存储卷;
5.优秀的监控报警系统,从多个维度,对服务进行详细的监控,灵活配置报警;
想要更加深刻的理解和使用k8s, 经过自建k8s集群是一种不错的手段,搭建方法参考官网便可; 这里有一些搭建过程当中的值得注意的一些细节:
1.建议使用阿里的源
cat <<EOF > /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64
enabled=1
gpgcheck=0
EOF
复制代码
2.若是遇到kubelet和docker的文件驱动不一致,能够修改docker的驱动
//;/etc/docker/daemon.json
{
"exec-opts": ["native.cgroupdriver=systemd"]
}
复制代码
3.kube-proxy默认使用iptables,考虑性能能够改成ipvs
modprobe -- ip_vs
modprobe -- ip_vs_rr
modprobe -- ip_vs_wrr
modprobe -- ip_vs_sh
modprobe -- nf_conntrack_ipv4
复制代码
kubectl edit configmap kube-proxy -n kube-system
,把 mode
改成 ipvs
,scheduler
默认为空,使用轮训方式负载均衡
自建集群进行了一些性能测试,如下有一些压测数据的分析,仅供参考 压测环境
k8s集群 并发60
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: 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
复制代码
k8s集群 并发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
复制代码
总的来讲,使用k8s集群的优点在于使用镜像,方便快速部署,以及集群的资源控制等方面,性能相对裸机会有一些损耗,不过这些损耗对于绝大多数服务是没有任何影响的