K8S官网:https://kubernetes.io/
K8S中文文档:https://kubernetes.io/zh-cn/docs/home/
文档概览:https://kubernetes.io/zh/docs/home/
标准化词汇表:https://kubernetes.io/zh/docs/reference/glossary/?all=true#term-kubelet (查询各种关键词、技术术语的相关解释)
k8s中文社区:https://www.kubernetes.org.cn/
k8s中文社区的文档:http://docs.kubernetes.org.cn/
kubectl 备忘单 | Kuberneteskubectl | KubernetesKubectl Reference Docs使用 RBAC 鉴权 | Kubernetes节点 cordon| Kubernetes驱逐 确保 PodDisruptionBudget 的前提下安全地清空一个节点 | Kubernetes升级 kubeadm 集群 | Kubernetes为 Kubernetes 运行 etcd 集群 | Kubernetes网络策略 | Kubernetes服务 | KubernetesIngress | KubernetesDeployments | Kubernetes将 Pod 分配给节点 | Kubernetes污点和容忍度 | KubernetesPod 拓扑扩展约束 | KubernetesInit 容器 | Kubernetes持久卷 | Kubernetes持久卷 pvc| Kubernetes持久卷 pod pvc | Kubernetes卷 volumeMounts | Kubernetes配置 Pod 以使用 PersistentVolume 作为存储 | Kubernetes卷 - hostPath | Kubernetes存储类 | Kubernetes调试 Service | Kubernetes日志架构 | Kubernetes集群故障排查 | KubernetesemptyDir 配置 Pod 以使用卷进行存储 | Kubernetes配置 Pod 使用 ConfigMap | Kubernetes使用 Secret 安全地分发凭证 | KubernetesPod 与 Service 的 DNS | Kubernetes安装 kubeadm | Kubernetes为 Pod 或容器配置安全性上下文 | KubernetesPod 安全策略 | Kubernetes
1.kubernetes简介
#下载源码
git clone git@github.com:kubernetes/kubernetes.git
git checkout -b v1.25 remotes/origin/release-1.25
cd kubernetes
#下载源码
git clone git@github.com:kubernetes/kubernetes.git
git checkout -b v1.25 remotes/origin/release-1.25
cd kubernetes
1.1 Kubernetes是什么
Kubernetes是一个可移植、可扩展的“分布式开源平台",这个平台主要是用来管理我们运行的容器化应用,只不过这个平台它是一个分布式的,那Kubernetes这个分布式平台是如何实现的呢。Kubernetes是将多个0S节点组织在一起,构建出一个庞大的虚拟资源池,而后对用户提供操作该集群的接口,用户就可以通过Kubernetes提供的对应接口对容器进行增删查改等操作。所以对于用户而言,它无需关心Kubernetes底层是如何对容器进行的创建、又是如何调度到对应的节点的,它只需要专注于自己的业务逻辑代码开发即可;
当我们需要使用Kubernetes交付应用时,仅需要通过yaml文件的方式来描述对应容器的状态,Kubernetes则会按照yaml文件中所描述的容器状态信息;进行容器的"自动化"创建。
Kubernetes会时刻监控着容器的状态,如果有容器故障,则会尝试重启容器,使其能容器运行的状态能达到用户所期望的值
1.2 为什么需要Kubernetes
目前使用容器打包和运行应用程序,已经是业界主流的一种方式,在生产环境中,我们需要管理运行应用程序的容器,同时还要确保它不会停机,
例:一个容器发生故障,需要重新拉起该容器。如果系统能自动为其处理,那么容器的管理会不会更加的容易
这就是Kubernetes需要解决的问题!Kubernetes它可以轻松的实现应用的扩展、服务发现、负载均衡、容器的故障转移、以及容器编排等。
- 垂直扩容:新的服务器节点能够很容易的进行增加和删除。
- 水平扩容:容器实例能通过副本控制器进行轻松的扩容,
- 缩容弹性伸缩:能根据容器的资源使用情况,进行自动的扩缩容
- 服务发现和负载均衡:Kubernetes为容器提供负载均衡功能进行流量调度,从而使得应用运行更加稳定。
- 存储编排:Kubernetes允许自动挂载各种存储类系统,例如本地存储、NFS、GFS、Ceph、公共云存储等。
- 自动部署和回滚:如果应用部署过程中出现错误,可以实现自动回滚
- 自动完成装箱计算:Kubernetes允许指定每个容器所需的CPU和内存资源,能够更好的管理容器的资源使用。
- 自我修复:Kubernetes 会重新启动失败的容器、替换容器、对运行状况检查不响应的容器进行杀死
- 密钥与配置管理:Kubernetes允许你存储和管理敏感信息,例如密码、令牌和SSh 密钥。可以在不重建容器镜像的情况下,部署和更新密钥
1.3 Kubernetes不是什么
Kubernetes不是传统的、包罗万象的PaaS(平台即服务)系统。它提供了PaaS产品共有的一些普遍适用的功能,例如部署、扩展、负载均衡、日志记录和监视。Kubernetes默认解决方案都是可选和可插拔的。但在重要的地方保留了用户的选择和灵活性。
Kubernetes:
- 不限制支持的应用程序类型:如果只要应用程序可以在容器中运行,那么它应该可以在 Kubernetes上很好地运行。
- 不部署源代码,也不构建你的应用程序:CI/CD工作流取决于组织的文化和偏好以及技术要求。
- 不提供应用程序级别的服务作为内置服务:例如中间件(例如,消息中间件)、数据处理框架(例如,Spark)、数据库(例如,mysqL)、缓存、集群存储系统(例如,Ceph)。但这些组件都可以在 Kubernetes 上运行
- 不要求日志记录、监视或警报解决方案它提供了一些集成作为概念证明,并提供了收集和导出指标的机制。
- 不提供或不要求配置语言/系统:它提供了声明性API,该声明性API可以由任意形式的声明性规范所构成。RESTfuL;不提供也不采用任何的机器配置、维护、管理或自我修复系统
1.4 Kubernetes优势
优势:
- 微服务架构支持:Kubernetes非常适合部署和管理基于微服务的应用程序,每个服务可以独立运行在Pod中,并通过Service进行发现和通信。
- 自动化部署与扩展:自动化的滚动更新、回滚以及水平扩展(HPA)功能使得应用程序的发布过程更加快速、可靠且无需人工干预。
- 资源调度与优化:Kubernetes能够高效地跨集群节点调度容器,根据资源需求动态分配和调整容器的位置,从而最大化硬件资源利用率。
- 容错性和高可用性:它提供了自我修复机制,当容器或节点出现问题时,会自动重新调度并恢复工作负载,保证应用的持续可用。
- 网络管理:内置的服务发现和负载均衡机制,简化了服务间的通信,同时支持Ingress控制器对外提供统一入口和路由策略。
- 存储集成:支持多种存储插件,方便为容器提供持久化存储解决方案,满足不同应用场景的数据持久化需求。
- 安全与隔离:通过Namespace实现多租户隔离,使用RBAC等安全策略来控制用户权限,确保集群内资源的安全访问。
- 可观测性与监控:集成Prometheus、Grafana等工具以实现资源和应用性能的实时监控,便于问题排查和性能优化。
适应场景:
- 云原生应用:Kubernetes是云原生技术栈的核心组成部分,适合部署在公有云、私有云或者混合云环境下的现代应用程序。
- 大规模分布式系统:对于需要处理高并发、快速响应市场变化的大规模业务场景,K8s能轻松应对扩缩容需求。
- 持续集成/持续部署(CI/CD):结合Jenkins、GitOps等工具,Kubernetes可以构建端到端的自动化部署流水线。
- 边缘计算与物联网(IoT):尽管初期主要针对数据中心设计,但随着轻量级版本的发展,如K3s等,也在逐渐适用于边缘计算设备上的部署和管理。
特点:
- 声明式配置:采用YAML文件描述目标状态,Kubernetes会自动将实际状态调整至期望状态。
- 可移植性:跨平台兼容性强,能在各种基础设施上运行,保持一致的管理和操作体验。
- 社区生态丰富:拥有庞大的开源社区支持,周边工具链完善,包括CI/CD工具、日志与监控系统、服务网格等。
1.5 Kubernetes集群角色
Kubernetes集群需要建立在多个物理主机上,将多个物理主机的资源抽象出来,组织成一个平台,而后进行统一管理,当然它需要多个物理主机,不一定必须是物理机,也可以是虚拟机VM等等;所以从这个角度来说,Kubernetes是一个集群,但是在Kubernetes集群内部,这些节点又被划分成了两类角色;
- 一类角色为主节点,叫Master,负责管理集群;
- 一类角色为工作节点,叫Node,负责运行应用;
这也就意味着我们将来运行的所有容器,都应该运行在Node节点,而Master负责管理有多少个Node节点,同时还负责管理每个Node节点应该运行哪个容器或哪些容器,的控制中心,因此在Kubernetes中Master被称之为Control plane控制平面,而Node就是我们的dataplane叫数据平面;
Registry:Kubernetes主要是在Node上运行容器化应用,那么容器化应用需要依托镜像,而镜像又来自于Registry,但Registry并不是Kubernetes集群的组成部分,但我们必须要有一个私有的Registry,当然也可以使用公共的镜像仓库;
CLient:无论客户端是通过API接口,还是WebUI接口、异或者CLI接口与Master交互,其实都是向Master发送请求,比如客户端申请创建容器、删除容器等,都是由Master负责在Node节点上对容器进行增删改查,而这些操作必须要通过Master,由Master控制着完成的,虽然我们将其称Master,但它并非是一个组件,而是由多个组件组成的;
2.Kubernetes集群组件
通过创建一个Pod或者DepLoyment资源来了解Kubernetes集群组件以及之间的关系。
2.1 Master节点组件
集群的控制节点,负责整个集群的管理和控制,kubernetes的所有的命令基本都是发给Master,由它来负责具体的执行过程
2.1.1 kube-APIServer
Kubernetes API主要提供前端请求接入,然后验证客户端身份,以及客户端提交的请求。所有的组件都必须通过APIServer进行交互;--->(资源增删改查的入口
)
2.1.2 Kube-Scheduler
负责监视APIServer新创建,但未指定运行至哪个节点的Pod,然后选择合适的节点让Pod在上面运行;调度决策考虑的因素有很多,其中有Pod亲和性、反亲和、节点亲和、数据位置、等--->负责资源调度(Pod调度)
2.1.3 Kube-ControllManager
控制器通过APIServer监控集群当前运行的容器状态,当控制器监控到运行的容器状态不符合期望状态时,控制器会致力于将当前状态转变为期望的状态,简单来说就是自动调节当前系统运行状态;控制循环的例子:房间里的温度自动调节器。当你设置了温度,告诉了温度自动调节器你的期望状态 (DesiredState)。房间的实际温度是**当前状态 (Current State)**通过对设备的控制,温度自动调节器让其当前状态接近期望状态。--->资源对象的大总管
这些控制器包括:
- 节点控制器:(NodeControLler):负责在节点出现故障时进行通知和响应;
- 副本控制器(ReplicaSetController):监视容器运行的副本,时刻让其维持期望状态;
- 任务控制器(JobcontrolLer):监测一次性任务的Job对象,然后创建Pods来运行这些任务直至完成;
- ...
2.2Node节点组件
Node是集群的工作负载节点,默认情况kubelet会向Master注册自己,一旦Node被纳入集群管理范围,kubelet会定时向Master汇报自身的情报,包括操作系统,Docker版本,机器资源情况等。
如果Node超过指定时间不上报信息,会被Master判断为“失联”,标记为Not Ready,随后Master会触发Pod转移
2.2.1 Kube-kubelet
kubelet 是集群中每个Node节点上运行的代理程序,用于接收APIServer提供给它的PodSpecs,确保这些PodSpecs中描述的容器处于运行状态且健康,主要作用就是管理容器的启动、停止、销毁、重建等;--->Pod的管家,与Master通信
2.2.2 Kube-kubeproxy
kube-proxy是集群中每个节点上运行的网络代理,它主要维护每台节点上的Iptables、IPVS规则创建和删除,这些规则允许从集群内部或集群外部与Pod进行网络通信;
kube-proxy负责实现容器的负载均衡,然后将指定的流量调度到对应的容器,通过iptables 或 ipvs规则来实现;--->实现kubernetes Service的通信与负载均衡机制的重要组件
2.2.3 ContainerRuntime
容器运行环境是负责运行容器的软件,Kubernetes支持容器运行时,比如Docker、Containerd等;
2.3附加组件
2.3.1 CoreDNS
每创建一个内部负载均衡,则自动创建一条对应的DNS记录,这样就可以让Pod通过域名的方式访问对应的负载均衡;因为k8s分配的负载均衡IP不稳定,删除和添加都会发生变化,但如果分配一个稳定的DNS名称,则无需关系负载均衡的IP;
2.3.2 network
网络插件,为每个Pod分配一个IP地址,确保多个不同节点的Pod能够直接通信,而无需经过NAT地址转换等;
2.3.3 Dashboard
为Kubernetes提供图形界面,通过图形界面管理Kubernetes;
2.4 组件流程图
3. 总结
控制节点组件
- APIServer:APIServer是整个集群的控制中枢(无状态,数据保存在etcd中,看LB调度到哪个节点中的APIServer),提供集群中各个模块之间的数据交换(比如Scheduler和Controller Manager需要进行数据交换,都需要通过APIServer进行连接),并将集群状态和信息存储到分布式键-值(key-value)存储系统Etcd集群中。同时它也是管理集群、资源配额、提供完备的集群安全机制的入口,为集群各类资源对象提供增删改查以及watch 的REST API接口。
- Scheduler:Scheduler是集群Pod的调度中心(有状态,选举机制。无论有多少个节点,工作的只有一个节点),主要是通过调度算法将Pod分配到最佳的Node节点,它通过APIServer监听所有Pod的状态,一旦发现新的未被调度到任何Node节点的Pod(PodSpec.NodeName为空),就会根据一系列策略选择最佳节点进行调度。
- Controller Manager:Controller Manager是集群状态管理器(有状态,选举机制。无论有多少个节点,工作的只有一个节点),以保证Pod或其他资源达到期望值。当集群中某个Pod的副本数或其他资源因故障和错误导致无法正常运行,没有达到设定的值时,Controller Manager会尝试自动修复并使其达到期望状态。
- Etcd:Etcd有CoreOS开发,用于可靠地存储集群的配置数据,是一种持久性、轻量型、分布式的键-值(key-value)数据存储组件,作为Kubernetes集群的持久化存储系统。
# kubectl get leases -n kube-system
NAME HOLDER AGE
kube-controller-manager k8s-master01_acfa3612-ea75-4d65-bf99-89ae2bcfe3c9 11d
kube-scheduler k8s-master03_501a1433-ecf5-454a-9f01-5c71e34738d5 11d
# kubectl get leases -n kube-system
NAME HOLDER AGE
kube-controller-manager k8s-master01_acfa3612-ea75-4d65-bf99-89ae2bcfe3c9 11d
kube-scheduler k8s-master03_501a1433-ecf5-454a-9f01-5c71e34738d5 11d
工作节点组件
- Kubelet:负责与Master通信协作,管理该节点上的Pod创建、删除、状态报告等操作,对容器进行健康检查及监控,同时负责上报节点和节点上面Pod的状态给APIServer,APIServer再保存在Etcd中。
- Kube-proxy:负责各Pod之间的通信和负载均衡,将指定的流量分发到后端正确的机器上。
- Runtime:负责容器的管理。
- CoreDNS:用于Kubernetes集群内部Service的解析,可以让Pod把Service名称解析成Service的IP,然后通过Service的IP地址进行连接到对应的应用上。
- Calico:符合CNI标准的一个网络插件,它负责给每个Pod分配一个不会重复的IP,并且把每个节点当做一个“路由器”,这样一个节点的Pod就可以通过IP地址访问到其他节点的Pod。