核心组件
- etcd保存整个集群的状态
- apiserver提供资源操作的唯一入口,并提供认证、授权、访问控制、API注册和发现等机制
- controller manager负责维护集群的状态,比如故障检测、自动扩展、滚动更新等
- scheduler负责资源的调度,按照预定的调度策略将Pod调度到相应的机器上
- kubelet负责维护容器的生命周期,同时也负责Volume(CSI)和网络(CNI)的管理
- container runtime负责镜像管理以及Pod和容器的真正运行(CRI)
- kube-proxy负责为Service提供cluster内部的服务发现和负载均衡
常用插件
- CoreDNS负责为整个集群提供DNS服务
- Ingress Controller 为服务提供外网入口
- Prometheus 提供资源监控
- Dashboard 提供GUI
- Federation 提供跨可用区的集群
整体架构
Master架构
Node架构
分层架构
- 核心层:Kubernetes最核心的功能,对外提供API构建高层的应用,对内提供插件式应用执行环境
- 应用层:部署(有、无状态应用、批处理任务、集群应用等)和路由(服务发现、DNS解析等)、Service(部分位于应用层)
- 管理层:系统度量(如基础设施、容器和网络的度量),自动化以及策略管理(RBAC、Quota、PSP、NetworkPolicy等)、Service Mesh(部分位于管理层)
- 借口层:kubectl命令行工具、客户端SDK以及集群联邦
- 生态系统:在借口层之上的庞大容器集群管理调度的生态系统,可以话费为两个范畴
- Kubernetes外部:日志、监控、配置管理、CI/CD、Workflow、FaaS、OTS应用、ChatOps、GitOps、SecOps等
- Kubernetes内部:CRI、CNI、CSI、镜像仓库、Cloud Provide、集群自身的配置和管理等
Kubernetes 的核心技术概念和API对象
API对象是Kubernetes集群中的管理操作单元。
Kubernetes集群系统每支持一项新功能,引入一项新技术,一定会引入对应的API对象。
API对象的三大类属性:
- 元数据metadata:用来标识API对象,每个对象至少有3个元数据
- namespace
- name
- uid
- 规范spec:描述用户期望Kubernetes集群中的分布式系统达到的理想状态
- 状态status:系统实际当前达到的状态
Kubernetes中所有的配置都是通过API对象的spec去设置的,也就是用户通过配置系统的理想状态来改变系统
即所有的操作都是声明式而不是命令式
Pod
Pod 是 Kubernetes 集群中所有业务类型的基础,可以看作运行在 Kubernetes 集群中的小机器人,不同类型的业务就需要不同类型的小机器人去执行。目前 Kubernetes 中的业务主要可以分为长期伺服型(long-running)、批处理型(batch)、节点后台支撑型(node-daemon)和有状态应用型(stateful application);分别对应的小机器人控制器为 Deployment、Job、DaemonSet 和 StatefulSet。
Pod 是在 Kubernetes 集群中运行部署应用或服务的最小单元,它是可以支持多容器的。Pod 的设计理念是支持多个容器在一个 Pod 中共享网络地址和文件系统,可以通过进程间通信和文件共享这种简单高效的方式组合完成服务
RC:副本控制器
RS:副本集
Node:节点
是所有Pod运行所在的工作主机,上面要运行kubelet管理节点上运行的容器
密钥对象(Secret)
明文信息存储为Secret对象,在配置文件中通过Secret对象引用敏感信息
用户账户和服务账户
用户帐户对应的是人的身份,人的身份与服务的 namespace 无关,所以用户账户是跨 namespace 的;
而服务帐户对应的是一个运行中程序的身份,与特定 namespace 是相关的。
namespace
docker中的namespace
在容器内运行ps,默认会显示pid为1,从操作上来说,我们并没有脱离本身的系统,只是运行了一个名为docker的软件,为什么在软件中执行ps命令会显示进程pid为1,而不是这个docker软件本身的pid,比如100
主要是因为Linux的Namespace机制,在Linux中创建线程的系统调用是clone()
这个系统调用会创建一个新进程,并返回它的PID,其中的可选参数CLONE_NEWPID参数如果使用,则心创建的这个进程会认为自己在一个新的进程空间,也就是认为自己的pid为1
通过这种方式从挂载、网络、用户、设备之类的方向让这个进程认为自己在一个全新的空间中,从而实现与宿主机隔离
所以,Docker项目帮助用户启动的还是原来的应用进程,不过在创建这些进程时,Docker为他们加上了各种Namespace参数,让它们以为自己是一个独立的网络设备,也就是容器。
命名空间为 Kubernetes 集群提供虚拟的隔离作用。
Kubernetes 集群初始有两个命名空间,分别是默认命名空间 default 和系统命名空间 kube-system。
除此以外,管理员可以可以创建新的命名空间满足需要。