Kubernetes是当前企业级别容器管理中炙手可热的明星,从这一节开始我们就一起来学习下它。因为是基于容器的管理工具,所以学习K8s之前应该首先有容器相关的知识,例如docker。首先从k8s的基本介绍开始。
我是T型人小付,一位坚持终身学习的互联网从业者。喜欢我的博客欢迎在csdn上关注我,如果有问题欢迎在底下的评论区交流,谢谢。
Kubernetes的特点
顺便提一嘴,之所以kubernetes被称为k8s,单纯因为k和s之间有8个字符,没有别的深意。
之所以k8s能打败MESOS和Docker Swarm,达到现在在容器资源管理领域如日中天的状态,因为其有如下几个特点:
- 轻量。因为是通过编译型Go语言开发,k8s消耗的资源很小
- 开源。这个对于企业使用非常重要
- 弹性伸缩。互联网企业业务量上升下降非常迅速,所以资源的增删也必须要平滑,k8s可以做到
- 负载均衡。k8s自带IPVS负载均衡框架,不需要再额外进行配置
Borg架构
K8s的前身是Google内部的Borg系统,两者架构类似,所以我们先来看看Borg的整体架构,如下
几个组件功能如下:
- BorgMaster - 相当于包工头,不主动干活,主要是管理下面真正干活的Borglet
- Borglet - 相当于工人,真正干活的
- borgcfg/clt/web browser - 几种访问Borg的方式
- scheduler - 任务分发者
仔细观察这个架构会发现有下面这些特点:
- 凡是需要高可用的节点,子节点个数都是奇数(3/5/7),这是便于以后的投票考虑的,例如上面的BorgMaster
- scheduler并没有直接和任务接收者Borglet通信,而是将任务信息存储在键值对数据库Paxos中,Borglet去数据库中查看是否有自己的任务
Kubernetes架构
下面再看k8s的架构就比较好理解了
k8s和Borg的架构还是有一些区别的
- 负责调度的scheduler并没有直接和数据库etcd通信了,而是改为和API Server通信,再由API Server和etcd通信
- 需要注意,按照图中的方式,master是没有参与具体工作的。如果配置master也做为工作节点之一,那么master中也会有kubelet和kube-proxy
Master
API server做为所有交互的统一入口,是非常繁忙的,不过好在其他组件往往有自己的本地缓存。后面我们会详细来看官方是如何给API server来减压的。
Master的controller是replication controller,用来确保Pod副本的数量一直是符合预期的,动态剔除坏掉的并自动补充新的。这里之所以说预期,是因为如果物理机器性能受限的话可能无法承载足够的Pod。
scheduler负责接受任务,并选择合适的节点去分配任务。
ETCD因为比较重要,下面单独说。
ETCD
etcd这个名字来源于etc,一个linux系统中存储配置文件的目录名字,加上d,表示distributed。etcd 是 CoreOS 团队于 2013 年 6 月发起的开源项目,它的目标是构建一个高可用的分布式键值(key-value)数据库,基于 Go 语言实现。我们知道,在分布式系统中,各种服务的配置信息的管理分享,服务的发现是一个很基本同时也是很重要的问题。CoreOS 项目就希望基于 etcd 来解决这一问题。
需要说明的是,etcd有v2版本和v3版本,v2版本将数据存储于内存中,v3版本可以将数据持久化在硬盘里面。在k8s v1.11之前只支持v2版本,v1.11之后弃用了v2版本,只能用v3版本。所以如果k8s集群版本比较旧,需要注意及时对etcd数据进行备份。
详细的etcd单独的教程可以参考这里。
Worker Node
每个node必须要安装3个组件
- kubelet
- kube-proxy
- 容器引擎,例如docker
kubelet负责和docker沟通,来操作和管理容器的生命周期。kube-proxy会操作防火墙,例如iptables,来实现pod与pod之间的沟通,以及pod与外界的沟通。
一些插件
下面是一些为了更加丰富k8s功能而加入的常用插件,以后我们也会一个个去了解
- CoreDNS
CoreDNS,顾名思义是用来给集群中的各种服务提供域名和IP对应关系的
- Dashboard
Dashboard,给k8s集群提供一个BS结构的访问体系
- Ingress Controller
官方只提供了四层代理,而Ingress Controller为我们提供了七层代理
- Federation
提供一个可以跨集群中心多k8s统一管理功能
- Prometheus
提供k8s的监控能力
- ELK
提供k8s集群日志统一分析平台