k8s


什么是k8s

K8s是指Kubernetes,是一个用于自动化部署、扩展和管理容器化应用程序的开源平台。

简单来说,k8s就是一个编排容器的系统

Kubernetes提供了一个可移植、可扩展的平台,可以自动化部署、扩展和管理应用程序。

Kubernetes基于容器技术,实现自动化的容器编排和管理,可以自动调度容器到集群中的节点上,并根据应用的需求进行水平扩展和负载均衡。

k8s的核心组件有哪些

  1. etcd:一个可靠的分布式键值存储,用于存储 Kubernetes 集群的状态信息。

  2. kube-apiserver:提供了一个Kubernetes API,其他组件都可以通过该API与集群进行交互操作。(集群管理,数据交互)

  3. kube-controller-manager:负责控制器的管理,运行各种控制器来确保系统的自愈能力,比如Replication Controller、Endpoint Controller等。

  4. kube-scheduler:根据调度算法为新创建的Pod选择一个合适的Node,并将其绑定到该节点上。

  5. kubelet:运行在每个Node上,负责启动Pod并确保Pod内的容器处于正常运行状态。

  6. kube-proxy:负责为Service 提供 Cluster 内部的服务发现和负载均衡功能。

  7. container-runtime:容器运行时环境,即运行容器所需要的一系列程序(docker)

k8s主要由master节点和node节点构成。

master节点负责管理集群,node节点是容器应用真正运行的地方。

  • master节点包含的组件有:kube-api-server、kube-controller-manager、kube-scheduler、etcd。
  • node节点包含的组件有:kubelet、kube-proxy、container-runtime

kube-api-server的端口是多少?各个pod是如何访问kube-api-server的

kube-api-server的端口是8080和6443,前者是http的端口,后者是https的端口

Pod可以通过以下两种方式访问kube-apiserver:

  1. 使用环境变量:Kubernetes在每个Pod中注入了一些环境变量,其中包括了kube-apiserver的服务地址和端口信息。
  2. 使用Kubernetes集群内部DNS:在Kubernetes集群中,每个Service都会分配一个唯一的DNS名称。kube-apiserver作为一个Service,也有一个DNS名称。Pod可以使用这个DNS名称来解析出kube-apiserver的IP地址。Pod可以通过该IP地址和kube-apiserver的暴露端口进行通信。

k8s中命名空间的作用是什么

Kubernetes中的命名空间(Namespace)是一种用于隔离不同资源和对象的机制。它可以将一个Kubernetes集群划分为多个虚拟集群,每个命名空间提供了一个独立的工作空间,用于组织和管理应用程序、服务和其他资源。

通过它可以实现资源隔离、资源管理、访问控制、共享资源和管理视图等多种功能,帮助用户更好地组织和管理集群中的资源和工作负载。

pod是什么

Pod是Kubernetes中最小的可部署和可管理单元。它是一组关联的容器集合,共享同一个网络命名空间、存储卷以及其他资源。

Pod是Kubernetes中最基本的部署单元,它提供了一种逻辑上独立和可扩展的环境,使得多个容器可以在同一个Pod中协同工作,方便k8s对容器的调度和管理

pod有什么特点

  1. 共享网络:Pod内的所有容器共享同一个网络命名空间。
  2. 共享存储:Pod内的容器可以访问共享的存储卷。这样可以实现数据的持久化和共享。
  3. 生命周期绑定:Pod中的容器具有相同的生命周期,它们一起启动、调度和停止。当Pod被删除时,Pod中的所有容器也将被删除。
  4. 紧密关联:Pod中的容器经常需要相互配合工作。它们可以通过本地环回网络进行通信,无需通过网络暴露端口。
  5. 每个pod就像一个独立的逻辑机器,k8s会为每个pod分配一个集群内部唯一的IP地址,每个pod都拥有自己的IP地址、主机名、进程等;

pause容器是什么

Pause容器是一个轻量级容器,它的主要作用是协调Pod中其他容器的网络和存储功能

当Pod中有多个容器时,Kubernetes使用pause容器来共享网络命名空间、IPC命名空间和volume存储卷等资源,并确保其他容器可以使用这些资源。

  • 网络共享:当pod被创建时,pod首先会创建pause容器,从而把其他业务容器加入pause容器,从而让所有业务容器都在同一个命名空间中,实现网络共享。
  • 共享存储:在pod级别引入数据卷volume,业务容器都可以挂载这个数据卷从而实现持久化存储。

pod的重启策略有哪些

pod重启容器策略是指针对pod内所有容器的重启策略,不是重启pod

可以通过restartPolicy字段配置pod重启容器的策略

  • Always: 当容器终止退出后,总是重启容器,默认策略就是Always
  • OnFailure: 当容器异常退出,退出状态码非0时,才重启容器。
  • Never: 当容器终止退出,不管退出状态码是什么,从不重启容器。

pod的镜像拉取策略有哪几种

pod镜像拉取策略可以通过imagePullPolicy字段配置镜像拉取策略

  • IfNotPresent: 默认值,镜像在node节点宿主机上不存在时才拉取。
  • Always: 总是重新拉取,即每次创建pod都会重新从镜像仓库拉取一次镜像。
  • Never: 永远不会主动拉取镜像,仅使用本地镜像,需要手动拉取镜像到node节点,如果node节点不存在镜像则pod启动失败。

pod的存活探针有哪几种

kubernetes可以通过存活探针检查容器是否还在运行,可以为pod中的每个容器单独定义存活探针,kubernetes将定期执行探针,如果探测失败,将杀死容器,并根据restartPolicy策略来决定是否重启容器

kubernetes提供了3种探测容器的存活探针

  • httpGet:通过容器的IP、端口、路径发送http 请求,返回200-400范围内的状态码表示成功。
  • exec:在容器内执行shell命令,根据命令退出状态码是否为0进行判断,0表示健康,非0表示不健康。
  • TCPSocket:与容器的端口建立TCP Socket链接。

存活探针的属性参数有哪几个

  • initialDelaySeconds:表示在容器启动后延时多久秒才开始探测;
  • periodSeconds:表示执行探测的频率,即间隔多少秒探测一次,默认间隔周期是10秒,最小1秒;
  • timeoutSeconds:表示探测超时时间,默认1秒,最小1秒,表示容器必须在超时时间范围内做出响应,否则视为本次探测失败;
  • successThreshold:表示最少连续探测成功多少次才被认定为成功,默认是1
  • failureThreshold:表示连续探测失败多少次才被认定为失败,默认是3,连续3次失败,k8s 将根据pod重启策略对容器做出决定;

pod的就绪探针有哪几种

当一个pod启动后,就会立即加入service的endpoint ip列表中,并开始接收到客户端的链接请求,假若此时pod中的容器的业务进程还没有初始化完毕,那么这些客户端链接请求就会失败,为了解决这个问题,kubernetes提供了就绪探针来解决这个问题的。

在pod中的容器定义一个就绪探针,就绪探针周期性检查容器,如果就绪探针检查失败了,说明该pod还未准备就绪,不能接受客户端链接,则该pod将从endpoint列表中移除

k8s提供了3种就绪探针

  • exec:在容器中执行命令并检查命令退出的状态码,如果状态码为0,则说明容器已经准备就绪;
  • httpGet:向容器发送http get请求,通过响应的http状态码判断容器是否准备就绪;
  • tcpSocket:打开一个tcp连接到容器的指定端口,如果连接已建立,则认为容器已经准备就绪。

就绪探针的属性参数有哪些

  • initialDelaySeconds:延时秒数,即容器启动多少秒后才开始探测,不写默认容器启动就探测;
  • periodSeconds :执行探测的频率(秒),默认为10秒,最低值为1;
  • timeoutSeconds :超时时间,表示探测时在超时时间内必须得到响应,负责视为本次探测失败,默认为1秒,最小值为1;
  • failureThreshold :连续探测失败的次数,视为本次探测失败,默认为3次,最小值为1次;
  • successThreshold :连续探测成功的次数,视为本次探测成功,默认为1次,最小值为1次;

就绪探针与存活探针区别是什么

作用上的区别:

存活探针:当存活探针检查失败,是将检查失败的容器杀死,创建新的启动容器来保持pod正常工作;

就绪探针:当就绪探针检查失败,并不重启容器,而是将pod移出endpoint,就绪探针确保了service中的pod都是可用的,确保客户端只与正常的pod交互

简单讲一下 pod创建过程

首先,需要编写一个包含Pod配置信息的描述文件,通常使用YAML或JSON格式。在描述文件中,定义Pod的名称、命名空间、容器、网络设置、存储卷等相关配置。

  1. 用户通过kubectl向api-server发起创建pod请求。
  2. apiserver通过对应的kubeconfig进行认证,认证通过后将yaml中的po信息存到etcd。
  3. Controller-Manager通过apiserver的watch接口发现了pod信息的更新,整合对应的信息交给apiserver,apiserver写到etcd,此时pod已经可以被调度。
  4. Scheduler同样通过apiserver的watch接口更新到pod可以被调度,通过算法给pod分配节点,并将pod和对应节点绑定的信息交给apiserver,apiserver写到etcd,然后将pod交给kubelet。
  5. kubelet收到pod后,调用CNI接口给pod创建pod网络,调用CRI接口去启动容器,调用CSI进行存储卷的挂载。
  6. 网络,容器,存储创建完成后pod创建完成,等业务进程启动后,pod运行成功。

说说pod的终止过程

  1. 用户向apiserver发送删除pod对象的命令
  2. apiserver中的pod对象信息会随着时间的推移而更新,在宽限期内(默认30s),pod被视为dead
  3. 将pod标记为terminating状态
  4. kubectl在监控到pod对象为状态了就会启动pod关闭过程
  5. endpoint控制器监控到pod对象的关闭行为时将其从所有匹配到此endpoint的server资源endpoint列表中删除
  6. 如果当前pod对象定义了preStop钩子处理器,则在其被标记为terminating后会意同步的方式启动执行
  7. pod对象中的容器进程收到停止信息
  8. 宽限期结束后,若pod中还存在运行的进程,那么pod对象会收到立即终止的信息
  9. kubelet请求apiserver将此pod资源的宽限期设置为0从而完成删除操作,此时pod对用户已不可见

pod的生命周期有哪几种(也称5种相位)

pod生命周期有的5种状态

  • Pending(挂起):API server已经创建pod,但是该pod还有一个或多个容器的镜像没有创建,包括正在下载镜像的过程;
  • Running(运行中):Pod内所有的容器已经创建,且至少有一个容器处于运行状态、正在启动或者正在重启状态;
  • Succeed(成功):Pod内所有容器均已退出,且不会再重启;
  • Failed(失败):Pod内所有容器均已退出,且至少有一个容器为退出失败状态
  • Unknown(未知):某于某种原因apiserver无法获取该pod的状态,可能由于网络通行问题导致;

pod的初始化容器是干什么的

init container,初始化容器用于在启动应用容器之前完成应用容器所需要的前置条件

1、初始化容器必须运行完成直至结束,若某初始化容器运行失败,那么kubernetes需要重启它直到成功完成;

2、初始化容器必须按照定义的顺序执行,当且仅当前一个初始化容器成功之后,后面的一个初始化容器才能运行;

service是什么

Service是一种定义了一组Pod的网络访问方式的资源对象。它为一组具有相同功能的Pod提供了一个统一的入口,并将它们封装在一个虚拟的服务IP地址后面。

Service可以通过一个稳定的IP地址和端口提供对应用程序的访问,无论这些应用程序运行在Kubernetes集群内的哪个节点上。它为应用程序提供了一种抽象层,使得后端Pod的变动对外界用户来说是透明的。

主要特性:

  1. 服务发现和负载均衡:Service通过为一组Pod分配唯一的虚拟IP地址和端口,实现了服务发现功能。它会自动将请求均匀地分发到后端Pod中,从而实现负载均衡。
  2. 稳定的网络标识:每个Service都有一个稳定的虚拟IP地址和端口,这个地址和端口可以长期保持不变。
  3. 内部和外部访问:内部Service仅在集群内部可用,用于集群内部的服务通信。外部Service则通过负载均衡器、节点端口或外部IP地址等方式,将流量从集群外部引导到Service中。

endpoint是什么

Endpoint是一种资源对象,用于表示一个Service所关联的后端Pod的网络终点。它存储着Service要连接到的实际后端Pod的IP地址和端口信息。

Endpoint对象主要有两个作用:

  1. 服务发现:Endpoints对象记录了与Service关联的所有后端Pod的网络地址信息。
  2. 负载均衡:Endpoints对象中可以包含多个后端Pod的IP地址和端口。当请求到达Service时,Kubernetes会将请求按照负载均衡算法分发到不同的后端Pod上,从而平衡流量负载。

kube-proxy是什么

kube-proxy是Kubernetes集群中的一个组件,它负责实现Service的网络代理和负载均衡功能。

kube-proxy运行在每个节点上,并监听Kubernetes API服务器上的Service和Endpoint对象的变化。它会根据这些变化动态地更新节点上的网络规则,以确保流量能够正确地路由到后端Pod上。

主要功能包括:

  1. Service代理:kube-proxy会监视Kubernetes API中的Service对象,并为每个Service创建一个虚拟IP地址和端口。当请求到达该虚拟地址时,kube-proxy会将请求转发到后端Pod上,从而实现服务发现和代理功能。
  2. 负载均衡:当请求到达Service的虚拟地址时,kube-proxy会根据预定义的负载均衡算法选择其中一个后端Pod,然后将请求转发给该Pod。
  3. Endpoint监视:k当Endpoint发生变化时(例如,Pod的添加、删除或IP地址的更改),kube-proxy会相应地更新负载均衡器的配置,以确保流量能够正确地路由到新的后端Pod上。

deployment是什么

Deployment是一种资源对象,用于定义和管理Pod副本集。它是Kubernetes中最常用的控制器之一,用于实现应用程序的无缝部署、更新和回滚。

Deployment对象提供了一种声明式的方式来描述应用程序的期望状态,并由Kubernetes系统负责维护实际状态与期望状态的一致性。

通过Deployment,可以轻松地进行以下操作:

  1. 创建和管理Pod副本:Deployment根据定义的副本数量和Pod模板创建和管理一组Pod副本。Pod模板定义了每个副本的容器镜像、资源需求、环境变量等信息。
  2. 应用程序的无缝部署:通过修改Deployment对象的配置,可以实现应用程序的无缝部署。例如,可以通过增加副本数量来扩展应用程序,Kubernetes会自动创建新的Pod副本;反之,减少副本数量则会进行缩容。
  3. 应用程序的更新和回滚:通过修改Deployment的Pod模板或更新策略,可以实现应用程序的更新。Kubernetes会逐步替换旧版本的Pod副本,从而实现滚动更新。如果更新过程中出现问题,可以通过回滚操作将应用程序恢复到之前的版本。
  4. 健康检查和自愈能力:Deployment可以配置健康检查来监测Pod副本的运行状态,如果某个副本失败或不可用,Kubernetes会自动替换它,以确保应用程序的稳定性和可用性。

文章作者: Aiaa
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 Aiaa !
  目录