k8s–基础–01–介绍
1、kubernetes是什么?
- Kubernetes是一个可移植、可扩展的、开源的容器管理平台
- 简称k8s
- 可用于管理多个主机上的容器化应用程序。
- 提供了应用程序的快速部署,维护,扩缩容,升级和回滚的能力
- 通过service可以实现服务注册、服务发现和四层负载均衡
- 通过cordns可实现域名解析
- 通过ingress可以实现七层负载均衡。
2、k8s 优势
2.1、灵活部署
kubernetes支持在多种平台部署,可在私有云,公有云,混合云,openstack、openshift、VMware vSphere,VMware Workstation,虚拟机,物理机等环境部署。
2.2、安全高效,拥有完善的认证授权机制,自带审计功能
- 可以对多用户做细化的授权管理(如rbac授权),达到相互之间的操作完全隔离,互不影响
- 自身带有审计功能
- 可以对操作过程进行实时的日志记录,出现问题可以方便排查
2.3、负载均衡
- 支持四层负载均衡
- 支持七层负载均衡
2.4、可扩展性强
拥有强大的集群扩展能力,可以根据业务规模自动增加和缩减主机节点的数量,确保服务可以承受大量并发带来的压力,保证业务稳定运行。
2.5、根据节点资源的使用情况对pod进行合理的调度
可以按照用户需要调度pod,例如保证Pod只在资源足够的节点上运行,会尝试把同一功能的pod分散在不同的节点上,还会尝试平衡不同节点的资源使用率等。
2.6、拥有完善的灾备预警方案
拥有多种灾备解决方案,支持备份和容灾,出现故障可以达到秒级切换,保证线上业务不受影响;
3、k8s 功能
3.1、多租户网络隔离
- 支持多种网络插件,如flannel,calico,canel等,每个插件都有独特的性能,可以分别适用于多种场景
- 我们可以利用calico的network policy(网络策略)解决k8s中的网络隔离,对于多租户场景,可以每一个用户一个名称空间(namespace),然后对这个名称空间设置网络隔离
3.2、高可用,高可扩展性
支持多种高可用解决方案,如keepalive+nginx,keepalived+haproxy等,可以使访问流量分发到不同的主机节点,减轻节点压力,如果某个节点出现故障,可以实现妙级切换,达到高可用,保证业务不中断。
3.3、用户数据的持久化存储
支持多种持久化存储解决方案,保证数据可以得到很好的备份,降低用户数据丢失的风险,kubernetes中可使用的存储方案如下:
1. 本地存储:emptyDir,hostPath
2. 网络连接类存储:
1. SAN(存储局域网络):iSCSI
2. NAS(网络附加存储):nfs,cifs
3. 分布式存储:glusterfs,ceph-块级别的存储,cephfs-文件系统级别的存储
4. 云存储:Azure Disk等
3.4、拥有多种更新回滚策略
通过管理kubernetes的控制器和service等,可以实现灰度发布,蓝绿部署,金丝雀发布等,达到业务的快速部署和回滚等操作,用以满足不同客户的不同升级需求。
3.5、弹性伸缩
根据访问的流量压力,可以实现pod的水平扩容和缩减,达到秒级扩容,让pod始终处于满足业务正常运行时所需的数量即可,避免了资源的浪费。
3.6、节省资源,优化硬件资源的使用
根据流量进行业务组件的扩缩容,可节省机器资源。
4、k8s 应用场景
4.1、部署高效的日志管理系统(efk)
4.1.1、实现efk的快速部署和使用。
- 通过statefulset控制器部署elasticsearch组件,用来存储日志数据
- 通过动态volumeclaimtemplate动态生成pv实现es数据的持久化存储
- 通过deployment部署kibana组件,实现日志的可视化管理
- 通过daemonset控制器部署fluentd组件,来收集节点和k8s集群的日志。
4.1.2、部署efk可实现如下功能:
- 如果集群扩容,那么daemonset控制器会自动检测到新增加的node节点,就会在新的node节点上部署fluentd,完成日志收集,这就可以减少人为干预,提高工作效率,确保日志可以被正常收集。
- 如果es数据量大,kubernetes可以实现集群中pod应用的水平扩展,完成应用的弹性扩容和收缩等操作。
4.2、在DevOps场景下的应用
DevOps是一套完整的运维开发流程,可以实现快速的构建、测试和发布软件,整个流程包括敏捷开发->持续集成->持续交付->持续部署->DevOps。
通过 Kubernetes,我们可以实现容器在多个计算节点上的统一调度,可以将容器对接到持久存储、虚拟网络,还可以实现弹性伸缩等,提高了产品的迭代速度。
4.2.1、 在DevOps中可以实现如下功能:
- 多集群管理:可以根据用户需求对开发,测试,生产环境部署多套kubernetes集群,每个环境使用独立的物理资源,相互之间避免影响。
- 多环境一致性:Kubernetes是基于docker的容器编排工具,镜像保存在我们的私有镜像仓库,只要用户从我们提供的私有仓库拉取镜像,就能保证环境的一致性。
- 持续集成,持续部署,持续交付:可以让产品快速迭代,自动部署,根据用户的要求达到持续交付的能力。
4.3、 在微服务架构中的应用
4.3.1、服务发现
通过service可以实现服务发现
支持4层和7层负载均衡
支持安全可靠的https协议和证书认证签发
可实现负载均衡,自修复,自动关联
4.3.2、提供统一的配置管理中心
对于配置中心,K8S提供了configMap,可以在容器启动的时候,将配置注入到环境变量或者 Volume 里面。
4.3.3、弹性伸缩
通过控制器创建指定数量的pod副本,通过hpa可以实现pod应用的水平扩容和回收
4.3.4、集群监控
支持容器,集群和节点级别的监控,提供全面的监控指标,多途径的报警方式及可视化的监控报表
4.3.5、高质量的调度和故障恢复策略
支持节点级别的亲和性调度,支持异地数据备份和故障恢复。
4.3.6、通过jenkins实现持续集成/持续部署:
4.3.6.1、保证集群服务高可用
Jenkins Master和Jenkins Slave以Pod形式运行在Kubernetes集群的Node上,当Jenkins Master出现故障时,Kubernetes会自动创建一个新的Jenkins Master容器,并且将Volume分配给新创建的容器,保证数据不丢失,从而达到集群服务高可用。
4.3.6.2、动态伸缩
合理使用资源,每次运行Job时,会自动创建一个Jenkins Slave,Job完成后,Slave自动注销并删除容器,资源自动释放,而且Kubernetes会根据每个资源的使用情况,动态分配Slave到空闲的节点上创建,降低出现因某节点资源利用率高,还排队等待该节点的情况。
4.3.6.3、扩展性好
当Kubernetes集群的资源严重不足而导致Job排队等待时,可以很容易的添加一个Kubernetes Node到集群中,从而实现扩展。
5、k8s 特点
5.1、可移植
支持公有云,私有云,混合云,多重云(multi-cloud)
5.2、可扩展
可根据业务流量情况快速扩展kubernetes集群的节点数量。
5.3、自愈
自动发布
自动重启
自动复制
自动扩展
5.4、进程协同
利用复合应用保证应用和容器一对一的模型。
6、k8s 可实现的功能
- 存储系统挂载
- 分发密钥
- 应用健康检测
- livenessprobe
- readnessprobe
- 应用实例复制
- 水平自动扩展
- 命名和发现
- 负载均衡
- 滚动更新
- 资源监控
- 日志访问
- 自检和调试
- 识别和认证
7、应用程序的传统部署和容器部署的对比分析
7.1、传统部署时代
早期,应用程序在物理服务器上运行。无法为物理服务器中的应用程序定义资源边界,这会导致资源分配问题。例如,如果在物理服务器上运行多个应用程序,则可能会出现一个应用程序占用大部分资源的情况,结果可能导致其他应用程序的性能下降。一种解决方案是在不同的物理服务器上运行每个应用程序,但是由于资源利用不足而无法扩展,并且许多物理服务器的维护成本也很高。
7.2、虚拟化部署时代
允许你在单个物理服务器的CPU 上运行多个虚拟机(VM)。
虚拟化功能允许应用程序在 VM 之间隔离,并提供安全级别,因为一个应用程序的信息不能被另一应用程序*地访问。
因为虚拟化可以轻松地添加或更新应用程序、降低硬件成本等,所以虚拟化可以更好地利用物理服务器中的资源,并可以实现更好的可伸缩性。
每个VM 是一台完整的计算机,在虚拟化硬件之上运行所有组件,包括其自己的操作系统。
7.3、容器部署时代:
容器类似VM,但是它们具有轻量级的隔离属性,可以在应用程序之间共享操作系统(OS)。因此,容器被认为是轻量级的。
容器与VM 类似,具有自己的文件系统、CPU、内存、进程空间等。由于它们与基础架构分离,因此可以跨云和OS分发进行移植。容器因具有许多优势而变得流行起来。
7.3.1、容器优点
-
敏捷应用程序的创建和部署:与使用VM镜像相比,提高了容器镜像创建的简便性和效率。
-
持续开发,集成和部署:通过快速简单的回滚(由于镜像不可变性),提供可靠且频繁的容器镜像构建和部署。
-
关注开发与运维的分离:在构建/发布时创建应用程序容器镜像,不在部署时创建应用程序容器镜像,从而将应用程序与基础架构分离。
-
可观察性:
- 可以显示操作系统级别的信息和指标
- 可以显示应用程序的运行状况和其他指标信号。
-
跨开发,测试和生产的环境一致性:在便携式计算机上与在云中相同地运行
-
云和操作系统分发的可移植性:可在 Ubuntu. RHEL. CoreOS. 本地. Google Kubernetes Engine 和其他任何地方运行。
-
以应用程序为中心的管理: 提高抽象级别,从在虚拟硬件上运行 OS 到在 OS 上运行应用程序。
-
松散耦合,分布式,弹性,解放的微服务:应用程序被分解成较小的独立部分,并且可以动态部署和管理,而不是在一台大型单机上整体运行。
-
资源隔离:可预测的应用程序性能
-
资源利用:高效率和高密度