一、前言
从本周开始以后尝试开始每周两更,本篇原计划是Docker多机网路,该篇文章有些卡文,所以先更新篇Kubernetes文章,关于Docker系列文章后面应该就剩下两篇了,等后续Kubernetes使用篇讲完以后,再开始做一些Docker相关深层次思考。
Docker系列文章:
- 为什么要学习Docker
- Docker基本概念
- Docker镜像基本原理
- Docker容器数据卷
- Dockerfile
- Docker单机网络上
- Docker单机网络下
- Docker单机网络实战
- Docker隔离技术
- Docker限制
- Docker Compose
二、什么是Kubernetes
Kubernetes是谷歌十几年来大规模容器实践的成果,是谷歌Brog的开源版本。Google 每周会启用超过 20 亿个容器——全都由内部平台 Borg 支撑。Borg 是 Kubernetes 的前身,汲取了Brog的经验和教训,所以Kubernetes以开源,就迅速称霸容器领域。
Kubernetes是一个全新基于容器技术的分布式架构方案,它可以帮助用户省去应用容器化过程的许多手动部署和扩展操作。也就是说,您可以将运行容器的多组主机聚集在一起,由 Kubernetes 帮助您轻松高效地管理这些集群。而且,这些集群可跨公共云、私有云或混合云部署主机。因此,对于要求快速扩展的云原生应用而言,Kubernetes 是优秀的托管平台。
Kubernetes是一个开放平台,它不局限于任何语言,不限制任何编程接口。无论用啥语言编写的服务,都可以被映射为Kubernetes的服务,并且通过标准的TCP通信协议进行交互。Kubernetes是一种更高层次的抽象,对编程的语言、框架、中间件没有任何浸入,现有的系统和平台很容器可以迁移到Kubernetes平台上。
Kubernetes是一个完备的分布式系统支撑平台。Kubernetes具有完善的集群管理能力,包含服务的注册、服务发现、负责均衡、故障发现、服务滚动升级、在线扩容以及多粒度的资源配额管理等。同时Kubernetes提供的完善的管理工具,这些工具覆盖了整个软件生命周期。
总结一下,Kubernetes是一个具有优秀背景的、全新的基于容器技术的分布式架构解决方案,并且是一个一站式的完备的分布式系统开发和支撑平台。
三、Kubernetes核心概念介绍
Kubernetes的总架构图
img
Kubernetes核心组件介绍
Master
kube-apiserver
kube-apiserver 是 Kubernetes 最重要的核心组件之一,kube-apiserver在Kubernetes 集群中扮演着通信枢纽的角色。kube-apiserver不仅负责和 etcd 交互,并切对外提供统一的API调用入口, 所有的交互都是kube-apiserver为核心的, kube-apiserver提供了资源操作的唯一入口,并提供认证、授权、访问控制、API 注册和发现等机制等功能;
kube-controller-manager
kube-controller-manager 是Kubernetes 集群的大总管,负责集群内 Node、Namespace、Service、Token、Replication 等资源对象的管理,使集群内的资源对象维持在预期的工作状态。每一个 Controller 通过kube-apiserver提供的 Restful 接口实时监控集群内每个资源对象的状态,当发生故障,导致资源对象的工作状态发生变化,就进行干预,尝试将资源对象从当前状态恢复为预期的工作状态。常见的 Controller 有 Namespace Controller、Node Controller、Service Controller、ServiceAccount Controller、Token Controller、ResourceQuote Controller、Replication Controller等。
kube-scheduler
kube-scheduler负责对集群内部的资源进行调度,相当于“调度室”。接收来自kube-apiserver创建Pods的任务,收到任务后它会检索出所有符合该Pod要求的Node节点(通过预选策略和优选策略),开始执行Pod调度逻辑。调度成功后将Pod绑定到目标节点上。
Etcd
Etcd在Kubernetes中是用来存放数据并通知变动的,Kubernetes中把关键数据都存放在Etcd中,在Kubernetes中,数据是随时发生变化的,比如说用户提交了新任务、增加了新的Node、容器死掉了等等,都会触发状态数据的变更。状态数据变更之后,Master上的kube-scheduler和kube-controller-manager,就会重新发起变更,这些变化,都需要及时地通知给每个组件。Etcd有一个特征,可以在调用它的api中,监听api的数据,一旦数据发生变化,就会收到通知。Kubernetes利用这个特征,当节点消失或配置有变动时,Etcd会第一时间发现,就会告知每个订阅过的组件,这个时候发生变化组件可以知道自己应该做什么。对于kube-scheduler和kube-controller-manager只需要把最新的数据写入到Etcd中就可以了,不需要再次去发起调用。
img
Node
kubelet
在Kubernetes集群中,每个Node节点都会启动kubelet进程,用来处理Master节点下发到本节点的任务,管理Pod和其中的容器。kubelet会在kube-apiserver上注册节点信息,定期向Master汇报节点资源使用情况,并通过cAdvisor监控容器和节点资源。可以把kubelet理解成Node上的Pod管家。
kube-proxy
在Kubernetes集群中,每个Node节点上都会部署kube-proxy,kube-proxy 会作为守护进程跑在每个节点上通过监听着Etcd中关于Pod的最新状态,一旦检查到一个Pod资源发生变动,kube-proxy 就立即将这些变动,反应在iptables 或 ipvs规则中,当后续再有请求发到Service时,Service可以通过ipvs最新的规则将请求的分发到Pod上,实现Service到Pod的请求路由和转发,从而实现Kubernetes层级的虚拟网络转发。
container
在Kubernetes集群中,每个Node节点都会存在container。container负责本机容器的管理和创建,目前最常采用的就是Docker。