目录

一、什么是k8s?

二、将应用部署在容器集群上的好处在哪?

三、compose、swarm与kubernetes之间的比较

四、一个k8s集群的组成

五、k8s中service的作用

六、k8s中对pod中应用的健康检测机制

七、K8s中镜像的下载策略

八、k8s中创建和删除一个pod时的流程


一、什么是k8s?

Kubernetes 是用于自动部署,扩展和管理容器化应用程序的开源系统,它有一个庞大且快速增长的生态系统,社区活跃
提供的主要服务:应用暴露和负载均衡、存储编排、自动分配部署容器、自动修改容器、密钥和配置管理、自动完成装箱计算


一句话就是:k8s是一个用于容器编排的开源系统

二、将应用部署在容器集群上的好处在哪?

传统:物理机给应用分配资源有问题,比如会出现某个应用占用物理机的绝大多数资源,导致其他应用性能下降,如果应用分开部署在不同的物理机又会出现资源浪费并且维护物理机成本很高
虚拟化:启动慢,部署应用慢,不够轻量
容器:创建和部署应用快、可移植性好、物理资源利用效率和密度高、管理方便、扩展性好

三、compose、swarm与kubernetes之间的比较

首先是swrm和compose的比较:
Docker Swarm可以负责帮你启动容器,监控容器状态,如果容器的状态不正常它会帮你重新帮你启动一个新的容器,来提供服务,同时也提供服务之间的负载均衡,而这些东西Docker-Compose 是做不到的

其次是k8s和swarm的比较:
docker swarm 与kubernetes都是集群管理工具,一个是docker原生自带,一个是谷歌项目下的容器编排工具。k8s特别擅长大规模docker的管理。为了解决复杂场景下应用的部署,k8s的组件要比swarm多得多,即便似乎功能类似的组件,k8s很多时候都在场景支持上要优于swarm

四、一个k8s集群的组成

一个正常运行的k8s集群组成主要包括部署控制平面的主节点和工作节点。主节点主要是来管理整个集群的,例如当检测不满足部署的 replicas 字段时,会调度启动新的 pod,工作节点负责托管pod


控制平面组件有:
kube-apiserver: API 服务器是 Kubernetes 控制平面的前端,是资源操作的唯一入口。用于master和node之间的通信
etcd:是一个键值型数据库,保存 Kubernetes 所有集群数据的后台数据库。
kube-scheduler:主要功能是调度pod到节点上运行
kube-controller-manager:负责维护群集的状态,比如故障检测、自动扩展、滚动更新等;


工作节点:
Kubelet:负责维护容器的生命周期,管理节点上运行的pod
Kube-proxy:负责为Service提供集群内部的服务发现暴露和负载均衡功能
container-runtime:是负责管理运行容器的软件,比如docker
Pod:类似于共享命名空间和文件系统卷的一组容器,是k8s集群里面最小的单位

五、k8s中service的作用

让部署在k8s集群中的服务能让用户访问。尽管每个 Pod 都有一个唯一的 IP 地址,但是如果没有 Service ,这些 IP 不会暴露在集群外部。Service 允许应用程序接收流量。Service 也可以用在 ServiceSpec 标记type的方式暴露。


暴露服务的方式:

ClusterIP (默认) - 在集群的内部 IP 上公开 Service 。这种类型使得 Service 只能从集群内访问。
NodePort - 使用 NAT 在集群中每个选定 Node 的相同端口上公开 Service 。使用<NodeIP>:<NodePort> 从集群外部访问 Service。
LoadBalancer - 在当前云中创建一个外部负载均衡器(如果支持的话),并为 Service 分配一个固定的外部IP。
ExternalName - 通过返回带有该名称的 CNAME 记录,使用任意名称(由 spec 中的externalName指定)公开 Service。

六、k8s中对pod中应用的健康检测机制

K8s中对于pod资源对象的健康状态检测,提供了三类probe(探针)来执行对pod的健康监测:
1) livenessProbe探针
可以根据用户自定义规则来判定pod是否健康,如果livenessProbe探针探测到容器不健康,则kubelet会根据其重启策略来决定是否重启,如果一个容器不包含livenessProbe探针,则kubelet会认为容器的livenessProbe探针的返回值永远成功。
2) ReadinessProbe探针
同样是可以根据用户自定义规则来判断pod是否健康,如果探测失败,控制器会将此pod从对应service的endpoint列表中移除,从此不再将任何请求调度到此Pod上,直到下次探测成功。
3) startupProbe探针
启动检查机制,应用一些启动缓慢的业务,避免业务长时间启动而被上面两类探针kill掉,这个问题也可以换另一种方式解决,就是定义上面两类探针机制时,初始化时间定义的长一些即可

七、K8s中镜像的下载策略

K8s的镜像下载策略有三种:Always、Never、IFNotPresent;
Always:镜像标签为latest时,总是从指定的仓库中获取镜像;
Never:禁止从仓库中下载镜像,也就是说只能使用本地镜像;
IfNotPresent:仅当本地没有对应镜像时,才从目标仓库中下载。
默认的镜像下载策略是:当镜像标签是latest时,默认策略是Always;当镜像标签是自定义时(也就是标签不是latest),那么默认策略是IfNotPresent。


可通过命令“kubectl explain pod.spec.containers”来查看imagePullPolicy这行的解释。

八、k8s中创建和删除一个pod时的流程

创建:

1) 客户端提交Pod的配置信息(可以是yaml文件定义好的信息)到kube-apiserver;
2) Apiserver收到指令后,通知给controller-manager创建一个资源对象;
3) Controller-manager通过api-server将pod的配置信息存储到ETCD数据中心中;
4) Kube-scheduler检测到pod信息会开始调度预选,会先过滤掉不符合Pod资源配置要求的节点,然后开始调度调优,主要是挑选出更适合运行pod的节点,然后将pod的资源配置单发送到node节点上的kubelet组件上。
5) Kubelet根据scheduler发来的资源配置单运行pod,运行成功后,将pod的运行信息返回给scheduler,scheduler将返回的pod运行状况的信息存储到etcd数据中心。

删除:

Kube-apiserver会接受到用户的删除指令,默认有30秒时间等待优雅退出,超过30秒会被标记为死亡状态,此时Pod的状态Terminating,kubelet看到pod标记为Terminating就开始了关闭Pod的工作;
关闭流程如下:
1、 pod从service的endpoint列表中被移除;
2、 如果该pod定义了一个停止前的钩子,其会在pod内部被调用,停止钩子一般定义了如何优雅的结束进程;
3、 进程被发送TERM信号(kill -14)
4、 当超过优雅退出的时间后,Pod中的所有进程都会被发送SIGKILL信号(kill -9)。