一个Kubernetes
集群,通常是由多个工作节点Worker Node
加上一个集群控制者Master
,以及集群状态存储系统etcd
组成。
Master Node
Master
节点主要由负责 API
服务的apiserver
、负责容器编排的controller-manager
、以及负责调度的scheduler
组成。整个集群的持久化数据,由apiserver
处理后,交由etcd
进行管理。
API server
负责Restful
风格的kubernetes API
,负责接收、响应、校验发入集群的所有REST
请求。Controller Manager
负责维护集群的状态,包括很多资源的控制器,是保证Kubernetes
声明式API
工作的大脑,比如故障检测、自动扩展、滚动更新等。Scheduler
负责管理集群内各节点的资源状态。创建Pod
时,根据合适的资源做出调度决策。在创建Pod
的Events
中可以看到,第一个Event
便是Schedule
。
1 | kubectl describe pod image-sign-deployment-59948dd446-8n8l7 |
Worker Node
在worker Node
中,最重要的则是kubelet,它所负责的是与容器运行时打交道(如docker项目)。他们交互所依赖的,是一个称作CRI
的远程调用接口,这个接口定义了容器运行时的各项核心操作。如启动一个容器所需的所有参数。
也正是因为CRI
的存在,kubernetes
并不关系用户部署的容器运行时是Docker
亦或是其它的(但默认的是Docker
),只要这个容器运行时能运行标准的镜像,它就能通过实现CRI
接入到Kubernetes
中。
具体的容器运行时,像Docker
则一般通过OCI
这个容器运行时规范,与底层的Linux
操作系统进行交互。即:将CRI
请求翻译成对Linux
系统的调用,操作系统的NameSpace
和CGroups
等。
此外,kubelet 还通过 gRPC 协议同一个叫作 Device Plugin 的插件进行交互。这个插件,是 Kubernetes
项目用来管理 GPU
等宿主机物理设备的主要组件,也是基于 Kubernetes 项目进行机器学习训练、高性能作业支持等工作必须关注的功能。
kubelet 的另一个重要功能,则是调用网络插件和存储插件为容器配置网络和持久化存储。这两个插件与 kubelet
进行交互的接口,分别是 CNI(Container Networking Interface)
和 CSI(Container Storage Interface)
。
而kube-proxy
,它所负责的是能够按需为Service
资源对象创建iptables
或ipvs
规则。从而捕获访问当前访问Service
的请求,将其转发至正确的Pod
对象
系统组件图
核心附件
kubernetes
还需要依赖一组称为“附件”的组件来提供完整的功能。这些组件通常由第三方提供,运行在kubernetes
集群上。
CoreDNS
在Kubernetes
集群中调度运行提供DNS
服务的Pod
,同一集群中的其他Pod
可使用此DNS
服务实现service name
到cluster IP
的解析 。DNS
服务是Kubernetes
赖以实现服务发现的核心组件之一,默认情况下只会创建一个DNS Pod
,在生产环境中我们需要对coredns
进行扩容。 有两种方式:1
2手动扩容 kubectl –namespace=kube-system scale deployment coredns –replicas=
使用 DNS Horizontal AutoscalerKubernetes Dashboard
: 一个Web UI
,用于管理kubernetes
集群中应用,以及集群自身。Ingress Controller
: 暂时没学到相关内容。之后再来补充。