🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
### 1、Kubernetes优势 ● 自动装箱,水平扩展,自我修复 ● 服务发现和负载均衡 ● 自动发布(默认滚动发布模式)和回滚 ● 集中化配置管理和密钥管理 ● 存储编排 ● 任务批处理运行 ### 2、Kubernetes快速入门概念 **四组基本概念 ** ➢ Pod/Pod控制器 ➢ Name/Namespace ➢ Label/Label选择器 ➢ Service/Ingress ➢ **Pod ** ``` ● Pod是K8S里能够被运行的最小的逻辑单元(原子单元),不是容器 ● 1个Pod里面可以运行多个容器,容器与容器之间它们共享UTS+NET+IPC名称空间 , 只隔离PID+MOUNT+USER 。容器有6个隔离空间(UTS+NET+IPC+PID+MOUNT+USER) ● 可以把Pod理解成豌豆荚,而同一Pod内的每个容器理解成是一颗颗豌豆 ● 一个Pod里运行多个容器,又叫:边车( SideCar)模式 ``` ➢** Pod控制器 ** ``` ● Pod控制器是Pod启动的一种模板,用来保证在K8S里启动的Pod 应始终按照人们的预期运行(副本数、生命周期、健康状态检查... ) Pod可以在k8s里面单独启动,不需要任何Pod控制器管控,启动Pod ● K8S内提供了众多的Pod控制器,常用的有以下几种: ● Deployment 部署 ● DaemonSet 要求我们每个运算单位都启动一份 ● ReplicaSet ReplicaSet 不直接对外提供服务,Deployment 管理ReplicaSet,ReplicaSet管理Pod,进而提供服务 ● StatefulSet 管理有状态应用的 Pod控制器 ● Job 管理任务 ● Cronjob 管理定时任务 ``` ➢ **Name** ``` ● 由于K8S内部,使用“资源”来定义每一种逻辑概念(功能),故每种“资源”, 都应该有自己的"名称”,每一种功能我们都叫做资源,每一种功能的实现都叫做资源的实例化 ● 资源一共有5个维度的信息,每一种都有,“资源”有api版本( apiVersion )、类别( kind )、元数据( metadata )、定义清单( spec)、状态( status )(集群自己生成的,不需要人工定义)等配置信息 ● "名称”通常定义在‘ '资源”的“元数据”信息里, ``` ➢** Namespace ** ``` ● 随着项目增多、人员增加、集群规模的扩大,需要一种能够隔离K8S内部各种“资源”的方法,这就是名称空间,通过名称空间各种资源进行分组 ● 名称空间可以理解为K8S内部的虚拟集群组 ● 不同名称空间内的“资源”, 名称可以相同,相同名称空间内的同种"资源”,"名称” 不能相同,重名不重名 ● 合理的使用K8S的名称空间,使得集群管理员能够更好的对交付到K8S里的服务进行分类管理和浏览 ● K8S里默认存在的名称空间有: default、kube-system、 kube-public ● 查询K8S里特定“资源”要带上相应的名称空间 ``` ➢** Label ** ``` ● 标签是k8s特色的管理方式,便于分类管理资源对象。 ● 一个标签可以对应多个资源,一个资源也可以有多个标签,它们是多对多的关系。 ● 一个资源拥有多个标签,可以实现不同维度的管理。 ● 标签的组成: key=value 键值对,有效的标签值必须不超过63个字符,并且必须为空或以字母数字字符([a-z0-9A-Z]),带破折号(-)、下划线(Uu)、点(.),和字母数字 ● 与标签类似的,还有一-种“注解”( annotations ) 标 , 注解没有要求 ``` ➢ **Label选择器 ** ``` ● 给资源打上标签后,可以使用标签选择器过滤指定的标签 ● 标签选择器目前有两个:基于等值关系(等于、不等于)和基于集合关系(属于、不属于、存在) ● 许多资源支持内嵌标签选择器字段 ● matchl abels ● matchExpressions ``` ➢ **Service 集群网络 ** ``` ● 在K8S的世界里,虽然每个Pod都会被分配一个单独的P地址 ,但这个IP地址会随着Pod的销毁而消失。 Pod有生命周期的,不定时的启动,扩容,销毁,迁移。流量如何调度,Service 起到,无论你这组 pod怎么掉度、销毁等等,对外提供服务的接口统一,Service会有一个相对独立的接口, ● Service (服务)就是用来解决这个问题的核心概念 ● 一个Service可以看作一 -组提供相同服务的Pod的对外访问接口 ● Service作用于哪些Pod是通过标签选择器来定义 的 ``` ➢ **Ingress ** ``` ● Ingress是K8S集群里1工作在OSI网络参考模型下,第7层的应用,对外暴露的接口 ● Service只能进行4流量调度, 表现形式是ip+ port ● Ingress则可以调度不同业务域、不同URL访问路径的业务流量 ``` ### 3、核心组件 ● 配置存储中心→etcd服务 状态、请求、集群资源情况等,也可以理解位Mysql ● 主控( master )节点 ● **kube-apiserver服务 ** 集群的大脑,所有组件通过kube-apiserver 通信枢纽功能 ``` ● aplserver: ● 提供了集群管理的REST API接口( 包括鉴权、数据校验及集群状态变更) ● 负责其他模块之间的数据交互,承担通信枢纽功能 ● 是资源配额控制的入口 ● 提供完备的集群安全机制 ``` ● **kube-controller-manager服务 ** ``` ● controller-manager : 管理控制器的控制器 需要高可用 ● 由一系列控制器组成,通过piserver监控整个集群的状态,并确保集群处于预期的工作状态 ● Node Controller 节点控制器 ● Deployment Controller Pod控制器 ● Service Controller server控制器 ● Volume Controller 卷控制器 ● Endpoint Controller 接入点控制器 ● Garbage Controller 垃圾回收控制器 ● Namespace Controller 名称空间资源配额 ● Job Controller 任务资源配额 ● Resource quta Controller 资源配额控制器 ``` ● ** kube-scheduler服务 ** ``` ● scheduler:调度器 ● 主要功能是接收调度pod到适合的运算节点上 有一个请求通过apiserver,apiserver告诉controller-manager 需要启动那些Pod, controller-manager 找到scheduler,他会按照要求模板到那个节点创建一系列Pod ● 预算策略( predict ) 最适合运行Pod点,拉取 ● 优选策略( priorities ) ``` #### 运算( node )节点 ● **kube-kubelet服务 ** ``` ● kubelet ● 简单地说, kubelet的主要功能就是定时从某个地方获取节点上pod的期望状态(运行什么容器、运行的副本数量网络或者存储如何配置等等) , 并调用对应的容器平台接口达到这个状态 ● 定时汇报当前节点的状态给apiserver,以供调度的时候使用 ● 镜像和容器的清理工作,保证节点上镜像不会占满磁盘空间,退出的容器不会占用太多资源 ``` ● **Kube-proxy服务 ** ``` ● kube- proxy ● 是K8S在每个节点上运行网络代理, service资源的载体 ● 建立了pod网络和集群网络的关系( clusterip >podip ) 把clusterip 跟podip关联起来 ● 常用三种流量调度模式 ● Userspace (废弃) 早期1.2 版本,Userspace调度节点网络、Pod网络、集群网络要用到大量的内核态跟用户态之间的转换,消耗资源大 ● Iptables (濒临废弃) 99%目前主流方法,nat表,nat映射,太多没办法维护 ● Ipvs(推荐) lvs开源,加入Linux 内核, ● 负责建立和删除包括更新调度规则、通知apiserver自 己的更新,或者从apiserver哪里获取其他kube-proxy的调度规则变化来更新自己的 一个集群中有若干节点,都起Kube-proxy,如何同步,通过apiserver找etcd ``` #### ● CLI客户端 命令行工具 ``` ● kubectl ● 核心附件 ● CNI网络插件> flannel/calico ● 服务发现用插件> coredns ● 服务暴露用插件> traefik ● GUI管理插件> Dashboard ``` #### 4、核心组件图,三条网络,节点网洛(宿主机网洛) ![](https://img.kancloud.cn/74/de/74dec8da2f77208075103b5908f096a5_1414x629.png) 5、部署架构图 ![](https://img.kancloud.cn/e3/a5/e3a5c6a772e89b091ae2210178485bbd_1211x761.png)