点击围观!腾讯 TAPD 助力金融行业研发提效、敏捷转型最佳实践! 了解详情
写点什么

非云环境中 Kubernetes 的配置和运行: Kubernetes 架构

  • 2020-08-22
  • 本文字数:3170 字

    阅读完需:约 10 分钟

非云环境中Kubernetes的配置和运行: Kubernetes 架构

这是非云环境中 Kubernetes 的配置和运行系列的第四篇文章,本文将主要介绍 Kubernetes 的架构及主要组件,包括 Pods、服务、卷、命名空间等。


想要先睹为快的读者,可直接克隆该项目的 GitHub 代码库。代码库中的文档正在持续改进中,并完全可用。代码库地址为: mvallim/kubernetes-under-the-hood

Kubernetes

“Kubernetes 是一种用于管理容器化工作负载和服务的可移植、可扩展的开源平台,便于声明式配置和自动化。Kubernetes 生态系统规模庞大,且增长快速,其服务,支持和工具已得到广泛使用。

“Google 于 2014 年开源了 Kubernetes 项目。Kubernetes 的建立基于 Google 十五年大规模生产工作负载的经验,并综合了来自社区的最佳思考和实践。


引用自: https://kubernetes.io/docs/concepts/overview/what-is-kubernetes/


Kubernetes 的优点包括:


  • 敏捷应用开发和部署:与使用虚拟机镜像相比,Kubernetes 改进了容器镜像创建的便捷性和效率。

  • 容器开发、集成和部署:支持高频次、可靠的容器镜像构建和部署,并由于镜像的不可更改性,使得回滚更为快速和简单

  • 有效隔离开发(Dev)和运维(Ops):应用容器镜像创建是在构建/发布阶段,而非部署阶段,使应用得以从架构中解耦。

  • 可观察性(Observability):不仅涵盖操作系统层级的信息和度量,而且涉及应用健康等深层信息。

  • 跨开发、测试和生产的环境一致性:无论对于云环境中,还是在个人笔记本上,都具有一致的运行环境。

  • 云/操作系统发行版的可移植性:可运行在任何环境中,包括 Debian、Ubuntu、CoreOS、本地部署、Google Kubernetes Engine、Amazon Elastic Container Service 等。

  • 以应用为中心的管理:将抽象层级从在虚拟硬件上运行操作系统,提升为使用逻辑资源在操作系统上运行应用。

  • 松耦合、分布式、弹性、无约束的微服务:应用切分为可动态部署并管理的更小尺度独立部分,而非运行在专用机器上的单体应用。

  • 资源隔离:支持应用性能可预测。

  • 资源使用:更高效、更紧密。


引用自: https://kubernetes.io/docs/concepts/overview/what-is-kubernetes/


为尽可能提供完备的功能,Kubernetes 依赖并使用了其它一些开源工具。其中包括:


Kubernetes 架构


图 Kubernetes 架构


Kubernetes 管理的集群通常具有两个主要操作单元:主节点(Master)和工作节点(Worker)。


  • 主节点(Master):负责编排运行在工作节点上的所有容器相关活动。其中,主节点负责安排和部署集群应用,获取工作节点和 Pod 的相关信息。

  • 工作节点(Worker):是支持 Kubernetes 所管理容器得以有效运行的机器(节点)。工作节点可以是物理机,也可以是虚拟机。为了使工作节点可被 Kubernetes 管理,必须在其上安装 Kubernetes 的 Kubelet 代理。工作节点通过 Kubelet 代理完成与主机的所有通信,实现执行集群操作。


Kubernetes 主节点从开发人员/运维人员(即 DevOps)处接收指令,并传递给工作节点。这些指令由一组服务做处理,并重新传输。上述服务可自动确定最适合处理所请求任务的工作节点,然后将资源分配并指定给满足所请求指令的选定工作节点。


容器管理运行在更高层级上,其中已充分考虑工作细节。容器和工作节点的运作,无需手工主动干预。

主节点和工作节点的组件

  • 容器网络接口(CNI,Container network interface):该网络插件遵循 appc/CNI 规范。规范支持运行在不同节点上的 Pod 间的连接,并支持灵活集成 overlays、纯第三层网络(pure L3)等多种网络解决方案。

  • Kubernetes 和 CNI 相关信息,可参见官方文档“ Network plugins”。

  • etcd:支持高可用和一致性的键值存储,用于 Kubernetes 中所有集群数据的存储。如果 Kubernetes 集群的后台存储使用 etcd,需确保具有针对集群数据的备份计划。

  • api-server: 用于提供 Kubernetes API 的主节点组件。API 服务是 Kubernetes 控制平台(Control Plane)的前端,设计上考虑了水平扩展,即随部署实例数量而扩展的能力。

  • 控制平台:容器编排层,提供用于定义、部署和管理容器生命周期的 API 和接口。

  • 调度程序(Scheduler):主节点上的组件,用于监视新创建且未分配给工作节点的 Pod,并调度一个工作节点运行该 Pod。调度策略中考虑的因素包括:个体和全部资源需求、硬件/软件/策略约束,亲和性和反亲和性(affinity and anti-affinity)规范、数据的本地性、工作负载间的干扰和最后期限等。

  • Controller manager:主节点上运行控制器的组件。每个控制器在逻辑上是独立的进程,但是为了降低复杂性,它们被编译为一个二进制文件,以单个进程运行。

  • kubelet:运行在工作节点上的服务。kubelet 读取 Pod 清单(manifests),确保清单中定义的容器已启动并处于运行状态。

  • containerd:容器运行时,注重于容器的简单性、鲁棒性和可移植性。在 Linux 或 Windows 上,containerd 是以守护程序形式运行的容器运行时,负责获取和存储容器映像、执行容器、提供网络访问等。在我们的解决方案中,我们使用 Docker 实现上述功能。

  • Kube Proxy:运行在群集中每个工作节点上的网络代理。Kube-proxy 负责请求转发,通过一组后端功能支持 TCP/UDP 流转发和轮询转发。


参考资料: https://kubernetes.io/docs/reference/glossary/?fundamental=true

Kubectl


图片来源: RisingStack


kubectl 命令行工具提供与 Kubernetes API 服务的交互。用户可使用 kubectl 创建、更新和删除 Kubernetes 对象。

Docker 简述

Docker 功能可直接使用。不同之处在于,Kubernetes 在配置 Pod 时,将指令发送给选定工作节点的 kubelet,其中指定 Docker 去启动或停止容器。进而,kubelet 继续从 Docker 及其容器中收集信息,并将所有这些信息汇总给主节点。其中的主要差异之处在于,所有这些操作都是自动进行的,无需管理员必须手动完成配置和信息收集。

Kubernetes 的关键对象


下面简要介绍 Kubernetes 所管理的每个关键对象。细节将在 Kubernetes 之旅系列的下一篇文章中推出。


  • Pod:最小、最简的 Kubernetes 对象。Pod 表示了一组集群中正在运行的容器。Pod 的运行模式通常设置为单个主容器,也可选择添加对日志支持等辅助功能的挎斗模式(sidecar)容器。Pod 通常由 Deployment 管理。



  • Deployment:管理复制(replicated)应用的 API 对象。 每个副本表示为一个分布在集群工作节点间的 Pod。



  • Service:描述 Pods 等应用访问方式的 API 对象,支持对端口和负载平衡器的描述。访问接入点可位于群集的内部或外部。



  • 卷(Volume):是包含数据并对 Pod 容器可访问的目录。Kubernetes 卷的生命周期与包含它的 Pod 一致。因此,卷的寿命超过 Pod 中运行的所有容器,并且在容器重启后保留数据。

  • 文件系统:在 Kubernetes 中,每个容器都可以在其自身的文件系统中执行读写操作。但是,容器重启或删除后,写入该文件系统的数据将被破坏。

  • 卷:Kubernetes 具有卷。只要 Pod 存在,Pod 中的卷就将存在。卷可在同一 Pod 容器间共享。Pod 重启或移除后,卷将被破坏。

  • 持久卷:Kubernetes 具有持久卷。持久卷提供 Kubernetes 集群中的长期存储。持久卷寿命超出容器、Pods 和工作节点。只要 Kubernetes 集群存在,持久卷就存在。Pod 可声明使用持久卷读取、写入和读写。



  • 命名空间(Namespace):一种 Kubernetes 用于支持在同一物理集群上的多个虚拟集群的抽象。命名空间用于组织集群中的对象,并提供了一种集群资源的划分方法。资源名称在同一命名空间中必须唯一,但在多个命名空间之间则不必唯一。



参考资料: https://kubernetes.io/docs/reference/glossary/?fundamental=true


原文链接:


Kubernetes Journey — Up and running out of the cloud — Kubernetes Overview


2020-08-22 10:001594

评论

发布
暂无评论
发现更多内容

最佳实践|Apache Doris 在小米数据场景的应用实践与优化

SelectDB

数据库 数据分析 小米 Doris OLAP 场景实践

slb与nat及eip的相关联

肖飞码字

负载均衡 NAT 弹性公网IP

架构实战营模块四作业

zhihai.tu

vue高频面试题合集(四)附答案

helloworld1024fd

Vue

Android进阶(十一)Android系统架构讲解

No Silver Bullet

android 系统架构 8月月更

面试官怒了:多级缓存不了解怎么行,那可是数量级的提升?

知识浅谈

缓存 8月月更

浅谈营销型企业站文案应该如何写

石头IT视角

vue高频面试题合集(三)附答案

helloworld1024fd

RocketMQ顺序消息

周杰伦本人

8月月更

极狐GitLab冷知识:使用 Gitlab Webhook 触发 Pipeline

郭旭东

极狐GitLab JIHULAB 101

数据结构——栈

秋名山码民

8月月更

shell脚本之格式化输出

Albert Edison

Linux centos 运维 shell脚本编程 8月月更

编译调试插件功能总结

乌龟哥哥

8月月更

STM32入门开发 NEC红外线协议解码(超低成本无线传输方案)

DS小龙哥

8月月更

真会玩!用手机吹气球你见过不?

岛上码农

flutter ios 前端 安卓开发 8月月更

第一个spark应用开发详解(java版)

程序员欣宸

Java spark 8月月更

C++运算符重载(四)之赋值运算符重载

CtrlX

c++ C# 后端 函数重载 8月月更

用好JAVA中的函数式接口,轻松从通用代码中剥离掉业务定制逻辑

程序知音

Java 编程 程序员 后端

浅谈-大数据工程师面临的困境和要学习的技术

Geek_c8a6a0

每日一R「04」常用的智能指针

Samson

8月月更 ​Rust

Spring 全家桶之 Spring Data JPA(二)

小白

8月月更

云原生事件驱动引擎(RocketMQ-EventBridge)应用场景与技术解析

阿里巴巴云原生

阿里云 RocketMQ 云原生

版本管理工具git的使用总结

TimeFriends

8月月更

MYSQL最朴素的监控方式

京东科技开发者

MySQL 数据库 数据 监控数据

快的不止一点点!阿里强推的“Redis速成手册”也太香了吧

程序知音

Java 数据库 redis 程序员 后端技术

JavaScript Promise 的使用技巧

Jerry Wang

JavaScript Promise 异步编程 await 8月月更

Spring Cloud Sleuth简述

阿泽🧸

8月月更 Spring Cloud Sleuth

非云环境中Kubernetes的配置和运行: Kubernetes 架构_云计算_Marcos Vallim_InfoQ精选文章