Kubernetes介绍
# Kubernetes介绍
K8S即是一个容器编排工具,能将多个容器资源整合成一个大的资源集群,统一对外提供计算、存储等能力。一般集群分为两种类型:有中心节点的集群
和 无中心节点的集群
,而K8S则是有中心集群。
- 有中心节点的集群:如MySQL主从,一个主节点,其他节点与它进行同步。
- 无中心节点的集群:每一个节点都能接收请求进行路由,如Nginx集群,每个集群都能进行路由提供服务。
# Kubernetes特性
# 自动化
- 自动装箱:能够自动完成容器的部署。
- 自我修复:如果容器崩溃,控制器会自动拉起一个新容器。
- 自动水平扩展:当前容器资源不够用,会自动扩展集群,拉起一个新容器。
- 自动服务发现:通过标签进行匹配发现。
- 自动负载均衡:会自动将流量负载均衡到集群中的不同容器。
- 自动发布和回滚:可以自动实现滚动发布。
# 密钥和配置管理
- 可以通过外部组件(配置中心) 来管理容器的配置,通过API进行管理。
- 容器在启动时会通过网络来加载配置中心的配置。
# 存储编排
- 使容器可以根据需求创建适合大小的存储卷。
# 批量处理执行
# 编排工具
# 介绍
- 编排工具,即是批量管理工具。
# 应用编排工具
- 主要用来对多主机进行管理,因为多机集群的管理非常繁琐,所以我们可以借助应用编排工具,来实现方便的编排管理,如ansible工具。
# 容器化编排工具
- 主要用来对多容器进行管理,用来解决N多个容器的管理问题。
- 主流是使用kubernetes进行管理,但docker实际也有自带的编排工具docker compose等。
# DevOps介绍
# 介绍
DevOps在百科上的定义是一组过程、方法与系统的统称,用于促进开发、技术运营和质量保障部门之间的沟通、协作与整合。
我们一般的程序上线流程是:程序开发 -> 构建部署测试环境 -> 测试 -> 交付给目标 -> 部署线上环境,而以自动化的方式实现以上流程,就是DevOps,容器提供了DevOps(自动化) 落地的可能。
# 相关概念(CI/CD)
# CI:持续集成
- 程序员开发完代码提交到代码仓库。
- 构建工具自动的去拉取代码进行构建部署。
- 测试工具自动的在测试环境中对代码进行测试。
- 测试工具发现Bug则自动打回,通知程序员修复。
- 以上过程将不断循环,直到测试工具没有发现Bug为止。
- 以上过程的自动实现,就称之为持续集成。
# CD:持续交付
- 在持续集成的过程后,如果开发好的程序能够自动的打包到仓库、文件系统等,使可以被运维或者客户拿到,这个过程就是持续交付。
- 自动实现将测试通过的程序打包交付到目标手中,就是持续交付。
# CD:持续部署
- 自动实现将交付得到的程序部署到线上环境,这个过程就是持续部署。
# Kubernetes节点的角色
# 介绍
K8S集群中存在两种角色,也就是Master和Node,所以K8S实际是有中心节点的集群。
K8S中各组件间的通信使用HTTP/HTTPS协议。
# Master
用来接收客户端请求、管理工作节点等。
可以有一个或多个主节点,如果为了高可用则一般需要有三个。
Master节点中包含以下几个模块:
提示
Master节点默认是无法接受资源调度的,因为Master节点默认是有污点,在资源调度时不会选择有污点的节点进行调度,所以如果有特殊需求要搭建一台单节点的K8S集群,则需要通过命令将Master节点的污点去掉。
# Nodes (Worker)
用来提供资源、运行容器的节点等。
Node节点中包含以下几个模块:
# Pod介绍
# 概念
- Pod是K8S中最小调度的逻辑单元。
- 他实际相当于容器的外壳,一个Pod虽然可以运行多个容器,但是一般只会放一个主容器,除非是为了扩展主容器中的主程序的功能,才会运行其他辅助容器 (Sidecar模式)。
- 同一Pod内的容器共享同一个名称空间,也就意味着就是这些容器可以通过lo通信(127.0.0.1)。
- 同一Pod内的容器共享同一个存储卷。
# 管理方式
在K8S中对Pod有两种管理方式,一种是自主式管理的Pod,还有一种是控制器管理的Pod,我们主要使用控制器对Pod进行管理。
# 自主式管理的Pod
- 由调度器分配任务给Node启动后,如果Pod中的容器崩溃了,Node节点的kubelet服务会自动拉起一个新的Pod。
- 但如果Node故障了,这个Pod也就无法运行了,且它无法全局进行Pod管理。
# 控制器管理的Pod
# ReplicationController - 副本控制器
- 如果Pod副本集少了或不够用了,会自动添加Pod副本。如果多了,会自动移除Pod副本。
- 它还支持滚动更新和回滚,即便设置Pod副本集最多有2个,也允许在更新过程中临时超出。
- 会新添加一个新版本副本,然后再移除一个旧副本,然后再添加一个新版本副本,然后再移除一个旧副本,以此类推,最终实现全部副本的更新。
- 在执行回滚时,也是一样滚动回滚的过程。
# ReplicaSet - 副本集控制器
- 和ReplicationController功能基本一致,但是管理起来更加方便。
# Deployment - 用于管理无状态的Pod副本
- 当我们创建了Deployment之后,实际上也创建了ReplicaSet,所以说Deployment管理着 ReplicaSet。
- Deployment在ReplicaSet的基础上进行了功能的扩展,所以更加完善,比如它支持二级控制器:HPA - 水平Pod自动伸缩控制器。
- 比如:以整个集群为单位监控CPU使用率,如果各副本的CPU使用率加起来超过整个集群CPU资源的80%,则自动扩展Pod副本。
- 一般用来运行无状态服务(Stateless Service)
- 该服务运行的实例不会在本地存储需要持久化的数据,并且多个实例对于同一个请求响应的结果是完全一致的。这种方式适用于服务间相互没有依赖关系,如Web应用,在Deployment控制器停止掉其中的一个Pod不会对其他Pod造成影响。
# StatefulSet - 用于管理有状态的Pod副本
- 用来运行有状态服务(Stateful Service)
- 服务运行的实例需要在本地存储持久化数据,比如数据库或者多个实例之间有依赖拓扑关系,比如:主从关系、主备关系。如果停止掉依赖中的一个Pod,就会导致数据丢失或者集群崩溃。这种实例之间有不对等关系,以及实例对外部数据有依赖关系的应用,就被称为有状态应用。
- 用来运行有状态服务(Stateful Service)
# DaemonSet - 用于管理只有一个的Pod副本
- 该控制器在调度时,每个节点上最多只会运行一个Pod副本。
# Job/Cronjob
- 用于执行临时的任务,成功执行完就会被移除,如果执行过程中Pod副本挂掉,会重新执行。
# Label介绍
# 介绍
在K8S中,我们可以对每个资源定义一个或多个标签,定义标签是为了方便后续的资源管理,它是kv类型的数据。
比如:给Pod定义标签,方便后续筛选出想要的一个或一组Pod。
# 标签选择器
- Label Selector 用于根据资源的标签,选择出指定的资源。
- 比如:选择出想要的Pod等。
# Service介绍
# 介绍
- 它是存在于K8s中客户端和Pod之间、Pod和容器之间的中间层,用于服务发现、请求调度。Service的IP地址不会变、名称也不会变。
- 它是一个规则,并非某个实际运行的服务,它会生成一个不属于任何网卡的虚拟地址用于使用,所以它无法直接被外部网络访问,需要做转发才能被外部网络访问。
# 作用
- 它会代理客户端对Pod的访问请求,代理Pod对容器的访问请求:Service -> Pod -> Service -> 容器。
# 特点
- 它会通过Pod的标签来进行关联,因为Pod的主机名、IP地址等是会变化的。一旦Pod挂掉,Pod控制器会创建新Pod,创建之后,Service会立刻将其关联,并作为后端可用Pod之一。
- 它强依赖于K8S的DNS服务。
# K8S DNS介绍
K8s的DNS服务是一个架构级的Pod,该服务一般用于解析Service的地址,使可以通过名称来访问Service。
它支持动态创建、动态删除、动态变动。
- 比如:如果你手动修改了Service的地址,dns服务会自动触发,将DNS解析记录中的地址也修改。
# K8S共享存储介绍
各Master节点的数据,都需要共享存储到K8s的数据库中(etcd),因此该数据库也是K8s集群中的核心之一,所以需要做高可用,一般为三个节点。
它是一个键值对存储的数据库,同时也支持各种协调功能,比如Header选举功能等。
etcd节点间使用http协议通信,etcd向客户端提供服务时使用https协议通信。
# K8S网络模型
# 介绍
- K8S自身不提供网络管理,需要使用第三方组件来实现,K8S的网络模型要求每个集群要有如下3种网络。
- 节点网络 - 各Node间的网络
- 集群网络 - 各Service间的网络
- Pod网络 - 各Pod间的网络
- 访问顺序:节点网络 —> 集群网络 —> Pod网络
# K8S的网络通信方式
- 同一Pod内的多个容器间通信
- 使用lo进行本地通信 (127.0.0.1)
- 各Pod之间的通信
- 通过NAT转换到Service网络进行通信 (方便管理)
- Pod消息借助NAT将地址转换到Service网络中,然后发送到目标Pod
- 直接使用对方的地址进行通信 (不方便管理)
- 通过隧道实现叠加网络 (Overlay Network),需要集群中,无论Pod运行再哪个节点上,各Pod之间的地址都不应该冲突
- 通过NAT转换到Service网络进行通信 (方便管理)
# CNI容器网络接口
- 用于接入第三方网络组件的,如:flannel、calico、canel等,它可以用守护进程来运行,也可以部署在Pod上。
# 名称空间
- 该空间主要用来管理资源,给资源分组用的。