云原生训练营毕业总结
总结
云原生训练营是极客训练营中最好的一门课,没有之一。有理论,有实战,还有一步一步的例子,最最最关键的是有一位这么负责的老师(极客时间真的是赚大了,可以作为标杆课程打造)。能学这门课真心值回票价。从简单的内容循序渐进。
云计算是很多应用未来的方向,要掌握好云计算並不容易,整个思维方式都要从新调整。这次有幸参加了孟老师的云原生训练营,我觉得是个明智的选择。
从 Go 语言开始学习,就掌握了阅读 Kubernetes 源代码的能力。学习到从物理机时代到虚拟机时代,再到容器时代,都是为了解决应用开发/部署/管理/监控的难题。开发和运维人员无论思想上和技术上都要做好充份的准备。云原生训练营快速的让我学习到了云计算的知识点,並通过实际作业将一个应用容器化並部署上云,把整个流程疏理清楚。有了这个起点,在未来云计算的路上就通畅无阻了。
学习方法:建议课要刷 3-4 遍,并且配合 ppt 和各种课后练习进行学习
学习笔记
Kubernetes 解决的核心问题
服务发现和负载均衡
Kubernetes 可以使用 DNS 名称或自己的 IP 地址公开容器,如果到容器的流量很大,Kubernetes 可以负载均衡并分配网络流量,从而使部署稳定。
存储编排
Kubernetes 允许您自动挂载您选择的存储系统,例如本地存储、公共云提供商等。
自动部署和回滚
您可以使用 Kubernetes 描述已部署容器的所需状态,它可以以受控的速率将实际状态更改为所需状态。例如,您可以自动化 Kubernetes 来为您的部署创建新容器,删除现有容器并将它们的所有资源用于新容器。
自动二进制打包
Kubernetes 允许您指定每个容器所需 CPU 和内存(RAM)。当容器指定了资源请求时,Kubernetes 可以做出更好的决策来管理容器的资源。
自我修复
Kubernetes 重新启动失败的容器、替换容器、杀死不响应用户定义的运行状况检查的容器,并且在准备好服务之前不将其通告给客户端。
密钥与配置管理
Kubernetes 允许您存储和管理敏感信息,例如密码、OAuth 令牌和 ssh 密钥。您可以在不重建容器镜像的情况下部署和更新密钥和应用程序配置,也无需在堆栈配置中暴露密钥。
Kubernetes 的出现不仅主宰了容器编排的市场,更改变了过去的运维方式,不仅将开发与运维之间边界变得更加模糊,而且让 DevOps 这一角色变得更加清晰,每一个软件工程师都可以通过 Kubernetes 来定义服务之间的拓扑关系、线上的节点个数、资源使用量并且能够快速实现水平扩容、蓝绿部署等在过去复杂的运维操作。
组件说明
主要介绍关于 K8s 的一些基本概念
主要由以下几个核心组件组成:
apiserver
所有服务访问的唯一入口,提供认证、授权、访问控制、API 注册和发现等机制
controller manager
负责维护集群的状态,比如副本期望数量、故障检测、自动扩展、滚动更新等
scheduler
负责资源的调度,按照预定的调度策略将 Pod 调度到相应的机器上
etcd
键值对数据库,保存了整个集群的状态
kubelet
负责维护容器的生命周期,同时也负责 Volume 和网络的管理
kube-proxy
负责为 Service 提供 cluster 内部的服务发现和负载均衡
Container runtime
负责镜像管理以及 Pod 和容器的真正运行
除了核心组件,还有一些推荐的插件:
CoreDNS
可以为集群中的 SVC 创建一个域名 IP 的对应关系解析的 DNS 服务
Dashboard
给 K8s 集群提供了一个 B/S 架构的访问入口
Ingress Controller
官方只能够实现四层的网络代理,而 Ingress 可以实现七层的代理
Prometheus
给 K8s 集群提供资源监控的能力
Federation
提供一个可以跨集群中心多 K8s 的统一管理功能,提供跨可用区的集群
Pod/Service
Pod、Service、Volume 和 Namespace 是 Kubernetes 集群中四大基本对象,它们能够表示系统中部署的应用、工作负载、网络和磁盘资源,共同定义了集群的状态。Kubernetes 中很多其他的资源其实只对这些基本的对象进行了组合。
Pod -> 集群中的基本单元
Service -> 解决如何访问 Pod 里面服务的问题
Volume -> 集群中的存储卷
Namespace -> 命名空间为集群提供虚拟的隔离作用
资源清单
K8S 中所有的内容都抽象为了资源,资源实例化之后就叫做对象。
在 Kubernetes 系统中,Kubernetes 对象是持久化的实体,Kubernetes 使用这些实体去表示整个集群的状态。特别地,它们描述了如下信息:
哪些容器化应用在运行,以及在哪个 Node 上
可以被应用使用的资源
关于应用运行时表现的策略,比如重启策略、升级策略,以及容错策略
Kubernetes 对象是 “目标性记录” —— 一旦创建对象,Kubernetes 系统将持续工作以确保对象存在。通过创建对象,本质上是在告知 Kubernetes 系统,所需要的集群工作负载看起来是什么样子的,这就是 Kubernetes 集群的期望状态。
etcd
etcd 是 CoreOS 基于 Raft 开发的分布式 key-value 存储,可用于服务发现、共享配置以及一致性保障(如数据库选主、分布式锁等)。
• 基本的 key-value 存储;• 监听机制;
key 的过期及续约机制,用于监控和服务发现;
原子 CAS 和 CAD,用于分布式锁和 leader 选举。
APIServer
Kube-APIServer 是 Kubernetes 最重要的核心组件之一,主要提供以下功能:
提供集群管理的 REST API 接口,包括:
认证 Authentication;
授权 Authorization;
准入 Admission(Mutating & Valiating)。
提供其他模块之间的数据交互和通信的枢纽(其他模块通过 APIServer 查询或修改数据,只有 APIServer 才直接操作 etcd)。
APIServer 提供 etcd 数据缓存以减少集群对 etcd 的访问。
Controller Manager
Controller Manager 是集群的大脑,是确保整个集群动起来的关键;
作用是确保 Kubernetes 遵循声明式系统规范,确保系统的真实状态(Actual
State)与用户定义的期望状态(Desired State)一致;
Controller Manager 是多个控制器的组合,每个 Controller 事实上都是一个 control loop,负责侦听其管控的对象,当对象发生变更时完成配置;
Controller 配置失败通常会触发自动重试,整个集群会在控制器不断重试的机制下确保最终一致性( Eventual Consistency)。
Scheduler
有这样一个需求,就是集群中多台服务的配置是不一致的。这就导致资源分配并不是均匀的,比如我们需要有些服务节点用来运行计算密集型的服务,而有些服务节点来运行需要大量内存的服务。而在 k8s 中当然也配置了相关服务来处理上述的问题,那就是 Scheduler。
Scheduler 是 kubernetes 的调度器,主要的任务是把定义的 Pod 分配到集群的节点上。听起来非常简单,但有很多要考虑的问题:
公平
如何保证每个节点都能被分配资源
资源高效利用
集群所有资源最大化被使用
效率
调度的性能要好,能够尽快地对大批量的 Pod 完成调度工作
灵活
允许用户根据自己的需求控制调度的逻辑
Scheduler 是作为单独的程序运行的,启动之后会一直坚挺 API Server,获取 PodSpec.NodeName 为空的 Pod,对每个 Pod 都会创建一个 binding,表明该 Pod 应该放到哪个节点上。
Kubelet
Kubernetes 的初始化系统(init system)• 从不同源获取 Pod 清单,并按需求启停 Pod 的核心组件:
Pod 清单可从本地文件目录,给定的 HTTPServer 或 Kube-APIServer 等源头获取;
Kubelet 将运行时,网络和存储抽象成了 CRI,CNI,CSI。• 负责汇报当前节点的资源信息和健康状态;
• 负责 Pod 的健康检查和状态汇报。
服务发现
Kubernetes 中为了实现服务实例间的负载均衡和不同服务间的服务发现,创造了 Service 对象,同时又为从集群外部访问集群创建了 Ingress 对象。
Ingress 服务
我们都知道传统的 SVC 只支持四层上面的代码,而对于七层上的代码而无能为力。比如:我们使用 K8S 集群对外提供 HTTPS 的服务,为了方便和便捷,我们需要在对外的 Nginx 服务上面配置 SSL 加密,但是将请求发送给后端服务的时候,进行证书卸载的操作,后续都是用 HTTP 的协议进行处理。而面对此问题,K8S 中给出了使用 Ingress (K8S 在 1.11 版本中推出了)来进行处理。
版权声明: 本文为 InfoQ 作者【9527】的原创文章。
原文链接:【http://xie.infoq.cn/article/bed8498fbcb4a5b691383cdd0】。文章转载请联系作者。
评论