概念

image-20260315133057953

Node

image-20260315133718864

一个节点就是一个物理机或者虚拟机


Pod

image-20260315134259818

如图所示:在一个node中有APP应用程序、数据库应用程序

pod是k8s中的最小调度单元,它由node进行管理,一个node中可以有一个或者多个容器的组合。创建之后,k8s一般会给它们分配一个内部的ip地址,注意外部是访问不了的

一般情况下,建议一个pod中只运行一个容器,这样可以更好的实现应用程序的解耦和扩展

image-20260315134429846

如图所示:pod如果发生故障的时候,k8s会销毁故障的pod,重新创建一个新的pod,此时ip地址会发生改变,如果还按照原来的ip进行访问的话,就会发生错误。k8s为了解决这个问题,引入了一个叫做Service的资源对象


Service

image-20260315134841661

Service简称svc

svc可以作为pod之间的通讯桥梁。svc将APP应用程序和数据库应用程序分成了两个部分,APP应用程序通过svc来访问数据库。数据库的pod做了集群,当某一个pod故障了,即使这个pod的ip地址发生了变化,svc会将请求发送到其他正常的pod上,因为svc的ip地址不会变


内部服务、外部服务

image-20260315135706133

内部服务:不想暴露给外面的一些隐私类服务,如数据库,缓存,消息队列等

外部服务:让外部能够访问的服务,如Controller层


NodePort

image-20260315135904866

NodePort会在node上开放一个端口,然后将这个端口映射到svc的ip和端口上,这样就可以通过节点ip:端口来访问svc了。

但是这种方式只适用于开发和测试阶段,实际生产阶段需要使用域名的方式,于是引入了Ingress


Ingress

image-20260315140204366

Ingress是用来管理集群外部访问集群内部的桥梁,可以通过Ingress来配置不同的转发规则,从而通过不同的转发规则来访问集群内部不同的Service、Pod

也可以通过Ingress来配置域名,将原来的ip地址和端口号的方式变为域名访问

还可以配置负载均衡、SSL证书


ConfigMap

image-20260315143133968

当手机应用pod想访问数据库pod的时候,需要知道URL、username、password这些信息,这些信息一般都放在配置文件中或者环境变量中,然后在应用程序中读取这些配置信息,如果进行了修改的话,需要重新编译,重新部署到集群中,导致程序不能正常运行。为了解决这个问题,k8s引入了ConfigMap

可以将这些配置信息放在ConfigMap中,然后就可以直接在应用程序中读取和使用了

有了ConfigMap,就可以将应用程序的镜像内容分离开来

当信息发生修改的时候,只需要修改ConfigMap中的内容,再重新加载Pod就可以了


数据安全

image-20260315144519470

ConfigMap中的数据都是明文,容易被窃取;为了解决这个问题,首先引入的是Secret,它可以将数据做一次Base64编码,但是做一次解码就可以得到原来的数据;后来又引入了网络安全控制访问身份认证等等。


Volumes

image-20260315144839233

如果pod被销毁,那么里面的内容也会删除,如果需要做到持久化,就需要Volumes组件,它的作用是将pod中的数据挂在到本地磁盘上,或者挂载到集群外部的远程存储上,这样即使容器被销毁或者重启,可以在Volumes中找到


Deployment高可用

image-20260315145141836

如果某一个Node中的pod宕机了,k8s为了高可用,通过一个svc来管理几个Node,如果其中一个挂掉了,就会将请求发送到其他正常的Node上

image-20260315150341677

k8s引入了Deployment,它可以定义和管理应用程序的副本数量和应用程序的更新策略

Pod是用来管理一个或者多个容器的

Deployment是用来管理一个或者多个Pod的

具有的特性:

  • 副本控制:可以定义一个应用程序的副本数量,如上图,可以定义APP应用程序的副本(pod)数量为3,如果有副本(pod)发生故障,就会创建一个新的副本(pod)来代替它,始终保持有3个副本(pod)在集群中运行
  • 滚动更新

image-20260315151016232

可以定义和管理应用程序的更新策略,升级应用程序的版本,逐渐使用新的版本替换掉旧的版本,确保应用程序的平滑升级

  • 自动扩缩容

StatefulSet

image-20260315151256674

APP应用程序使用了Deployment进行管理,数据库应用程序应该也需要有高可用的特性。

但是使用Deployment管理会造成数据的不同步,每个pod中的数据是独立的,对于数据库来说需要保证多个副本之间的数据是一致的,于是引用了StatefulSet,它可以保证管理的pod数据一致

但是这种部署非常麻烦,另一种有效的方法是将数据库、缓存、消息队列这种有状态的应用从k8s中抽离出来,在集群外单独部署


架构

Worker-Node

image-20260315153145041

image-20260315153229274

每个Node中包含kubeletkube-proxycontainer-runtime

  • kubelet:负责管理和维护每个节点上的Pod,也会定期从api-server组件接收新的或者修改后的pod规范,同时它也会监控工作节点的运行情况,然后将这些信息汇报给api-server
  • kube-proxy:为Pod对象提供网络代理和负载均衡服务,用来接收请求,将请求发送给不同的节点上。它会在每一个Node上启动一个代理,使发往Service的流量用一种高效的方式路由到正确的后端Pod中
  • container-runtime(容器运行时):运行容器的软件,负责拉取容器镜像、创建容器、启动或者停止容器等等(如Docker-Engine)

Master-Node

image-20260315154058998

用于管理Worker Node,调度不同的Pod到不同的节点上、监控节点的状态、添加和删除一个节点

  • api(kube-apiserver):提供k8s集群的API接口服务,所有的组件都会通过这个接口来进行通信,作为整个系统的入口;负责对整个Worker Node集群的增删改查操作和控制访问;交互的方式有命令行kubectl,Dashboard等
  • etcd:高可用的键值存储对象,用来保存集群中所有资源对象的状态信息
  • c-m(ControllerManager):用于监控集群中所有的状态,如pod、node、service等,如果发现异常,会根据策略采取重启这个pod,或者使用其他的pod来替换掉它
  • sched(Scheduler):负责监控集群中所有节点的资源使用情况,根据一些调度策略,将Pod调度到合适的节点上运行
  • c-c-m(Cloud Controller Manager):云控制管理器,使用其他云服务自带的额外组件,负责与云平台的API进行交互