k8s是介于应用服务和服务器之间的中间层,通过策略,协调和管理多个应用服务,只需要一个yaml文件配置,定义应用的部署顺序等信息,就能自动部署应用到各个服务器上,还可以实现服务器的自动重启,自动扩缩容
k8s架构原理
为了实现以上功能,k8s将服务器划分为两部分,控制平面(control plane)、工作结点(Node)
字面意思,控制平面控制工作结点,工作节点负责运行各个应用服务
控制平面内部组件
- API Server
通过k8s提供的API接口,就可以快捷地操作服务器资源 - Scheduler
调度器,负责找到cpu和内存资源充足的服务器,在该服务器上部署应用 - Controller Mannager
控制管理器,负责找到服务器后控制和关闭服务 - 存储层
保存上述功能产生的数据,目前使用的是etcd
Node内部组件
使用了k8s之后,只需要将服务代码打包成Container Image(容器镜像),就能一行命令将它部署。而容器镜像简单理解就是应用代码和系统环境的压缩包。
为了下载和部署容器镜像,Node中有一个Container runtime组件
每一个应用服务都可以认为是一个Container(容器),服务器通常情况下还有日志收集器Container或者监控收集器Container,多个Container共同组成一个Pod,Pod运行在Node上
k8s可以将Pod从一个Node调度到另一个Node,还可以以Pod为单位去重启和动态扩缩容。所以,**Pod是k8s中最小的调度单位
kubelet主要通过从Controller Manager接受命令来管理和监控Pod
Kube Proxy负责Node的网络通信功能,有了它,外部请求才能被转发到Pod内
Cluster
控制平面和Node共同组成了一个Cluster,也就是集群,同时,为了将集群内部的服务暴露给外部用户使用,我们一般还会部署一个入口控制器,比如 Ingress 控制器(比如 Nginx),它可以提供一个入口让外部用户访问集群内部服务
kubectl
kubectl是一个命令行工具,只要我们执行命令,kubectl内部就会调用k8s的API,而不需要我们自己写代码去调用k8s提供的API
k8s部署服务的过程
- 首先编写YAML文件,在里面定义Pod里用到了哪些镜像容器,占用了多少内存和CPU等信息
- 再使用kubectl命令行工具执行
kubectl apply -f xx.yaml
,kubectl就会读取和解析YAML文件,将解析后的对象通过API请求发送给Kubenetes控制平面内的API Server。 - API Server会根据要求,去世Scheduler通过etcd提供的数据寻找合适的Node。
- Controller Manager会通过API Server控制Node创建服务,Node内部的kubelet在收到命令后会开始基于Container runtime 组件去拉去镜像创建容器,最终完成Pod的创建
如何调用服务?
外部请求会先到达k8s集群的ingress控制器,然后请求会被转发到k8s内部的某个Node的Kube Proxy上,再找到对应的Pod,然后才是转发到内部容器中,处理结果原路返回。到此完成一次服务调用
参考:小白debug