前言:2019年已经过去了,在2019年阿里号称双11全面上云,为什么要上云?这你得问马云,开个玩笑...

因为k8s的加持,让云发挥了更大价值,k8s的提供的弹性伸缩,使得云资源得到充分利用,目前全球三大云全部都支持k8s,加上k8s本身就是谷歌的亲儿子,在这样的背景下,k8s越来越流行,作为一名开发,学习k8s迫在眉睫,所以我开始上路了,你呢?


1.什么是k8s?

了解k8s是什么之前,需要先了解docker,docker我就不多说了,没基础的自己恶补。如果说是微服务让docker火了,那么docker则让k8s火了一把,k8s是由谷歌开源的一款容器集群管理系统,可以实现容器的自动化部署,自动扩容,缩容,维护,监控等功能。

在大型的系统中,背后可能有成千上万个实例在运行,假设这些实例都是运行在docker容器中,实际上也几乎都是,这么多容器势必会有一些容器在某些时间段是空闲的,也有些是挂掉的,如果依靠人肉运维去监控和管理这些容器,枯燥又烧钱。在像双11这样的场景下,由于临时增加了很多实例来支撑超大流量,但双11过后这些实例资源就空置了,造成大量资源浪费,还有一些秒杀场景,可能在极短时间内涌入大量流量,对服务器造成冲击,有没有办法能在大流量的时候自动增加一些实例,在流量减少后自动下掉一些实例,当然有,它就是k8s,它的出现让阿里云更具有价值了,阿里云有丰富的服务器资源,支撑着众多企业的服务,在大部分场景下,不可能所有企业都在同一时刻流量洪峰,k8s可以让这些企业来共享这服务器资源,以弹性的方式伸缩,实现共赢,可以类比医疗保险。

2.k8s能做什么?

通过k8s你可以:快速部署服务,快速扩展应用,无缝对接新应用,负载均衡,监控,自动伸缩,节省资源,优化硬件资源使用...总之应有尽有。

3.k8s架构

引用一张k8s官方的图,虽然比较不清晰,也比较难看懂,不过没关系,可以继续先往下看,看完组件再来看这张图就比较清晰了

 

4.k8s组件

k8s是基于主从架构的,其组件主要分为两大类,一类是Master组件,一类是Node节点组件,其余组件单独介绍,因为非常重要!

Master组件包括:kube-apiserver,ETCD,kube-controller-manager,cloud-controller-manager,kube-scheduler,addons,DNS,用户界面,容器资源监测,Cluster-level Logging.

Node组件包括: kubelet,kube-proxy,docker,RKT,supervisord,fluentd

组件有点多,虽然多k8s而言,以上组件几乎都是重要组件,但对开发同学而言,仅需要重点掌握其中几个组件,其它组件简单了解即可,下面我将核心组件重点解释,并且加粗,非核心组件,简单了解,一笔带过~

 

Master组件:

 

kube-apiserver: 用于暴露k8s API,任何资源的请求/调用操作都是通过kube-apiserver提供的接口进行的.

ETCD:etcd是k8s默认的存储系统,存储所有集群数据,使用时需要为etcd数据提供备份计划.

kube-controller-manager:运行管理控制器,是集群中用来处理常规任务的后台线程.

cloud-controller-manager:云控制器是负责与底层云提供商的平台交互.

kube-scheduler:k8s的调度器,监视新创建但没有分配到Node的pod,为pod选择一个Node.

addons:插件,是实现集群pod和service功能的.

DNS:虽然不严格要求使用插件,但k8s集群都应该具有集群DNS,集群DNS是一个DNS服务器,能够为k8s service提供DNS记录.

用户界面:kube-ui,提供集群基础信息查看,是经常要被开发同学用到的.

容器资源监测:提供浏览器UI监控数据,也是经常要被用到的.

cluster-level logging:负责保存容器日志,查看/搜索容器日志.

 

Node组件:

 

kubelet:是主要的节点代理,它会监视已分配给节点的pod

kube-proxy:通过主机上维护网络规则并执行连接转发来实现k8s服务抽象.

docker:用于运行容器

RKT:作为docker工具的替代方案

supervisord:轻量级的监控系统,保障kubelet和docker运行

fluentd:是一个守护进程,提供cluster-level logging

 

5.核心概念

pod:pod是k8s中创建或部署的最小基本单位,一个Pod代表集群中正在运行的一个进程,一个pod可以由一个或多个容器组成,这些容器共同部署在一个节点上成为一个单元,一个Pod具有一个Ip,该ip在容器之间共享.

node:node节点是部署Pod的物理机(或虚拟机)

NameSpace:可以将物理上的cluster逻辑上划分成多个cluster,每个cluster就是一个Namespace,不同namespa里的资源是完全隔离的.

Label:标签,可以为pod打上Label标签,Label是以key-value形式存储的,打上标签之后,就可以通过命令快速筛选出同类pod

Annotation:与Label类似,也是以key-value形式存储的,主要用来记录一些信息,如发布的版本号,负责人之类的.

service:逻辑上的一组pod,service是对访问Pod策略的抽象层,可以把相同的pod划分进同一个service中,对外提供服务.因为Pod具有伸缩性,pod重启Ip发生改变后服务如何找到对应pod? 答案就是service,它通过label找到pod组,对调用方是无感知的,因为service的ip是固定的,service会在几个Pod中做负载均衡.

controller:k8s通过controller来管理Pod,controller里定义里Pod的部署特性,k8s提供了多种controller,包括deployment,replicaset,daemonset,job...来满足多种业务场景.

deployment:最常用的controller,可以管理Pod的多个副本,并确保pod按照期望的状态运行.

 

至此,k8s的基本概念就梳理完了,有了这些理论,再回头看3中的架构图,就比较容易懂了,看懂架构图之后,也就可以进入实战篇了,我会持续更新,实战k8s以及将k8s和rancher结合,届时会把链接附在这里.

由于本人水平有限,文中若有不正之处望留言指正.

参考文献:https://www.kubernetes.org.cn/doc-30 (k8s中文社区)

Logo

开源、云原生的融合云平台

更多推荐