写点什么

云原生训练营毕业总结

作者:9527
  • 2022 年 1 月 14 日
  • 本文字数:3109 字

    阅读完需:约 10 分钟

总结

云原生训练营是极客训练营中最好的一门课,没有之一。有理论,有实战,还有一步一步的例子,最最最关键的是有一位这么负责的老师(极客时间真的是赚大了,可以作为标杆课程打造)。能学这门课真心值回票价。从简单的内容循序渐进。


云计算是很多应用未来的方向,要掌握好云计算並不容易,整个思维方式都要从新调整。这次有幸参加了孟老师的云原生训练营,我觉得是个明智的选择。


从 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 版本中推出了)来进行处理。


    发布于: 刚刚阅读数: 2
    用户头像

    9527

    关注

    还未添加个人签名 2020.04.22 加入

    还未添加个人简介

    评论

    发布
    暂无评论
    云原生训练营毕业总结