课程名称:Kubernetes基础:开启云原生之门
课程章节: 全部
主讲老师:Tonybai
课程内容:
1. 云原生模式
- 随着容器技术的出现以及应用面临的外部环境的变化,云原生逐渐成为一种应用云化开发、部署和运行的主流方式
- 基础前提:应用的容器化和微服务化。容器作为,应用部署、运行和管理的基本单元;
- 核心:借助容器管理自动化平台进行动态编排和资源优化利用。
2. CNCF
为应用云安全地采用云原生模式提供了更稳、更快、更安全的解决方案,其核心是 Kubernetes。
- 从众多强大对手中脱颖而出,Kubernetes 为云原生模式下应用的部署、运行和管理提供了可移植的、云厂商无关的事实标准。
3. K8S
以 Google 内部容器编排管理平台 Borg 为原型的开源实现
- 一个容器编排管理平台
- 以 Pod(容器组)为基本的编排和调度单元以及声明式的对象配置模型(控制器、configmap、secrt 等)
- 资源配额与分配管理
- 健康检查、自愈、伸缩与滚动升级
- 一个微服务支撑平台
- 服务发现、服务编排与内部路由支持
- 服务快速不和自动负载均衡
- 提供对“有状态”服务的支持等
- 一个可移植的“云平台”
- 新一代应用云化的事实标准,成为面向云原生应用的新可移植层——云平台
- 为用户提供简单且一致的容器化应用部署、伸缩和管理机制,形成新的、通用的云化模型
- 云厂商锁定的问题得以解决,云应用支持跨云迁移。
4. 集群初体验-演示
没办法实践
5. K8S 架构与组件
6. Master 组件——集群大脑
集群大脑,控制平南:
- 所有集群的控制命令都传递给 Master 组件并在其上执行
- 每个 Kubernetes 集群至少有一套 Master 组件(默认一个,多个保证高可用)
- 每套 master 组件包括三个核心组件(apiserver、scheduler和controller-manager)以及集群数据配置中心 etcd。
API Server
- 集群控制的唯一入口,是提供 Kubernetes 集群控制 RESTful API 的核心组件
- 集群内各个组件之间数据交互和通信的中枢
- 提供集群控制的安全机制(身份认证、授权以及 admission control)
Scheduler:
- 通过 API Server 的Watch 接口监听新建 Pod 副本信息,并通过调度算法为该 Pod 选择一个最合适的 Node
- 支持自定义调度算法 provider
- 默认调度算法内置预先策略和优选策略,决策考量资源需求、服务质量、软硬件约束、亲缘性、数据局部性等指标参数。
ControllerManager
- 各种资源的核心管理者
- 针对每一种具体资源,都有相应的 Controller
- 保证其下管理的每个 Controller 所对应的资源始终处于“期望状态”。
> 每个 Controller 的逻辑:
for { 获取资源期望状态 获取资源当前状态 改变:当前状态 → 期望状态 }
ETCD:
- 集群的主数据库,存储着所有资源对象以及状态
- 默认与 Master 组件不是在一个 Node 上
Etcd 的数据变更都是通过 API Server 进行
7. Node 组件
工作负载节点,K8S 中真正的工作负载节点
- 集群由多个 Node 共同承担工作负载,Pod 被分配到某个具体的 Node 上执行
- K8S通过 node controller 对 node 资源进行管理。支持动态在集群中添加或删除 Node。
- 每个集群 Node 上都会部署 Kubelet 和 Kube-proxy 两个组件。
组件:Kubelet
- 位集群中每个 Node 上的非容器形式的服务进程组件,Master 和 Node 之间的桥梁
- 处理 Master 下发到本 Node 上的 Pod 创建、启停等管理任务;向 API Server 注册 Node 信息。
- 监控本 Node 上容器和节点资源情况,并定期向 Master 回报节点资源占用情况
组件:Kube-proxy
运行在每个 Node
- Service 抽象概念的实现,将 Service 的请求按策略(负载均衡)算法发到后端 Pod(Endpoint)上
- 默认使用 iptables mode 实现
- 支持 nodeport 模式,实现从外部访问集群内的 service
8. K8S 对象
一种持久化的、用于表示集群状态的实体
- 一种声明式的意图的记录,一般使用 yaml 文件描述对象
- Kubernets 集群使用 Kubernetes对象来表示集群的状态
- 通过 API/Kubectl 管理 Kubernetes 对象
对象模型
9. 常用 Metadata
Name 和 UID
- Kubernetes 集群中所有对象都通过 name 和 UID 明确标识
- API 的对象访问路径。/api/{version}/namespaces/{namespace}/{object-kind}/name
- 在 Kubernetes 集群的整个生命周期内创建的每个对象实例都具有不同的 UID。
Namespace,不仅是属性,本身也是 object
- 用于将物理集群划分为多个虚拟集群
- 完全隔离,常被用来隔离不同的用户(及权限)
- 内置三个 Namespaces:default、kube-system 和 kube-public,Node 和 PersistentVolume 不属于任何 namespace。
Label(标签)
用于建立集群对象之间灵活的、松耦合的多维关联关系
- 一个 label 是一个键值对,其中 k、v 均由用户自定义
- label 可以附在任何对象上,每个对象也可以有任意个标签。标签可以在对象定义时附加上。也可以通过命令动态管理标签
- Label 可以将有组织目的结构映射到集群对象上,从而形成一个与现实世界管理结构同步对应松耦合的、多维的对象管理结构。
Annotations(注解)
可以将任意非标识性元数据附加在对象上
- Annotations 也可以以剪枝对形式呈现
- 工具和库可以检索到并使用这些 Annotations 元数据
- 将数据作为 Annotation 附着在对象上,有利于创建一些用于不是、管理和做内部检查的共享工具或客户端。
10. 对象分类
Pod:集群调度基本单元,一个特定关系的容器集合
- 集群中可以创建和部署的最小且最简的 Kubernetes 对象单元
- 也是一种封装。封装了应用容器,存储资源、独立的网络 IP以及决定容器如何运行的策略选项
- 每个 Pod 中预置一个 Pause 容器,其名字空间、IPC资源、网络和存储资源被 Pod 内其它容器共享。Pod 中的所有容器紧密协作,并作为一个整体被管理、调度和运行
Pod 生命周期,一个非持久性实体,四种状态
11. Service
与云原生应用中“微服务”概念一一对应
- Kubernetes 集群为每个 Service 分配一个集群唯一的 IP 地址,在 Service 的生命周期内,该 IP 地址不变;在内部 DNS的支持下实现服务发现
- 通过 label selector 关联到实际支撑业务运行的 Pod 上,并通过集群内置的服务负载均衡将服务请求分发到后端 Pod
- 通过 nodeport 或设置 loadbalancer 机制实现集群外部对 service 的访问
12. Controllers
- 用于保证集群内一组 Pod 能始终按照某种期望的状态(desired state)正常运行
- 状态包括:Pod 副本数量、节点选择、资源约束、持久化数据维持等。
- 支持多种 Controller,常用的 Deployment、replicaset、statefulset、daemonset等
13. RepicaSet
确保健康 Pod 副本数始终满足用户定义的数量
- 前身是 ReplicationController(rc)
- 相比 rc,增加集合式 label selector 的支持
- 支持单独使用,但更多隐藏在 Deployment 控制器后面,有 deployment 自动管理。
14. Deployment
为 Pod 和 ReplicaSet 提供了声明式的定义(declarative)
- 用户在 deployment 文件中描述期望状态,Deployment Controller 就会自动将 Pod 和 Replica Set 的实际状态改变到期望状态
- 支持 Pod 的 RollingUpdate,并自动管理背后的 ReplicaSet
- 支持将 Pod rollback 到之前的任意 revision(限于 pod-template 模板改动)
15. StatefulSet
提供对有状态的应用的部署和控制的支持,1.9 版本 GA
- 适用场景:稳定的持久化存储、稳定的网络标志、有序部署有序扩展、有序收缩有序删除、有序自动滚动升级等。
- Pod 的存储必须由 PersistenVolume Provisioner 根据请求的 Storage Class 进行配置,或由管理员预先配置好
- 考虑数据安全性,伸缩或删除 StatefulSet 不会删除关联的存储;另外 StatefulSet 目前要求 Headless Service 负责 Pod 的网络身份,用户有责任创建此服务。
课程收获:
主要讲的 K8S 的组件概念、架构设计和一些组件之间的应用逻辑,之前看了尚硅谷的 K8S 实操性很强,这个课理论比较扎实,可以互补。
(好像是第一次听这个老师的课,点进手记发现这个老师有个专栏,大佬啊)
一些课程截图: