Kubernetes
K8S 的全称为 Kubernetes (K12345678S),PS:“嘛,写全称也太累了吧,不如整个缩写”。
1.Kubernetes 概述
Google旗下的容器跨主机编排工具,占据了80%以上的市场份额,已经成为容器编排工具的事实标准
作用:
用于自动部署、扩展和管理“容器化(containerized)应用程序”的开源系统。
可以理解成 K8S 是负责自动化运维管理多个容器化程序(比如 Docker)的集群,是一个生态极其丰富的容器编排框架工具。
由来:
K8S由google的Borg系统(博格系统,google内部使用的大规模容器编排工具)作为原型,后经GO语言延用Borg的思路重写并捐献给CNCF基金会开源。
GitHub:
https://github.com/kubernetes/kubernetes
K8S是一款强大的容器编排平台,可以帮助企业实现容器化的业务部署和管理,提升效率和可靠性。
K8S是一个容器集群管理系统,在Docker等容器技术的基础上,为容器化的应用提供部署运行、资源调度、服务发现和动态伸缩等一系列完整功能,提高了大规模容器集群管理的便捷性。
K8S 的特点包括:
●自动化管理:大大减少了人工干预,提高了应用部署和管理的效率。
●弹性伸缩:能够根据负载自动调整容器的副本数量,实现资源的高效利用。
●高可用性:通过副本和故障转移机制,确保应用的持续可用。
●负载均衡:可以在多个节点上自动分配负载,实现负载均衡。
●跨平台支持:可以在不同的基础设施上运行,包括物理机、虚拟机和云平台。
2.K8s的架构
k8s有 master 和 worker node 两类节点
(1)Master 节点的组件
负责K8S集群的管理和资源调度等运维工作
(1)Kube-apiserver
是所有服务请求的统一访问入口,负责接收、验证和转发请求
工作原理:
1)API Server 监听特定的端口,接收来自客户端的 HTTP 请求。
2)对请求进行认证和授权,确保只有合法的用户能够执行相应的操作。
3)验证请求中的数据格式和内容是否合法。
4)将请求中的信息存储到 Etcd 中,并更新集群的状态。
5)提供其他模块之间的数据交互和通信的枢纽(其他模块通过API Server查询或修改数据,只有API Server才直接操作etcd)。
(2)Kube-controller-manager
控制器管理器,负责管理K8S各种资源对象的控制器;并通过apiserver监控整个K8S集群的资源状态,并确保资源始终处于预期的工作状态
常见的控制器 | |
---|---|
Node Controller(节点控制器) | 负责在节点出现故障时发现和响应 |
Replication Controller(副本控制器) | 负责保证集群中一个 RC(资源对象 Replication Controller)所关联的 Pod 副本数始终保持预设值。可以理解成确保集群中有且仅有 N 个 Pod 实例,N 是 RC 中定义的 Pod 副本数量 |
Endpoints Controller(端点控制器) | 填充端点对象(即连接 Services 和 Pods),负责监听 Service 和对应的 Pod 副本的变化。 可以理解端点是一个服务暴露出来的访问点,如果需要访问一个服务,则必须知道它的 endpoint |
Service Account & Token Controllers(服务帐户和令牌控制器) | 为新的命名空间创建默认帐户和 API 访问令牌 |
ResourceQuota Controller(资源配额控制器) | 确保指定的资源对象在任何时候都不会超量占用系统物理资源 |
Namespace Controller(命名空间控制器) | 管理 namespace 的生命周期 |
Service Controller(服务控制器) | 属于 K8S 集群与外部的云平台之间的一个接口控制器 |
工作原理:
1)通过 API Server 定期获取资源的状态信息。
2)根据资源的定义和当前状态,计算出期望的状态。
3)如果当前状态与期望状态不一致,控制器会采取相应的行动,例如创建、删除或更新资源。
(3)Kube-scheduler
资源调度器,负责Pod资源的调度,通过调度算法(预选/优选策略)为待部署的Pod选择最适合的node节点
•预选策略(predicate):过滤不符合条件的节点
•优选策略(priorities):优先级排序,选择优先级最高的节点
工作原理:
1)从 API Server 获取尚未分配到节点的 Pod 信息。
2)根据 Pod 的资源需求和节点的可用资源,筛选出符合条件的节点。
3)为符合条件的节点计算优先级,考虑因素包括节点的负载、亲和性和反亲和性等。
4)选择优先级最高的节点,并将 Pod 调度到该节点上。
(4)Etcd
K8S集群的数据库,是一种键值对存储结构的分布式数据库,负责存储K8S集群所有配置和状态信息,仅apiserver拥有访问和读写权限
工作原理:
1)将K8S集群的配置数据、资源对象的定义和状态等以键值对的形式存储。
2)通过 Raft 一致性算法确保数据的一致性和可靠性。
3)在多个Etcd节点之间同步数据,以实现高可用性。
(2)worker node 节点的组件
负责运行工作负载,即容器应用
(1)Kubelet
接收apiserver的指令,创建和管理Pod及其容器的生命周期;定期收集节点的资源使用情况,并上报给apiserver
工作原理:
1)向 API Server 注册所在节点的信息,包括节点的资源容量和状态。
2)根据 API Server 的指令,启动、停止和监控 Pod 中的容器。
3)定期收集节点的资源使用情况,并上报给 API Server。
(2)Kube-Proxy
负责实现Pod网络代理,维护网络规则和四层负载均衡
工作原理:
1)监听 API Server 中 service 资源对象的定义和更新。
2)根据 service 的定义,在节点上配置网络规则,实现请求的分发和负载均衡。
3)定期检查后端 Pod 的健康状况,确保服务的可用性。
(3)Container Runtime容器运行时/容器引擎
运行容器
工作原理:
1)根据 Pod 中容器的定义,从镜像仓库拉取所需的镜像。
2)创建和启动容器,并配置相应的网络和存储。
3)实现容器之间的资源隔离和限制,确保每个容器都能获得所需的资源。
(3)Kubernetes工作流程
(1)用户通过客户端发送创建Pod的请求给apiserver
(2)apiserver接收到请求并进行认证后,将请求信息存储到etcd中
(3)controller-manager通过list-watch监听到apiserver的指令后,会根据请求信息中的资料配置模板创建Pod资源
(4)scheduler也通过list-watch监听到apiserver的指令后,开始调度新创建的Pod,会根据调度算法的预选策略和优选策略选择出最适合的node节点来部署Pod
(5)node节点上的kubelet通过list-watch监听到apiserver的指令后,会在指定的节点上创建Pod,并管理其容器的生命周期
(6)用户还可以通过apiserver在kube-proxy上配置相应的网络规则,实现Pod网络代理和负载均衡
3.K8S资源对象
(1)Pod
是K8S能够创建和管理的最小单元。一个Pod里可以包含一个或多个应用容器,同一个Pod里的容器之间共享网络、存储等资源(容器之间可以通过localhost相互访问,还可以共享Pod的存储卷)
(2)Pod 控制器
(1)deployment
部署无状态应用(没有实时数据需要存储);同时也负责管理replicase(维持Pod副本数量始终符合预期状态)和Pod(容器化的应用程序)
(2)statefulset
部署有状态应用(有实时数据需要存储)
(3)daemonset
在每个node节点上都部署一个Pod副本
(4)job
一次性的部署短期任务的Pod(执行完任务后会自动退出)
(5)cronjob
周期性的部署短期任务的Pod(执行完任务后会自动退出)
(3)service
在K8S集群内部,为通过标签选择器相关联的一组Pod提供一个统一的访问入口(clusterIP)和负载均衡(只支持四层)
service 通过标签选择器关联Pod的标签,从而自动发现相关联Pod的端点(Pod的IP和端口)
(4)ingress
作为K8S集群外部的访问入口,可定义ingress规则根据不同的域名或URL路径绑定并转发请求给指定的service,支持七层负载均衡
(5)volume
Pod中容器可以访问的文件系统
(6)Name
资源名称
由于 K8S 内部,使用 “资源” 来定义每一种逻辑概念(功能),所以每种 “资源”,都应该有自己的 “名称”。
K8S资源配置信息 | |
---|---|
apiversion | 指定资源对象使用的api接口版本 |
kind | 指定资源对象的类型 |
metadata | 指定资源对象的元数据信息,比如name(资源名称)、namespace(命名空间)、annotation(注释)、label(标签) |
spec | 指定资源对象的配置属性,比如副本数、镜像、网络模式、存储卷 |
status | 资源对象在当前的运行状态信息 |
(7)namespace
命名空间,用于隔离资源名称的。在同一个命名空间中,同类型的资源名称是唯一的
(8)label
标签,将一个或多个键值对标识关联到某个资源对象,用于对资源对象进行分组
(9)label selector
标签选择器,用于查询和筛选拥有指定标签的资源对象
标签选择器目前有两种:基于等值关系(等于、不等于)和基于集合关系(属于、不属于、存在)。
(10)annotation
注释,用于资源对象的注释信息;还可以用于开启一些特殊资源对象的功能特性
有效的标签值必须为63个字符或更少,并且必须为空或以字母数字字符([a-z0-9A-Z])开头和结尾,中间可以包含横杠(-)、下划线(_)、点(.)和字母或数字。注释值则没有字符长度限制。
4.常见的K8S安装部署方式
(1)Minikube
Minikube是一个工具,可以在本地快速运行一个单节点微型K8S,仅用于学习、预览K8S的一些特性使用。
部署地址:https://kubernetes.io/docs/setup/minikube
(2)Kubeadm
Kubeadm也是一个工具,提供kubeadm init和kubeadm join,用于快速部署K8S集群,相对简单。
https://kubernetes.io/docs/reference/setup-tools/kubeadm/kubeadm/
(3)二进制安装部署
生产首选,从官方下载发行版的二进制包,手动部署每个组件和自签TLS证书,组成K8S集群,新手推荐。
https://github.com/kubernetes/kubernetes/releases
Kubeadm降低部署门槛,但屏蔽了很多细节,遇到问题很难排查。如果想更容易可控,推荐使用二进制包部署Kubernetes集群,虽然手动部署麻烦点,期间可以学习很多工作原理,也利于后期维护。
5.k8s部署 二进制与kubeadm的区别
(1)二进制部署
部署难,管理方便,集群伸展性能好
更稳定,集群规模到达一定的规模(几百个节点、上万个Pod),二进制稳定性是要高于kubeadm部署
遇到故障,宿主机起来了,进程也会起来
(2)kubeadm部署
部署简单,管理难
是以一种容器管理容器的方式部署的组件及服务,故障恢复时间比二进制慢
遇到故障,启动宿主机,再启动进程,最后去启动容器,集群才能恢复,速度比二进制慢