开始读书时间 2020.07.01
第1章 Kubernetes入门
1.1 Kubernetes是什么
1.它是一个全新的基于容器技术的分布式架构领先方案。
2.是谷歌严格保密十几年的秘密武器—Borg的一个开源版本。
3.Borg是谷歌的一个久负盛名的内部使用的大规模集群管理系统,它基于容器技术,目的是实现资源管理的自动化,以及跨多个数据中心的资源利用率的最大化。
4.使用Kubernetes提供的解决方案,不仅节省了不少于30%的开发成本,还可以将精力更加集中于业务本身,而且由于Kubernetes提供了强大的自动化机制,所以系统后期的运维难度和运维成本大幅度降低。
5.是一个开放的开发平台。它不局限于任何一种语言,没有限定任何编程接口,不论是用Java、Go、C++还是用Python编写的服务,都可以被映射为Kubernetes的Service(服务),并通过标准的TCP通信协议进行交互。此外,Kubernetes平台对现有的编程语言、编程框架、中间件没有任何侵入性,因此现有的系统也很容易改造升级并迁移到Kubernetes平台上。
6.是一个完备的分布式系统支撑平台。Kubernetes具有完备的集群管理能力,包括多层次的安全防护和准入机制、多租户应用支撑能力、透明的服务注册和服务发现机制、内建的智能负载均衡器、强大的故障发现和自我修复能力、服务滚动升级和在线扩容能力、可扩展的资源自动调度机制,以及多粒度的资源配额管理能力。
7.Kubernetes提供了完善的管理工具,这些工具涵盖了包括开发、部署测试、运维监控在内的各个环节。
8.总结:Kubernetes是一个全新的基于容器技术的分布式架构解决方案,并且是一个一站式的完备的分布式系统开发和支撑平台。
Kubernetes基础知识
kubernetes集群是基于Socket通信方式通过Service服务对外提供服务,而对内真正运行服务的容器叫做pod。
Service是分布式集群架构的核心,一个Service对象拥有如下关键特征。
- 拥有唯一指定的名称(比如mysql-server)。
- 能够提供某种远程服务能力。
- 被映射到提供这种服务能力的一组容器应用上。
Pod是kubernetes中运行的最小单元,是真正运行的服务,但pod是变动的(ip变,运行的节点变,数量变)
Service一旦创建就不会变动,是以 虚拟Cluster IP +ServicePort 形式对外提供服务
Service 和Pod 是通过Label关联的
在每个Pod中都运行着一个特殊的被称为Pause的容器,其他容器则为业务容器,这些业务容器共享Pause容器的网络栈和Volume挂载卷
组件架构上分为Master 和Node
Master:实现了整个集群的资源管理、Pod调度、弹性伸缩、安全控制、系统监控和纠错等管理功能,并且都是自动完成的
- kube-apiserver
- kube-controller-manager
- kubescheduler
Node:负责Pod的创建、启动、监控、重启、销毁,以及实现软件模式的负载均衡器。
- kube-proxy
- kubelet
在Kubernetes集群中,只需为需要扩容的Service关联的Pod创建一个RC(ReplicationController)
在一个RC定义文件中包括以下3个关键信息:
- 目标Pod的定义
- 目标Pod需要运行的副本数量(Replicas)
- 要监控的目标Pod的标签
1.2 为什么要用Kubernetes
1.节省技术成本、人员成本
2.融合微服务架构,提高系统的稳定性和快速迭代能力,开发者也可以自由选择开发技术。
3.Kubernetes的架构方案中完全屏蔽了底层网络的细节,无需考虑底层硬件拓扑问题,业务无需改变运行期的配置文件,无缝上云。
4.服务弹性扩容机制可以轻松应对服务高峰期,节省成本。
5.超强的横向扩容能力可以让我们的竞争力大大提升。
1.3 从一个简单的例子开始
1.3.1 环境准备
1.3.2 启动MySQL服务
1.3.3 启动Tomcat应用
1.3.4 通过浏览器访问网页
1.4 Kubernetes的基本概念和术语
可以采用YAML或JSON格式声明(定义或创建)一个Kubernetes资源对象,每个资源对象都有自己的特定语法格式(可以理解为数据库中一个特定的表),但随着Kubernetes版本的持续升级,一些资源对象会不断引入新的属性。
1.4.1 Master
Kubernetes里的Master指的是集群控制节点,负责整个集群的管理和控制,基本上Kubernetes的所有控制命令都发给它,Master通常会占据一个独立的服务器(高可用部署建议用3台服务器),主要原因是它太重要了,是整个集群的“首脑”,如果它宕机或者不可用,那么对集群内容器应用的管理都将失效。
在Master上运行着以下关键进程:
- Kubernetes API Server(kube-apiserver):
提供了HTTPRest接口的关键服务进程,是Kubernetes里所有资源的增、删、改、查等操作的唯一入口,也是集群控制的入口进程。
- Kubernetes ControllerManager(kube-controller-manager):
Kubernetes里所有资源对象的自动化控制中心,可以将其理解为资源对象的“大总管”。
- KubernetesScheduler(kube-scheduler):
负责资源调度(Pod调度)的进程,相当于公交公司的“调度室”。
另外,在Master上通常还需要部署etcd服务,因为Kubernetes里的所有资源对象的数据都被保存在etcd中。
1.4.2 Node
除了Master,Kubernetes集群中的其他机器被称为Node。Node是Kubernetes集群中的工作负载节点,每个Node都会被Master分配一些工作负载(Docker容器),当某个Node宕机时,其上的工作负载会被Master自动转移到其他节点上。
在每个Node上都运行着以下关键进程:
- kubelet
负责Pod对应的容器的创建、启停等任务,同时与Master密切协作,实现集群管理的基本功能。
- kube-proxy
实现KubernetesService的通信与负载均衡机制的重要组件。
- DockerEngine(docker)
Docker引擎,负责本机的容器创建和管理工作。
1.正确安装、配置和启动了上述关键进程的节点可以在运行期间动态增加到Kubernetes集群中
2.默认情况下kubelet会向Master注册自己,定时向Master汇报自身的情报,例如操作系统、Docker版本、机器的CPU和内存情况,以及当前有哪些Pod在运行等
3.Master获知每个Node的资源使用情况后,会实现高效均衡的资源调度策略(多资源会增加pod,少资源会减少pod)
4.某个Node在超过指定时间不上报信息时,Master会把它判定为“失联”,Node的状态被标记为不可用(Not Ready),该节点上的pod会转移到其它运行正常的Node上。
5.查看集群中有多个个Node
# kubectl get nodes
6.查看某个Node的详细信息
# kubectl describe node <node_name>
1.4.3 Pod
Pod是Kubernetes最重要的基本概念,最小运行单元。
每个Pod都有一个特殊的被称为“根容器”的Pause容器。Pause容器对应的镜像属于Kubernetes平台的一部分,除了Pause容器,每个Pod还包含一个或多个紧密相关的用户业务容器。
Pod的组成
pod这样特殊组成结构的意义?(Pause容器存在的意义?)
- 引入业务无关并且不易死亡的Pause容器作为Pod的根容器,以它的状态代表整个容器组的状态,通过判定Pause容器状态来判定Pod容器是否存活
- Pod里的多个业务容器共享Pause容器的IP,共享Pause容器挂接的Volume,这样既简化了密切关联的业务容器之间的通信问题,也很好地解决了它们之间的文件共享问题。
Kubernetes为每个Pod都分配了唯一的IP地址,称之为PodIP,一个Pod里的多个容器共享PodIP地址。
Kubernetes要求底层网络支持集群内任意两个Pod之间的TCP/IP直接通信,这通常采用虚拟二层网络技术来实现,例如Flannel、OpenvSwitch等,因此,在Kubernetes里,一个Pod里的容器与另外主机上的Pod容器能够直接通信。
Pod其实有两种类型:
- 普通的Pod
一旦被创建,就会被放入etcd中存储,进而被Master调度到某个Node上绑定(Binding),随后被kubelet进程实例化成一组相关的Docker容器并启动,之后kubelet会将该pod的情况定时汇报给Master
- 静态Pod(StaticPod)
没有被存放到Kubernetes的etcd存储中,而是被存放在某个具体的Node上的一个具体文件中,并且只有在此Node上启动、运行。
Pod、容器与Node的关系
Event是一个事件的记录,记录了事件的最早产生时间、最后重现时间、重复次数、发起者、类型,以及导致此事件的原因等众多信息。Event通常会被关联到某个具体的资源对象上,是排查故障的重要参考信息
1.4.4 Label
Label(标签)是Kubernetes系统中另外一个核心概念。一个Label是一个key=value的键值对,其中key与value由用户自己指定。Label可以被附加到各种资源对象上,例如Node、Pod、Service、RC等,一个资源对象可以定义任意数量的Label,同一个Label也可以被添加到任意数量的资源对象上。Label通常在资源对象定义时确定,也可以在对象创建后动态添加或者删除。
可以通过给指定的资源对象捆绑一个或多个不同的Label来实现多维度的资源分组管理功能,以便灵活、方便地进行资源分配、调度、配置、部署等管理工作。例如,部署不同版本的应用到不同的环境中;监控和分析应用(日志记录、监控、告警)等。
常用Label示例:
- 版本标签:”release”:”stable”、”release”:”canary”。
- 环境标签:”environment”:”dev”、”environment”:”qa”、”environment”:”production”。
- 架构标签:”tier”:”frontend”、”tier”:”backend”、”tier”:”middleware”。
- 分区标签:”partition”:”customerA”、”partition”:”customerB”。
- 质量管控标签:”track”:”daily”、”track”:”weekly”。
Label相当于我们熟悉的“标签”。给某个资源对象定义一个Label,就相当于给它打了一个标签,随后可以通过LabelSelector(标签选择器)查询和筛选拥有某些Label的资源对象,Kubernetes通过这种方式实现了类似SQL的简单又通用的对象查询机制。
LabelSelector可以被类比为SQL语句中的where查询条件,例如,name=redis-slave这个LabelSelector作用于Pod时,可以被类比为select * from pod where pod’sname =‘redis-slave’这样的语句。
当前有两种LabelSelector表达式:基于等式的(Equality-based)和基于集合的(Set-based),
Equality-based 采用等式类表达式匹配标签,下面是一些具体的例子。
- name=redis-slave:匹配所有具有标签name=redis-slave的资源对象。
- env!=production:匹配所有不具有标签env=production的资源对象,比如env=test就是满足此条件的标签之一。
Set-based 使用集合操作类表达式匹配标签,下面是一些具体的例子。
- name in(redis-master,redis-slave):匹配所有具有标签name=redis-master或者name=redis-slave的资源对象。
- name notin(php-frontend):匹配所有不具有标签name=php-frontend的资源对象。
1.4.5 Replication Controller
RC声明某种Pod的副本数量在任意时刻都符合某个预期值,所以RC的定义包括如下
- Pod期待的副本数量
- 用于筛选目标Pod的Label Selector。
修改RC的副本数量来实现Pod的动态缩放(Scaling)
kubectl scale rc redis-slave --replicas=3
ReplicaSet,官方解释其为“下一代的RC”。ReplicaSet与RC当前的唯一区别是,Replica Sets支持基于集合的Labelselector(Set-based selector),而RC只支持基于等式的LabelSelector(equality-based selector),这使得ReplicaSet的功能更强。
ReplicaSet与Deployment这两个重要的资源对象逐步替代了之前RC的作用,是Kubernetes1.3里Pod自动扩容(伸缩)这个告警功能实现的基础,也将继续在Kubernetes未来的版本中发挥重要的作用。
总结ReplicaSet的一些特性与作用
- 在大多数情况下,通过定义一个RC实现Pod的创建及副本数量的自动控制。
- 在RC里包括完整的Pod定义模板。
- RC通过Label Selector机制实现对Pod副本的自动控制。
- 通过改变RC里的Pod副本数量,可以实现Pod的扩容或缩容。
- 通过改变RC里Pod模板中的镜像版本,可以实现Pod的滚动升级。
1.4.6 Deployment
Deployment是Kubernetes在1.2版本中引入的新概念,用于更好地解决Pod的编排问题。
Deployment的典型使用场景有以下几个:
- 创建一个Deployment对象来生成对应的ReplicaSet并完成Pod副本的创建。
- 检查Deployment的状态来看部署动作是否完成(Pod副本数量是否达到预期的值)。
- 更新Deployment以创建新的Pod(比如镜像升级)。
- 如果当前Deployment不稳定,则回滚到一个早先的Deployment版本。
- 暂停Deployment以便于一次性修改多个PodTemplateSpec的配置项,之后再恢复Deployment,进行新的发布。
- 扩展Deployment以应对高负载。
- 查看Deployment的状态,以此作为发布是否成功的指标。
- 清理不再需要的旧版本ReplicaSets。
查看Deployment的信息:
kubect get deployment
DESIRED:Pod副本数量的期望值,即在Deployment里定义的Replica。
CURRENT:当前Replica的值,实际上是Deployment创建的ReplicaSet里的Replica值,这个值不断增加,直到达到DESIRED为止,表明整个部署过程完成。
UP-TO-DATE:最新版本的Pod的副本数量,用于指示在滚动升级的过程中,有多少个Pod副本已经成功升级。
AVAILABLE:当前集群中可用的Pod副本数量,即集群中当前存活的Pod数量。