概述
官网:kubernetes 的 github 地址:https://github.com/kubernetes/kubernetes kubernetes 官方站点:https://kubernetes.io/
k8s 刚出来:容器编排工具
互动 1:从 kubernetes 和 docker 的官方 logo 能看出来它们的一些联系吗? Kubernetes 的官方 logo 是一个舵,docker 的官方 logo 是一个集装箱,那集装箱装在船上,需要去哪,往哪走,是靠船的舵来掌控方向的,舵相当于一个方向盘,所以可以看出 kubernetes 是管理容器的。
Kubernetes 是什么
-
Kubernetes 是一个可移植、可扩展的、开源的容器管理平台,简称 k8s
-
互动 1:什么是可移植?
可移植:在 kubernetes 中部署的应用都是基于镜像的,镜像是可移植的,可以被多个环境使用,可以从一个环境迁移到另一个环境。不受操作系统限制。
-
互动 2:什么是可扩展? 可扩展:安装 k8s 的物理节点可以根据业务规模动态扩缩容、k8s 中的 pod 应用也可以实现自动扩缩容、资源可以扩展,CRD 自定义资源
-
互动 3:什么是开源的? 开源的:源代码已经公开了,有很多技术人员在开发维护,可以被用户免费使用
-
Kubernetes 提供了应用程序的快速部署、升级和回滚的能力,利用 service 可以实现服务注册、发现;通过 kube-proxy 可以实现负载均衡,通过 Coredns 可实现域名解析,通过 Ingress-nginx-controller 可以实现七层负载均衡等功能。
-
可以对 pod 自动化部署、自动化扩缩容、跨主机管理等;
-
互动 1:为什么要自动化扩缩容? K8s 部署服务,都是封装到 pod 里的,这个 pod 自动扩缩容很有必要
-
可以对代码进行灰度发布、金丝雀发布、蓝绿发布、滚动更新等
- 具有完整的监控系统和日志收集平台,具有故障自恢复的能力。
Kubernetes 起源
Kubernetes单词起源于希腊语,是“舵手”或者“领航员、飞行员”的意思。来源于Google的Borg项目:
Kubernetes 起源
跟 k8s 相关的岗位::F云原生、docker、容器、k8s、kubernetes、devops、云原生架构师
Kubernetes 架构
单节点和高可用架构:k8s 的物理架构是 master/nbde 模式 k8s集群至少需要一个主节点(Master)和多个工作节点(Worker),主节点是集群的控制节点,负责整个集群的管理和控制,主节点主要用于暴露API,调度部署和节点的管理。工作节点主要是运行pod的。
一台机器:也可以搭建k8s,既做主节点,也做工作节点
Master节点、主节点、控制节点、控制平面, 包含服务一般为 apiserver、 scheduler、 controller-manager
Node 节点、工作平面、工作节点、worker节点,包含服务一般为 kube-proxy、 calico、容器运行时、kubelet
控制节点:三个或者五个 工作节点:运行业务pod,工作节点分配几台, 生产环境至少两个
-
单master节点架构
-
多master节点架构
Kubernetes 组件
kubectl:管理k8s的命令行工具,可以操作k8s中的资源对象
Master节点组件:
-
apiserver:提供k8s-api,是整个系统的对外接口,提供资源操作的唯一入口,供客户端和其它组件调用,提供了k8s各类资源对象(pod,deployment,Service等)的增删改查,是整个系统的数据总线和数据中心,并提供认证、授权、访问控制、API注册和发现等机制,并将操作对象持久化到etcd中。相当于“营业厅”。
-
scheduler:负责k8s集群中pod的调度的,scheduler 通过与apiserver交互监听到创建Pod副本的信息后,它会检索所有符合该Pod要求的工作节点列表,开始执行Pod调度逻辑。调度成功后将Pod绑定到目标节点上,相当于“调度室”。
-
controller-manager(控制器管理器):负责监视Kubernetes集群中的各种资源对象,并根据当前状态和期望状态之间的差异进行调节。Controller-manager组件中包含了多个控制器,每个控制器都会监视不同类型的资源对象,并对它们进行管理和调节。以下是一些controller-manager组件的控制器: 1)ReplicationController:用于保证Pod数量的稳定性,确保Pod数目始终等于指定的副本数。 2)NodeController:监视Kubernetes节点的状态,并对它们进行管理和调节。 3)ServiceController:确保Kubernetes服务的稳定性,负责监视服务端口的状态并根据需要创建、删除、更新相关的 Endpoint。 4)EndpointsController:确保Kubernetes服务的 Endpoint 的稳定性,负责监视Pod 的状态并根据需要创建、删除、更新相关的 Endpoint。 5)NamespaceController:确保Kubernetes命名空间的稳定性,负责监视和管理命名空间资源的创建、删除、更新等操作。 6)ServiceAccountController:确保Kubernetes服务账户的稳定性,负责监视和管理服务账户的创建、删除、更新等操作。
工作节点组件
- Calico:Calico是一个纯三层的网络插件,calico的bgp 模式类似于 flannel的host-gw,calico在kubernetes中可提供网络功能和网络策略
- kube-proxy:提供网络代理和负载均衡,是实现service的通信与负载均衡机制的重要组件,kube-proxy 负责为 Pod 创建代理服务,从 apiserver 获取所有 service 信息,并根据 service 信息创建代理服务,实现service到Pod的请求路由和转发,从而实现K8s层级的虚拟转发网络,将到service的请求转发到后端的pod上。
- kubelet:每个Node节点上的kubelet定期就会调用APl Server的REST接口报告自身状态APl Server接收这些信息后,将节点状态信息更新到etcd中。kubelet也通过APl·Server监听Pod信息,从而对Node机器上的POD进行管理:如创建、删除、更新Pod
其他组件
安装k8s有Kubeadm、二进制两种官方提供的方式
- etcd:是一个高可用的键值数据库,存储k8s的资源状态信息和网络信息的,etcd中的数据变更是通过 api server 进行的。
- Etcd:基数选主,至少三个做高可用 Kubeadm安装k8s,etcd默认是在控制节点的 二进制安装k8s,etcd可以自已找机器部署,弄到工作节点或者控制节点都行,再或者单独找三个机器安装也可以
- Coredns:k8s1.11 之前使用的是kube dns,1.11 之后才有 coredns,coredns 是一个 DNS服务器,能够为Kubernetes·services提供DNS记录可以对Service名字做解析,解析成service 的ip, 可以安装在控制节点或工作节点上
Kubernetes 容器编排工具的优势
1)灵活部署 kubernetes支持在多种平台部署,可在私有云,公有云,混合云,openstack、VMwarevSphere,VMware·Workstation,虚拟机,物理机等环境部署。 2)安全高效,拥有完善的认证授权机制,自带审计功能<可以对多用户做细化的授权管理(如rbac授权),达到相互之间的操作完全隔离,互不影响,而且自身带有审计功能,可以对操作过程进行实时的日志记录,出现问题可以方便排查。ae 3)负载均衡支持四层service、七层负载均衡ingress-nginx-controller,可用于多种场景。 4)可扩展性强拥有强大的集群扩展能力,可以根据业务规模自动增加和缩减主机节点的数量,确保服务可以承受大量并发带来的压力,保证业务稳定运行。 5)根据节点资源的使用情况对pod进行合理的调度可以按照用户需要调度pod,例如保证Pod只在资源足够的节点上运行,会尝试把同一功能的pod分散在不同的节点上,还会尝试平衡不同节点的资源使用率等。 6)拥有完善的灾备预警方案<拥有多种灾备解决方案,支持备份和容灾,出现故障可以达到秒级切换,保证线上业务不受影响.
Kubernetes 功能详解
1)多租户网络隔离 Kubernetes支持多种网络插件,如flannel,calico,canel等,每个插件都有独特的性能,可以分别适用于多种场景,我们可以利用calico的network·policy(网络策略)解决k8s中的网络隔离,对于多租户场景,可以每一个用户一个名称空间(namespace),然后对这个名称空间设置网络隔离。 2)高可用,高可扩展性 kubernetes中支持多种高可用解决方案,如keepalive+nginx,keepalived+haproxy等,可以使访问流量分发到不同的主机节点,减轻节点压力,如果某个节点出现故障,可以实现秒级切换,达到高可用,保证业务不中断。 3)用户数据的持久化存储 kubernetes支持多种持久化存储解决方案,保证数据可以得到很好的备份,降低用户数据丢失的风险,kubernetes中可使用的存储方案如下:· 本地存储:emptyDir, hostPath·网络连接类存储:SAN(存储局域网络):iSCSI·NAS(网络附加存储):nfs,cifs分布式存储:glusterfs,ceph-块级别的存储,cephfs-文件系统级别的存储云存储:Azure·Disk等
4)拥有多种更新回滚策略<通过管理kubernetes的控制器和service等,可以实现灰度发布,蓝绿部署,金丝雀发布等,达到业务的快速部署和回滚等操作,用以满足不同客户的不同升级需求。 5)弹性伸缩HPA、VPA,根据访问的流量压力,可以实现 pod的水平扩容和缩减,达到秒级扩容,让 pod 始终处于满足业务正常运行时所需的数量即可,避免了资源的浪费。 6)节省资源,优化硬件资源的使用根据流量进行业务组件的扩缩容,可节省机器资源。
Kubernetes 企业应用场景分析
日志场景
- 互动1:收集日志大家用过什么? 在生产环境中,日志对于排查问题至关重要,我们需要有一个日志管理系统,如efk这个最受欢迎的日志管理系统。kubernetes可以实现efk的快速部署和使用,通过statefulset控制器部署elasticsearch组件,es用来存储日志数据,还可通过动态volumeclaimtemplate动态生成pv实现es数据的持久化存储。通过deployment部署kibana组件,实现日志的可视化管理。通过daemonset 控制器部署fluentd 组件,来收集节点和k8s集群的日志。
kubernetes中部署efk可实现如下功能:如果集群扩容,那么 daemonset 控制器会自动检测到新增加的 node 节点,就会在新的 node 节点上部署fluentd,完成日志收集,这就可以减少人为干预,提高工作效率,确保日志可以被正常收集。
devops 场景
DevOps是一套完整的运维开发流程,可以实现快速的构建、测试和发布软件,整个流程包括敏捷开发->持续集成->持续交付->持续部署->DevOps,通过·Kubernetes,我们可以实现容器在多个计算节点上的统一调度,可以将容器对接到持久存储、虚拟网络,还可以实现弹性伸缩等,提高了产品的送代速度。
- 互动2:敏捷开发->持续集成->持续交付->持续部署-是什么? 1、敏捷开发:提高开发效率,及时跟进用户需求,缩短开发周期。个敏捷开发包括编写代码和构建代码两个阶段,可以使用git或者svn来管理代码,用maven对代码进行构建 2、持续集成:持续集成强调开发人员提交了新代码之后,立刻自动的进行构建、(单元)测试。根据测试结果,我们可以确定新代码和原有代码能否正确地集成在一起。持续集成过程中很重视自动化测试验证结果,对可能出现的一些问题进行预警,以保障最终合并的代码没有问题
常见的持续集成工具: 1.Jenkins Jenkinis是用Java语言编写的,是目前使用最多和最受欢迎的持续集成工具,使用Jenkins,可以自动监测到git或者sVn存储库代码的更新,基于最新的代码进行构建,把构建好的源码或者镜像发布到生产环境。Jenkins还有个非常好的功能:它可以在多台机器上进行分布式地构建和负载测试
3、持续交付:持续交付在持续集成的基础上,将集成后的代码部署到更贴近真实运行环境的「类生产环境」(production-like·environments) 中。交付给质量团队或者用户,以供评审。如果评审通过,代码就进入生产阶段。如果所有的代码完成之后一起交付,会导致很多问题爆发出来,解决起来很麻烦,所以持续集成,也就是每更新一次代码,都向下交付一次,这样可以及时发现问题,及时解决,防止问题大量堆积。
4、持续部署:持续部署是指当交付的代码通过评审之后,自动部署到生产环境中。持续部署是持续交付的最高阶段。Puppet,SaltStack和Ansible是这个阶段使用的流行工具。容器化工具在部署阶段也发挥着重要作用。·Docker和k8s是流行的工具,有助于在开发,测试和生产环境中实现一致性。·除此之外,k8s还可以实现自动扩容缩容等功能。
上述持续集成、持续交付、持续部署都可以基于Jenkins和k8s完成
kubernetes在DevOps中可以实现如下功能: 1、多集群管理:一套k8s1集群能效划分多个名称空间,给不同的环境用,比方说开发、测试、生产 2、多环境一致性:Kubernetes是基于docker的容器编排工具,因为容器的镜像是不可变的,所以镜像把·OS、业务代码、运行环境、程序库、目录结构都包含在内,镜像保存在我们的私有镜像仓库,只要用户从我们提供的私有仓库拉取镜像,就能保证环境的一致性。 3、持续集成,持续部署,持续交付:可以让产品快速迭代,自动部署,根据用户的要求达到持续交付的能力。
容器部署和传统部署对比分析
1.传统部署时代:早期,应用程序在物理服务器上运行。无法为物理服务器中的应用程序定义资源边界,这会导致资源分配问题。例如,如果在物理服务器上运行多个应用程序,则可能会出现一个应用程序占用大部分资源的情况,结果可能导致其他应用程序的性能下降。一种解决方案是在不同的物理服务器上运行每个应用程序,但是由于资源利用不足而无法扩展,并且许多物理服务器的维护成本也很高。
2.虚拟化部署时代:(Ctrl)-作为解决方案,引入了虚拟化功能,它允许你在单个物理服务器的CPU·上运行多个虚拟机(VM)。虚拟化功能允许应用程序在·VM·之间隔离,并提供安全级别,因为一个应用程序的信息不能被另一应用程序自由地访问。因为虚拟化可以轻松地添加或更新应用程序、降低硬件成本等,所以虚拟化可以更好地利用物理服务器中的资源,并可以实现更好的可伸缩性。每个VM·是一台完整的计算机,在虚拟化硬件之上运行所有组件,包括其自己的操作系统。
3.容器部署时代:容器类似VM,但是它们具有轻量级的隔离属性,可以在应用程序之间共享操作系统(OS)。因此,容器被认为是轻量级的。容器与VM·类似,具有自己的文件系统、CPU、内存、进程空间等。由于它们与基础架构分离,因此可以跨云和OS分发进行移植。容器因具有许多优势而变得流行起来。下面列出了容器的一些好处: 敏捷应用程序的创建和部署: 与使用VM镜像相比,提高了容器镜像创建的简便性和效率。 持续开发、集成和部署: 通过快速简单的回滚(由于镜像不可变性),提供可靠且频繁的容器镜像构建和部署。
3)关注开发与运维的分离:在构建/发布时而不是在部署时创建应用程序容器镜像,从而将应用程序与基础架构分离。 4)可观察性:不仅可以显示操作系统级别的信息和指标,还可以显示应用程序的运行状况和其他指标信号。 5)跨开发、测试和生产的环境一致性:在便携式计算机上与在云中相同地运行。 6)云和操作系统分发的可移植性:可在·Ubuntu、RHEL、CoreOs、本地、GoogleKubernetes Engine 和其他任何地方运行。 7)以应用程序为中心的管理: 8)松散耦合、分布式、弹性、解放的微服务:应用程序被分解成较小的独立部分,并且可以动态部署和管理-而不是在一台大型单机上整体运行。 9)资源隔离:可预测的应用程序性能。 10)资源利用:高效率和高密度
Kubernetes中的资源对象
最小调度单元Pod
Pod是Kubernetes中的最小调度单元,当指派容器时,容器实际上并不会指派到物理硬件上,容器会被分配到一个Pod里,一个Pod封装一个容器(也可以封装多个容器),Pod里的容器共享存储、网络等。也就是说,应该把整个pod看作虚拟机,然后每个容器相当于运行在虚拟机的进程。所有容器都被统一安排和调度,并运行在共享的上下文中。对于具体应用而言,Pod是它们的逻辑主机,Pod包含业务相关的多个应用容器。
白话解释:可以把pod看成是一个“豌豆荚”,里面有很多“豆子”(容器)。一个豌豆荚里的豆子,它们吸收着共同的营养成分、肥料、水分等,Pod和容器的关系也是一样,Pod里面的容器共享pod的空间、资源、网络、存储等。
Pod 是有 ip 地址的: Pod里有两个容器,如nginx(默认端口 80)、tomcat(默认端口是8080) 访问pod ip:80可以请求到nginx 访问pod ip:8080可以请求到tomcat
如何通过k8s创建一个Pod资源?
编写一个资源清单文件
catpod.yaml
apiVersion:v1
kind:Deployment
metadata:
name: my-nginx
spec:
tomcat-podnamespace:default. labels:app:: : tomcatspec:·containers:--name: - tomcat-pod-javaports:-:containerPort:-8080image:-tomcat:8.5-jre8-alpineimagePullPolicy:-IfNotPresent
创建资源
kubectl apply -f pod.yaml
控制器Deployment
Replicaset: Kubernetes 中的副本控制器,管理 Pod,使 pod 副本的数量始终维持在预设的个数。LDeployment:Deployment管理Replicaset和Pod 的副本控制器,Deployment可以管理多个 Replicaset,是比 Replicaset更高级的控制器,也即是说在创建Deployment的时候,会自动创建Replicaset,由Replicaset 再创建 Pod,Deployment 能对 Pod 扩容、缩容、滚动更新和回滚、维持 Pod 数量。
Service
ingress-nginx-controller
Ingress-nginx-controller是七层代理,里面运行的是openrestry(nginx+lua组合),可以代理Service,由Service代理到Pod
七层代理有什么功能:基于请求头、权重、cookie进行流量转发,还支持http、https协议
其他资源
statefulset、job、cronjob、daemonset 等等