三、Kubernetes 核心概念
本文最后更新于 751 天前,其中的信息可能已经有所发展或是发生改变。

什么是 Kubernetes

企业级的容器编排平台。

Kubernetes 这个单词是希腊语,它的中文翻译是“舵手”或者“飞行员”。联想一下 Docker 的集装箱,不难想到 k8s 是想成为运送集装箱的轮船,来管理集装箱,也就是管理容器。

“k8s”,是通过将8个字母“ubernete ”替换为“8”而导致的一个缩写。(这种缩短名称的方式还是第一次见,有创意)

Kubernetes 核心功能

  • 服务的发现与负载的均衡;

  • 容器的自动装箱,我们也会把它叫做 scheduling,就是“调度”,把一个容器放到一个集群的某一个机器上,Kubernetes 会帮助我们去做存储的编排,让存储的声明周期与容器的生命周期能有一个连接;

  • 自动化的容器恢复。

  • 应用的自动发布与应用的回滚,以及与应用相关的配置密文的管理;

  • 对于 job 类型任务,Kubernetes 可以去做批量的执行;

  • 为了让这个集群、这个应用更富有弹性,Kubernetes 也支持水平的伸缩。

调度

k8s 将用户提交的容器,放置到集群的某个节点上。结合容器的大小,所需要的资源情况等,将容器放到一个满足容器要求的、相对空闲的节点上。

自动修复

k8s 会检查节点是否健康,如果节点出现故障,k8s 会自动将该节点的容器迁移到健康的节点上。

水平伸缩

k8s 具备业务负载检查的能力,如果某个容器 cpu 利用率过高,响应时间长,k8s 可以对该容器进行水平扩展。其中需要用到负载均衡。

Kubernetes 的架构

典型的二层架构和 server-client 架构。(Docker 也是 server-client 架构)

image-20220219160601821

中央的管控节点 master

image-20220219160829609

  • API Server:用来处理 API 操作的,Kubernetes 中所有的组件都会和 API Server 进行连接,组件与组件之间一般不进行独立的连接,都依赖于 API Server 进行消息的传送;

    • 本身在部署结构上是一个可以水平扩展的一个部署组件
  • Controller:是控制器,它用来完成对集群状态的一些管理。比如刚刚我们提到的两个例子之中,第一个自动对容器进行修复、第二个自动进行水平扩张,都是由 Kubernetes 中的 Controller 来进行完成的;

    • 可以进行热备的一个部署组件
  • Scheduler:调度器,完成调度的操作,就是我们刚才介绍的第一个例子中,把一个用户提交的 Container,依据它对 CPU、对 memory 请求大小,找一台合适的节点,进行放置;

  • etcd:是一个分布式的一个存储系统,API Server 中所需要的这些原信息都被放置在 etcd 中,etcd 本身是一个高可用系统,通过 etcd 保证整个 Kubernetes 的 Master 组件的高可用性。

真正运行业务负载的 Node

image-20220219162017405

Pod

每个业务负载会以 Pod 的形式运行,一个 Pod 中运行的一个或者多个容器。

kubelet

真正去运行这些 Pod 的组件的是叫做 kubelet,通过 API Server 接收到所需要 Pod 运行的状态,然后提交到 Container Runtime 组件中。

Storage Plugin、Network Plugin

在 OS 上创建容器运行所需要的环境,需要对存储、网络进行管理,Kubernetes 并不会直接进行网络存储的操作,他会靠 Storage Plugin 或者是网络的 Plugin 来进行操作。用户自己或者云厂商都会去写相应的 Storage Plugin 或者 Network Plugin,去完成存储操作或网络操作。

也就是定义规范,让各个厂商自己去实现。前提是软件自身要有话语权,想想一下如果不这样,就需要对接各种 OS,任务之重,没有话语权又想让各个 OS 使用 k8s,是多么的难。还好在容器编排领域,k8s 处于领先地位

Kube-proxy

在 Kubernetes 自己的环境中,也会有 Kubernetes 的 Network,它是为了提供 Service network 来进行搭网组网的。真正完成 service 组网的组件的是 Kube-proxy,它是利用了 iptable 的能力来进行组建 Kubernetes 的 Network,就是 cluster network。

Pod调度执行流程

image-20220219163525830

用户可以通过 UI 或者 CLI 提交一个 Pod 给 Kubernetes 进行部署,这个 Pod 请求首先会通过 CLI 或者 UI 提交给 Kubernetes API Server,下一步 API Server 会把这个信息写入到它的存储系统 etcd,之后 Scheduler 会通过 API Server 的 watch 或者叫做 notification 机制得到这个信息:有一个 Pod 需要被调度。

这个时候 Scheduler 会根据它的内存状态进行一次调度决策,在完成这次调度之后,它会向 API Server report 说:“OK!这个 Pod 需要被调度到某一个节点上。”

这个时候 API Server 接收到这次操作之后,会把这次的结果再次写到 etcd 中,然后 API Server 会通知相应的节点进行这次 Pod 真正的执行启动。相应节点的 kubelet 会得到这个通知,kubelet 就会去调 Container runtime 来真正去启动配置这个容器和这个容器的运行环境,去调度 Storage Plugin 来去配置存储,network Plugin 去配置网络。

Kubernetes 的核心概念

Pod

  • Pod 是 Kubernetes 的一个最小调度以及资源分配单元。

  • 一个或者多个容器组成。

  • 定义容器运行的方式(Command、环境变量等)

  • 提供给容器共享的运行环境(网络、进程空间)

    • Pod 里的容器可以用 localhost 来进行直接的连接。而 Pod 与 Pod 之间,是互相隔离的。

Volume

  • 声明在 Pod 中的容器可以访问的文件目录

  • 一个卷可以被挂载在 Pod 中一个或者多个容器的指定路径下面。

  • 支持多种后端存储的抽象

    • 本地存储、分布式存储、云存储

Deployment

一般用 Deployment 这个抽象来做应用的真正的管理,而 Pod 是组成 Deployment 最小的单元。

  • 定义一组 Pod 的副本数目、版本等
  • 通过 Controller 维持 Pod 的数目
    • 自动恢复失败的 Pod
  • 通过 Controller 以指定的策略控制版本
    • 滚动升级、重新生成、回滚等

滚动升级

  • 逐个更新 Pod,不会停止所有 Pod,导致业务中断
  • 更新期间仅对可用的 Pod 进行负载均衡

Service

  • 提供访问一个或多个 Pod 实例的稳定访问地址
    • Pod 实例生命周期短,自身访问地址无法固定
  • 支持多种访问方式实现
    • ClusterIP
    • NodePort
    • LoadBalancer

Namespace

区分不同的BU(business units:业务单位)

  • 一个集群内部的逻辑隔离机制(鉴权、资源管理)
  • 每个资源都属于一个 Namespace
    • Pod、Deployment、Service
  • 同一个 Namespace 中的资源命名唯一

Kubernetes 的 API

high-level(学到个新名词) 上看,Kubernetes API 是由 HTTP+JSON 组成的

image-20220219172620551

  • labels:一个非常核心的 kubernetes API 的概念(目前只理解到起标识作用), KeyValuePair,可以作为 Pod 查询条件。
  • spec:期望的状态,Pod 内部容器的信息

Kubernetes 官方文档

作者:Yuyy
博客:https://yuyy.info

评论

  1. Yuyy
    博主
    Linux Chrome
    2年前
    2022-3-29 16:59:37

    labels :对资源的管理和聚合,很巧妙,相对于“组织机构”,更加灵活、轻量

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇