文章目录
- 一、Kubernetes架构
- 二、Kubernetes核心组件
- 三、Kubernetes核心资源
- 四、拓展
- 1、Service和Ingress的区别是什么?
- 2、Replicaset和Deployment的区别是什么?
- 3、Deployment和Statefulset的区别是什么?
- 4、Job和Cronjob的区别是什么?
- 5、Configmap和Secret的区别是什么?
一、Kubernetes架构
Kubernetes 采用了分布式系统的架构,包括 Kubernetes Master 和 Kubernetes Node 两个组件:
- Kubernetes Master:负责整个 Kubernetes 集群的管理和控制,包括 API Server、etcd、Scheduler、Controller Manager 等。
- Kubernetes Node:是集群中的工作节点,运行着容器和 Kubernetes Agent。其中,容器是应用程序的运行环境,Kubernetes Agent 负责与 Kubernetes Master 进行通信,并将容器的状态信息汇报给 Kubernetes Master。
Kubernetes 通过调度器(Scheduler)将应用程序的容器自动地调度到合适的节点上,并自动进行负载均衡和服务发现等功能。同时,它还支持水平自动伸缩,根据应用程序的负载情况自动扩缩容器的数量,确保应用程序的高可用性和可扩展性。
单Master节点架构图如下:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-6wSs3YY3-1682042665202)(D:\MD归档文档\IMG\image-20230418203733364.png)]
二、Kubernetes核心组件
-
kubectl:管理k8s的命令行工具,可以操作k8s中的资源对象,如增删改查等。
-
etcd: 是一个高可用的键值数据库,存储k8s的资源状态信息和网络信息的,etcd中的数据变更是通过api server进行的。
-
apiserver: 提供k8s api,是整个系统的对外接口,提供资源操作的唯一入口,供客户端和其它组件调用,提供了k8s各类资源对象(pod,deployment,Service等)的增删改查,是整个系统的数据总线和数据中心,并提供认证、授权、访问控制、API注册和发现等机制,并将操作对象持久化到etcd中。
-
scheduler:负责k8s集群中pod的调度的 , scheduler通过与apiserver交互监听到创建Pod副本的信息后,它会检索所有符合该Pod要求的工作节点列表,开始执行Pod调度逻辑。调度成功后将Pod绑定到目标节点上,相当于“调度室”。
-
Controller-Manager:是一个负责监控K8s系统中各个对象状态并按需处理的组件。Controller-Manager包含了多个控制器,每个控制器负责管理一类对象,如ReplicaSet、Deployment等。 控制器会监测与自己相关的对象的状态变化,并根据需要创建、更新或删除相关对象,以确保系统的实际状态与期望状态一致。 控制器还负责实现许多Kubernetes功能,如水平自动扩展、滚动更新、自愈能力等。
-
Calico: 是一套开源的网络和网络安全方案,用于容器、虚拟机、宿主机之前的网络连接。
-
kubelet:是Master在Node上的Agent,管理本机运行容器的生命周期,比如创建容器、Pod挂载数据卷、获取容器和节点状态等工作,kubelet将每个Pod转换成一组容器。
-
kube-proxy:提供网络代理和负载均衡,是实现service的通信与负载均衡机制的重要组件,kube-proxy负责为Pod创建代理服务,从apiserver获取所有service信息,并根据service信息创建代理服务,实现service到Pod的请求路由和转发,从而实现K8s层级的虚拟转发网络,将到service的请求转发到后端的pod上。
-
Cordns:一个 DNS 服务,而 DNS 作为一种常见的服务发现手段,很多开源项目以及工程师都会使用 CoreDNS 为集群提供服务发现的功能,Kubernetes 就在集群中使用 CoreDNS 解决服务发现的问题。
-
Docker:容器运行时,负责启动容器的,在k8s1.24版本之后废弃docker,使用container作为容器运行。
三、Kubernetes核心资源
-
Pod:是K8s中的最小调度单元,k8s是通过定义一个Pod的资源,然后在Pod里面运行容器,容器需要指定镜像,用来运行具体的服务。一个Pod封装一个容器(也可以封装多个容器),Pod里的容器共享存储、网络等。也就是说,应该把整个pod看作虚拟机,然后每个容器相当于运行在虚拟机的进程。
-
Label:K8s中的资源对象大都可以打上标签,如Node、Pod、Service 等,一个资源可以绑定任意多个label,k8s 通过 Label 可实现多维度的资源分组管理,后续可通过 Label Selector 查询和筛选拥有某些 Label 的资源对象,例如创建一个 Pod,给定一个 Label是app=nginx,那么service可以通过label selector选择拥有app=nginx的pod,和其相关联,也可通过 app=nginx 删除拥有该标签的 Pod 资源。
-
Replicaset:是K8s中的副本控制器,管理Pod,使pod副本的数量始终维持在预设的个数。
-
Deployment:Deployment是管理Replicaset和Pod的副本控制器,Deployment可以管理多个Replicaset,是比Replicaset更高级的控制器,也即是说在创建Deployment的时候,会自动创建Replicaset,由Replicaset再创建Pod,Deployment能对Pod扩容、缩容、滚动更新和回滚、维持Pod数量。
-
Service(4层代理):在k8s中,Pod是有生命周期的,如果Pod重启IP很有可能会发生变化。如果我们的服务都是将Pod的IP地址写死,Pod的挂掉或者重启,和刚才重启的pod相关联的其他服务将会找不到它所关联的Pod,为了解决这个问题,在k8s中定义了service资源对象,Service 定义了一个服务访问的入口,客户端通过这个入口即可访问服务背后的应用集群实例,service是一组Pod的逻辑集合,这一组 Pod 能够被 Service 访问到,通常是通过 Label Selector实现的。
-
Ingress(七层代理):用于管理K8s群集上的入口流量。通过使用Ingress,可以轻松地将HTTP和HTTPS流量路由到K8s集群内的服务。它可以理解HTTP、HTTPS和TLS等不同的协议安全选项,并将其转发到不同的服务。
-
Statefulset:主要用于管理有状态应用程序。在StatefulSet中,每个Pod实例都具有唯一的网络标识符和稳定的存储标识符,这些标识符与Pod的名称和索引相关联。这使得StatefulSet在要求有一定顺序的应用程序部署、有状态的应用程序状态管理等方面非常有用。
-
Job:是一种用于批处理处理任务的控制器对象,通常用于一次性执行一些短暂的、非常需要完成才能继续执行下一步任务的工作。
-
CronJob:是一种基于时间调度的控制器对象,用于执行定时任务。与Job对象类似,CronJob也允许您定义一个或多个Pod,但它们是在确定的时间间隔内运行的,而不是在一次性任务完成后终止。
-
Configmap:是一种用于存储配置数据的对象。它可以存储密钥-值对、环境变量、命令行参数等应用程序配置,在应用程序部署过程中提供独立于镜像的配置和环境。
-
Secret:是一种用来存储和管理加密数据(如密码、OAuth tokem、SSL/TLS证书等)的对象,它主要解决了敏感数据在容器中存储和传输时的安全问题。
四、拓展
1、Service和Ingress的区别是什么?
Service用于将应用程序部署到集群中的节点,并公开在集群内部的其他对象中进行访问。 Service负责让Kubernetes集群内的其他对象(如Pod)可以安全地访问到应用程序,同时也支持Pod的发现和负载均衡。
Ingress是一个Kubernetes内置的对象,它定义了从集群外部到集群内部应用程序的流量路由规则。Ingress可以将所有应用程序暴露到Internet上,并根据域名和URL路径来路由请求。Ingress可以使用不同的控制器(如Nginx、Traefik等)进行实现,以提供更丰富的流量路由和负载均衡功能。
因此,Service主要是为了在Kubernetes集群内部提供服务,并支持内部流量的路由和负载均衡;而Ingress是为了将应用程序暴露到Internet上,并根据域名和URL路径进行流量路由。在实际应用中,如果需要将应用程序暴露到Internet上,则需要使用Ingress;如果仅需要在Kubernetes集群内部提供服务,则可以使用Service。
2、Replicaset和Deployment的区别是什么?
Kubernetes中的ReplicaSet和Deployment都是用于管理Pod副本的控制器,它们的作用和职责是有些不同的。
ReplicaSet是一个用于确保在Kubernetes集群中指定数量的Pod副本副本的控制器。它通过不断地对比当前Pod副本数量与期望Pod副本数量,保持两者的一致性,确保在节点故障或删除Pod的情况下,能够自动创建新的Pod副本。 ReplicaSet仅仅关注Pod副本数量,而不关心Pod的版本更新。
Deployment是一个高级别的控制器,它可以协调多个ReplicaSet来实现Pod的滚动更新、回滚、版本管理等功能。Deployment定义了期望的Pod副本数量以及如何创建、更新和删除Pod,它会管理多个ReplicaSet版本之间的切换。Deployment还支持滚动更新的策略,可以控制每个Pod的更新时间间隔和并发更新数量等。
因此,ReplicaSet是一个较为基础的控制器,它主要用于确保Pod副本数量的管理,而Deployment是一个对ReplicaSet的高级封装,它提供了更多的功能和控制,使得管理和更新应用程序变得更加方便和灵活。在实际应用中,如果需要对Pod进行简单的管理,则可以使用ReplicaSet,如果需要进行版本管理、滚动更新等高级功能,则建议使用Deployment。
3、Deployment和Statefulset的区别是什么?
StatefulSet和Deployment都是Kubernetes的控制器对象,但它们在应用程序的部署和管理上有一些区别。
Deployment通常用于管理无状态应用程序,而StatefulSet通常用于管理有状态应用程序,提供了更严格的Pod顺序控制和滚动更新支持。
4、Job和Cronjob的区别是什么?
Kubernetes中的Job和CronJob都是用于处理任务的控制器对象,但它们之间有一些区别:
-
执行方式:Job对象通常用于一次性执行一些短暂的、非常需要完成才能继续执行下一步任务的工作。而CronJob对象则是基于时间调度定期执行任务。
-
运行时间:Job通常只运行一次,完成一项任务后即停止,而CronJob则可以根据您设置的时间表定期运行任务。
-
创建方式:Job只需要定义一个Pod模板即可,而CronJob除了定义一个Pod模板外,还需要定义一个时间调度表。
-
自动清理:在任务完成后,Job会自动删除Pod,而CronJob会保留Pod以便日后查看任务日志或进行审计。
总的来说,Job对象更适用于一次性任务,例如数据处理、数据导入/导出等。CronJob则更适用于周期性的任务,例如系统清理、日志归档、数据备份等。
5、Configmap和Secret的区别是什么?
ConfigMap和Secret都是Kubernetes中用于存储配置信息的对象,但它们在使用场景和安全性上有一些不同。
-
用途不同:ConfigMap用于存储非敏感信息,如应用程序配置文件、命令行参数等;而Secret用于存储敏感信息,如密码、证书等。
-
存储方式不同:ConfigMap将配置信息存储为键值对的形式,可以使用Volume在Pod中挂载;而Secret也是将敏感信息存储为键值对,但会对其进行加密保护,可以使用Volume、环境变量等方式在Pod中使用。
-
安全性不同:ConfigMap中的信息一般为明文,可以通过kubectl get configmap命令查看其内容;而Secret中的信息是加密的,只有具有访问权限的用户才能查看其内容。
-
更新方式不同:ConfigMap可以使用kubectl edit或kubectl apply更新配置信息;而Secret通常不建议使用kubectl edit或kubectl apply更新敏感信息,最好使用kubectl create或kubectl apply等命令创建新的Secret,并删除旧的Secret。
综上所述,ConfigMap和Secret都是Kubernetes中非常重要的存储配置信息的对象,但ConfigMap适用于存储一些非敏感信息,而Secret则适用于存储一些敏感信息,需要更高的安全性。