写在前面
自从在生产环境引入容器以后,目前直观感受最大的两个优点:
- 部署快速,移动、扩展便捷。
- 节省了15%左右的硬件资源。
随着线上容器数量的增多,也遇到了管理工作量加大的情况,便出现了前文的DockerSwarm的使用调研以及portainer工具的引入,在管理难度上的确减轻很多。
但是容器管理的精髓:自动完成服务的部署、更新、卸载和扩容、缩容等,DockerSwarm并没有提供。包括未来想进行服务基础设施和应用分离,并且从现有的基于springcloud的Java语言微服务转向语言无关的云原生微服务的落地等等目标都指向了Kubernetes。接下来的主要学习方向也放在这里,探索云原生的生态链,一边学习一边总结。
关于Kubernetes的学习思路如下:
- 首先了解大概
- 实操部署集群
- 深入研究原理,阅读相关书籍
Kubernetes是什么
Kubernetes 是谷歌开源的容器集群管理系统,是 Google 多年大规模容器管理技术 Borg 的开源版本,官方称其是:
Kubernetes is an open source system for managing containerized applications across multiple hosts. It provides basic mechanisms for deployment, maintenance, and scaling of applications.
用于自动部署、扩展和管理“容器化(containerized)应用程序”的开源系统。
主要功能包括:
- 基于容器的应用部署、维护和滚动升级
- 负载均衡和服务发现
- 跨机器和跨地区的集群调度
- 自动伸缩
- 无状态服务和有状态服务
- 广泛的 Volume 支持
- 插件机制保证扩展性
Kubernetes架构
整体架构
下图清晰表明了Kubernetes的架构设计以及组件之间的通信协议。
图中一些协议名称后续再深究,暂时先了解大概。
下面是更抽象的一个视图:
Kubernetes是属于主从设备模型(Master-Slave 架构),在 Kubernetes 中,主节点一般被称为Master,而从节点则被称为Node。
Master 和 Node 是分别安装了 Kubernetes 的 Master 组件 和 Node 组件的实体服务器,每个 Node 都对应了一台实体服务器(虽然 Master 可以和其中一个 Node 安装在同一台服务器,但是建议 Master 单独部署),所有 Master 和 Node 组成了 Kubernetes 集群,同一个集群可能存在多个 Master 和 Node,满足高可用诉求。
Master节点架构
Master节点主要职责包括:
- 集群的“大脑”,负责管理所有节点(Node)。
- 负责调度Pod在哪些节点上运行。
- 负责控制集群运行过程中的所有状态。
Master组件主要包括:
API Server
又叫kube-apiserver,kube-apiserver 是 Kubernetes 最重要的核心组件之一,主要提供以下的功能
- 提供集群管理的 REST API 接口,包括认证授权、数据校验以及集群状态变更等
- 提供其他模块之间的数据交互和通信的枢纽(其他模块通过 API Server 查询或修改数据,只有 API Server 才直接操作 etcd)
Scheduler
kube-scheduler 负责分配调度 Pod 到集群内的节点上,它监听 kube-apiserver,查询还未分配 Node 的 Pod,然后根据调度策略为这些 Pod 分配节点(更新 Pod 的
NodeName
字段)。Controller Manager
Controller Manager 由 kube-controller-manager 和 cloud-controller-manager 组成,是 Kubernetes 的大脑,它通过 apiserver 监控整个集群的状态,并确保集群处于预期的工作状态。
Controller Manager 有很多具体的 Controller,例如:Node Controller、Replication Controller、Endpoints Controller、Service Account and Token Controllers、Service Controller、Volume Controller等等。
etcd
etcd 是 CoreOS 基于 Raft 开发的分布式 key-value 存储,可用于服务发现、共享配置以及一致性保障(如数据库选主、分布式锁等)
etcd 存储了 Kubernetes 的关键配置和用户配置,Kubernetes 中仅 API Server 才具备读写权限,其他组件必须通过 API Server 的接口才能读写数据(见Kubernetes Works Like an Operating System)。
Node节点架构
本图来自HOW DO APPLICATIONS RUN ON KUBERNETES
Node节点主要职责包括:
- 负责管理所有容器(Container)。
- 负责监控/上报所有Pod的运行状态。
Node节点主要组件包括:
kubelet
每个Node节点上都运行一个 Kubelet 服务进程,默认监听 10250 端口,接收并执行 Master 发来的指令,管理 Pod 及 Pod 中的容器。每个 Kubelet 进程会在 API Server 上注册所在Node节点的信息,定期向 Master 节点汇报该节点的资源使用情况,并通过 cAdvisor 监控节点和容器的资源。
kube-proxy
每台机器上都运行一个 kube-proxy 服务,它监听 API server 中 service 和 endpoint 的变化情况,并通过 iptables 等来为服务配置负载均衡(仅支持 TCP 和 UDP)。
Container Runtime
即安装了容器化所需的软件环境确保容器化程序能够跑起来,比如 Docker Engine。
Logging Layer
Logging Layer 负责采集 Node 上所有服务的 CPU、内存、磁盘、网络等监控项信息。
Add-Ons:
Kubernetes 管理运维 Node 的插件组件, 例如:
- CoreDNS负责为整个集群提供DNS服务
- Ingress Controller为服务提供外网入口
- Prometheus提供资源监控
- Dashboard提供GUI
- Federation提供跨可用区的集群
Kubernates 设计理念
这部分也就是先了解一下,Kubernetes 设计理念和功能其实就是一个类似 Linux 的分层架构,如下图所示:
- 核心层:Kubernetes 最核心的功能,对外提供 API 构建高层的应用,对内提供插件式应用执行环境
- 应用层:部署(无状态应用、有状态应用、批处理任务、集群应用等)和路由(服务发现、DNS 解析等)
- 管理层:系统度量(如基础设施、容器和网络的度量),自动化(如自动扩展、动态 Provision 等)以及策略管理(RBAC、Quota、PSP、NetworkPolicy 等)
- 接口层:kubectl 命令行工具、客户端 SDK 以及集群联邦
生态系统:在接口层之上的庞大容器集群管理调度的生态系统,可以划分为两个范畴
- Kubernetes 外部:日志、监控、配置管理、CI、CD、Workflow、FaaS、OTS 应用、ChatOps 等
- Kubernetes 内部:CRI、CNI、CVI、镜像仓库、Cloud Provider、集群自身的配置和管理等
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。