1.Kubernetes(K8S)架构1(Master,Node和Pod)

2023-10-30

简介:

K8S是当前主流的容器编排系统, 服务编排系统要想实现服务的自动化部署和运行离不开容器编排系统. 

 容器目的是解决服务器的异构问题, 解决了部署的时候无需在考虑底层系统环境是否能够满足服务的需要.  但是单独的容器并没有生产的价值, 因为他只是提供了底层应用的托管程序, 并没有处理多个容器容器投入生产的问题,  而容器的编排则是处理多个容器投入生产的痛点问题

容器编排系统是在大范围,动态环境中管理容器生命周期的工具.

容器编排系统价值

  1. 容器的提供和部署
  2. 容器的冗余和可用性, 容器挂掉有自动恢复机制, 或者故障转移
  3. 应用规模的自动伸缩, 能依据实例的需求自动实现资源的扩容和释放. 提高资源利用率
  4. 容器资源紧缺的时候能够在用户 毫无感知的情况下资把容器迁移到其他宿主机的节点
  5. 容器之间实现资源分配
  6. 能够实现将容器的服务暴露到外部, 实现在外部进行访问
  7. 容器的负载均衡, 容器的服务注册和发现
  8. 宿主机和容器的健康状态检测
  9. 将应用之间的关系配置到容器

 K8S是当前最主流的容器编排系统没有之一. (docker  swarm被安在地上摩擦).  K8S 是Google使用 Go语言按照自己十分成熟的容器编排系统 Borg 的思维重新做了一遍. 

最后 K8S 是一个能够实现自动部署,伸缩并且实现应用容器跨主机集群和提供容器基础设施的开源平台

K8S架构

Master和Node 

K8S中主机(可以是物理机或者虚拟机)主要分为两种 Master和Node

  • Node 是运行具体容器的主机,负责提供后具体的服务,并且本身具有自我修复能力  --Data Plane 数据平面
  • Master 负责管理Node, 控制Node 具体运行什么容器, 同时还承担外部数据访问的角色-- Control Plane 控制层面

Master和Node都有冗余但是冗余的, 但是目的不同

在容器集群运行中正在运行的Master(ETCD除外, 是一个强一致的分布式存储) 只能有一个,因为只能由一个Master去指挥它下面的多个Node, 所以Master的 冗余用于做灾备, 当Master挂掉, 会有另一个冗余的Master启用,替代原来的Master工作,所以生产环境应该有3个以上Master

集群中的Node的冗余是用于做负载均衡的, 多个Node需要同时工作负责不同的模块和任务, 其中某个Node万一挂掉, 这个Node的任务被分配到其他Node再次运行起来

K8S主体架构

用户可以通过 API接口. UI界面和命令行来访问k8S 的Master, 之后Master依据接収的请求对Node上面的容器做新增,更新或者删除的操作, 同时容器的镜像又依赖于镜像仓库, 需要从镜像仓库拉取所需的镜像, 同时需要将自定义的镜像保存到镜像仓库供容器来使用, 镜像仓库可以考虑 Docker Hub或者搭建私有仓库, 由于Docker Hub 需要公网链接, 所以一般建议搭建私有仓库

Master详解.

Master节点是集群的控制节点,负责整个集群的管理和控制, 基本上所有的控制指令都是发给Master的, 并且他来负责调度Node来具体执行命令, 通常生产环境Master都是部署在单独的服务器, 建议使用3台以上的奇数服务器做冗余, 因为'首脑' 宕机整个集群都会崩溃. 

Mater由四个逻辑组件组成, 他们分别由四个独立的守护线程, API Server, Scheduler和Controller是K8S自己做的,etcd则是使用 Core OS的成果

  • etcd:用户保存应用程序配置信息的守护进程,是一个k-v存储系统,存储内容为用用户发出的API请求中容器的具体要求, 是一个强一致性的
  • API Server: 是K8S开放给用户的唯一入口,接受用户的指令.同时对指令进行规范检查, 将合乎规范的话将其放入etcd中
  • Scheduler:是作为调度器 .负责的内容是寻找要部署的容器的最佳Node. 主从模式, 只能有一个正在执行的服务
  • Controller: 是作为控制器, K8S提供的API是声明式API. 要运行一个redis容器, 只需要声明要运行一个redis容器即可, 具体的镜像来源以及挂掉后重启等等都有控制器完成. 控制器负责用户指令的具体运行以及保证资源运行一直符合用户的需求, 作为Master的大脑. 也只能有一个正在执行的服务
    • Controller Loop 使用轮询的方式保证每个容器的运行正常, 当某个资源不可用, 会尝试重启, 要是还不行,会尝试初始化资源,比如尝试把容器铲掉,拉取镜像重启运行

各个组件关系如下

用户发起一个对容器的操作请求, API Server接受到之后会首先对用户发送的指令进行验证, 没有问题后会把指令存储到etcd. 同时Scheduler和Controller分别监听API Server请求验证成功后如果是新建容器,  Scheduler会寻找最合适的Node用于运行容器,  而Controller通过监听获得指令之后会去完成指令的要求, 完成后会以轮询的方式校验资源(主要是容器)的状态和存储来etcd里面的指令要求的是否一致. 不一致的话进行重新部署资源(重启或者重新运行镜像)

Node

Node节点是作为K8S中的工作负载节点, Node节点接収Master节点分配的一些任务.同时当前Node节点

Node的关键组件

kubelet: 负责对pod(POD是一组  )对应容器的创建,启停等一系列的任务, kubelet时刻watch着Mater中的API Server中的资源变动, 当有和自己相关的任务的时候就会调用Docker执行具体的任务

kube-proxy: 用于实现 K8S Service(需要提供的服务) 的通信和负载均衡

Docker Engin: docker引擎, 负责Node于和容器有关的操作, K8S原生支持Docker作为容器引擎, 如果要使用其他容器引擎则需要使用对应接口集成

Pod : K8S不是直接运行的容器,而是操作Pod, 把Pod作为原子单元管理,一个Pod里面可能会运行多个容器,  Pod里面运行的多个容器被捆绑在一起被统一调度不可分割. 一个Pod的所有容器只能同时运行在一个Node 上

结构图如下

 

当用户发起一个创建Pod的请求,首先Pod的信息会被存储到 etcd, 随后Master调度器会分析最适合运行这个Pod的Node, 并将信息存储到etcd, 这个时候这个Node的kubelet在Master的API Server 上面 watch到自己有事干了, 就会调用docker引擎把这一组相关的容器启动起来.

这个时候Pod就运行起来了.

除此之外Node还会向Master汇报Pod的运行状况, Master中的控制器汇报运行状况和 etcd中存储的Pod的信息对比, 看看是不是期望的运行状况, 不是的话重启Pod的容器, 重启不行就拉群镜像重启运行.

在Node宕机的时候, Master还会吧这个Node上面的所有Pod通过执行调度器重新寻找适合运行的Node, 重启运行 Pod所包含的容器. 

Pod

Pod是K8S里面操作容器的基本单元,是被K8S统一调度的,  Pod一般是一组联系紧密的容器.

Pod都有一个特殊的Pause容器用于代表真个Pod的状态, Paus容器的镜像是来源于K8s的平台

结构如下

  

Pod主要要解决的问题有两个, 通常情况下一组容器的关联比较紧密, 可以看做一个在整体, 但是在管理上就出现了麻烦, 这一组业务容器无法进行统一的管理, 比如要求统一的运行启动部署, 引入Pod概念直接对Pod这组容器进行操作就更加简单,    还有运行状态的判断, 在这一组容器的运行的时候, 没有Pod就不能很好的判断整体的运行状态(一个容器挂掉算挂掉还是所有挂掉算挂掉,还是按比例), 引入Pod后, 用Pod的Pause容器状态代表整个Pod的状态, 当Pod挂掉, 重启pod包含的所有容器. 

Pod运行的容器通常联系比较傲紧密, Pod的多个容器可以共享Pod中Pause容器的IP还有Pause容器挂载的 Volume, 这样就简化和业务容器之间的配置. 很简单的解决了容器的通信和文件共享文件问题.

同时K8S为每个Pod分配了了指定的唯一IP, 称为 Pod IP, Pod里面的容器共享这这个IP. 至于多个Pod之间跨主机的通信就要借助于虚拟二层网络, 例如Open vSwitch等等. 类似于docker使用Open vSwitch跨主机通信.

更多概念:

2.Kubernetes(K8S)架构2--Service,NameSpace,Volume等对象_水淹萌龙的博客-CSDN博客

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

1.Kubernetes(K8S)架构1(Master,Node和Pod) 的相关文章

  • 在 Flask 应用程序中设置和检索环境变量

    我想使用 python3 flask 构建一个非常简单的 REST api 比如说我想设置我的SECRET KEY要求由flask作为环境变量 推荐的方法是什么 我知道python dotenv允许 或者我应该说requires the f
  • Docker 容器 - 如何配置使其在 vagrant 中运行时获得可行的 IP 地址?

    Docker www docker io 看起来棒极了 然而 安装 VirtualBox 后 Vagrant 最后是 Mac 上的 Docker 我发现无法从另一台计算机 或从 Mac 上的终端会话 访问 Docker 容器中运行的服务 我
  • 使用 tc 限制 Docker 容器的传出网络带宽

    我正在尝试对 Docker 容器进行带宽限制 为了限制下行带宽 我可以先找到容器的veth接口并使用tc tc qdisc add dev vethpair1 root tbf rate 1mbit latency 50ms burst 1
  • 无法使用 Docker 运行 Strapi

    我正在尝试 Docker 化我的Strapi应用程序 所以首先在项目的根目录中我创建了一个 env文件包含以下内容 HOST 0 0 0 0 PORT 3002 然后 里面backend config server js I have mo
  • docker build --no-cache 是否构建不同的层?

    几个月前 我决定使用以下命令设置我的项目构建 docker 镜像的 CIno cacheflag 我认为最好不要冒险让 docker 使用旧的缓存层 我现在才意识到 我的图像各层的 sha 总是不同的 即使新构建的图像应该生成与之前构建的相
  • 如何从连接到外部网络的另一个组合访问容器?

    这是带有容器配置的撰写文件 我希望从外部容器连接到该容器 在另一个撰写文件中定义 version 3 5 services service to connect to build networks my external network n
  • 让我们加密证书颁发

    我正在尝试获取 Let s Encrypt 颁发的证书 已经过去了 3 个半小时 我不小心最初将我的 SecretName 设置为 echo tls 然后将其切换到我想使用的正确的 pandaist tls 我目前有这个 kubectl g
  • 如何允许 Kubernetes 作业访问主机上的文件

    我已经彻底阅读了 Kubernetes 文档 但在与主机文件系统上的文件与 K8 作业启动的 pod 内运行的应用程序进行交互时仍然遇到问题 即使是最简单的实用程序也会发生这种情况 因此我提供了 yaml 配置的精简示例 此处引用的本地文件
  • 从多个开发机器管理远程 docker 机器

    可以从另一个工作站管理使用 docker machine 命令从一个开发人员工作站创建的 docker 机器吗 我不是在寻找涉及 docker swarm 的解决方案 而只是寻找涉及 docker machine 的解决方案 据我了解 当
  • 如何在 Kubernetes 中按特定顺序配置 Pod 初始化?

    我想知道如何按特定顺序开始部署 我知道initContainers但这对我不起作用 我有一个巨大的平台 有大约 20 个部署和 5 个有状态集 每个都有自己的服务 环境变量 卷 水平自动缩放器等 所以不可能 或者我不知道如何 在另一个中定义
  • Helm 3 图表安装错误:验证数据时出错:未设置 apiVersion

    我有一个简单的 helm 图表 它将通过 docker 桌面将应用程序部署到我的 kubernetes 本地副本 如果我使用 kubectl 一次部署一个 yaml 文件 一切都会正常工作 但是 当我尝试创建 helm 图表以方便部署时 出
  • 如何通过 kubectl 代理访问此 Kubernetes 服务?

    我想通过以下方式访问我的 Grafana Kubernetes 服务kubectl 代理服务器 https kubernetes io docs user guide kubectl v1 7 proxy 但由于某种原因 即使我可以使其适用
  • 具有 blobfuse 或 Azure 存储 Blob 的 Azure 容器实例

    我正在从 azure 容器注册表 azure cli 和 或门户 部署到 azure 容器实例 Azure blobfuse 在 ubuntu 18 上 出现以下错误 未找到设备 请先尝试 modprobe fusion 解决这个问题的方法
  • MySQL集群启动失败

    这不是我第一次创建ndbcluster 但我没有收到这样的问题 我正在关注本手册 https hub docker com r mysql mysql cluster by mysql团队 我正在使用回显的默认配置在此 GitHub 存储库
  • 从镜像创建 Docker 容器而不启动它

    作为我的部署策略的一部分 我使用 Upstart 管理 Docker 容器 为此 我需要从注册表中提取图像并创建一个命名容器 如建议的那样 用于运行容器的新贵脚本不会管理生命周期 https stackoverflow com questi
  • 适用于elasticsearch 7.0.1 和 kibana 7.0.1 的 docker-compose.yml

    我在 Windows 10 上将 Docker Desktop 与 Linux 容器结合使用 并希望通过 docker compose 文件启动最新版本的 elasticsearch 和 kibana 容器 使用 6 2 4 等旧版本时一切
  • Docker 教程入门第 4 部分连接被拒绝

    我不明白我错过了什么 docker compose yml version 3 services web replace username repo tag with your name and image details image sv
  • 热重载在docker中运行的java程序

    我开发了一个java程序 应该在docker中运行 然而 我在调试docker中运行的java程序时遇到了很多痛苦 我在网上搜索 一些教程提出了像 spring dev tools 这样的工具 因为我的java程序是基于spring boo
  • PHP-docker容器中的环境变量

    我想在我的 docker 容器中显示一个环境变量 PHP 脚本如下所示 我使用 OpenShift 来启动容器 PHP 容器显示 env is 现在我更改容器的 dc 配置 oc env dc envar USER Pieter deplo
  • Kubernetes 中可以连接两个集群 IP 服务吗?

    情况是我想连接一个租户内的两个集群IP服务 该租户已经将Traefik作为NodePort 以便这两个服务中的任何一个都可以成为LoadBalancer 因为NodePort由Traefik使用 我尝试连接的两个服务的工作方式如下 第一个服

随机推荐

  • linux如何指令输入,linux基本操作指令

    1 linux kernel 内核 2 什么时shell 保护系统内核并对外提供操作接口的软件 linux中默认的shell是 bash 3 在shell如何运行命令 命令行字符含义 kiosk foundation0 Desktop 1
  • Linux(未完,待续。。)

    目录 一 linux基础 二 常用命令 1 文件处理命令 1 1命令格式与目录处理命令ls 1 2 目录处理命令 2 权限管理命令 2 1 chmod 2 2 chown 2 3 chgrp 2 4 umask 3 文件搜索命令 3 1 f
  • 1013 数素数

    令 Pi 表示第 i 个素数 现任给两个正整数 M N 10 4 请输出 PM 到 P N 的所有素数 输入格式 输入在一行中给出 M 和 N 其间以空格分隔 输出格式 输出从 PM 到PN 的所有素数 每 10 个数字占 1 行 其间以空
  • InterlockedExchange

    LONG InterlockedExchange IN OUT PLONG Target IN LONG Value InterlockedExchange a b 能以原子操作的方式交换俩个参数a b 并返回a以前的值 因为Interlo
  • 关于区块链的所有英文知识,看这篇文章就够了

    上周HiBlock区块链社区发布了一则区块链翻译小组成员招募信息 一些感兴趣的小伙伴说很多英文名词不知道怎么翻译比较准确 有砖家提出 翻译的基本原则是信达雅 即先要基于约定俗成 也就是共识 那么到底这些区块链相关的名词 共识下的中文对照是什
  • Compiling MongoDB C++ Driver, Boost Error (Windows)

    Compiling MongoDB C Driver Boost Error Windows up vote 1 down vote favorite 1 I am trying to compile the MongoDB C Drive
  • STL迭代器简介

    转自 http www cppblog com The Moment archive 2009 06 18 88023 html 标准模板库 The Standard Template Library STL 定义了五种迭代器 下面的图表画
  • 考试管理系统【软件工程实践课设报告】

    若本文对你有用 请点赞 关注我哟 软件工程专业大四上学期课设之一 随便乱写的 报告评分不高 仅供参考 一 软件工程实践课程任务目标 掌握软件工程问题调研 问题分析和原型设计 掌握从技术 经济 社会等方面对系统软件的评估 掌握运用软件工程原理
  • 一文搞懂信号

    一 信号 1 1信号特点 信号 Signal 在操作系统中是一种进程间通信机制 用于向进程发送异步通知 以下是信号的几个特点 异步通知 信号是异步发送给进程的 即进程在接收到信号时会中断当前的执行流程 转而去处理信号的处理函数 这个特点使得
  • Linux之参考资料

    底下列出几个学习网站来提供大家做为参考的依据 Study Area http www study area org 鸟哥癿私房菜馆 http linux vbird org 卧龙大师癿网绚技术文件 http linux tnc edu tw
  • QT从入门到实战x篇_21_自定义控件封装(手动新增一个.ui文件;封装自定义组合控件;调用自定义控件;创建自定义控件间的功能关联;外部控件与自定义控件交流,创建自定义控件接口函数)

    前面几篇我们介绍了Qt自带的控件 本篇将会介绍如何自定义组合控件并创建接口为其他控件所使用的 在进行实际开发中 Qt自带的控件无法满足开发需求时 就需要通过对Qt控件进行封装实现自定义控件 1 首先创建名为 01 SmallWidget 的
  • [转]__declspec(dllexport) 和 __declspec(dllimport)

    declspec dllexport declspec dllexport 将一个函数声名为导出函数 就是说这个函数要被包含她的程序之外的程序调用 extern C 指示编译器用C语言方法给函数命名 在制作DLL导出函数时由于C 存在函数重
  • VMware Workstation Pro 虚拟机做RAID

    虚拟机添加两块硬盘 安装raid管理工具mdadm yum install y mdadm 查看磁盘情况 fdisk l 创建raid1 mdadm C dev md1 n 2 l 1 a yes dev sd b c 查看raid信息 c
  • linux下的串口调试工具安装及使用

    两行命令安装串口调试助手 如下 sudo apt get install cutecom sudo cutecom
  • 基础的复位电路

    目前在系统化的学习电路知识 因此将一些值得记忆的内容记录下来 方便查阅 单片机必须要设计一个复位电路 以防指针跑飞或是出现其他状况 由于系统初始化时 也需要一个过程 此时希望程序处于复位的状态 防止单片机误发命令 因此常用上图所示电路 以下
  • Hexo+Github博客搭建教程(个人操作过程)

    Hexo Github博客搭建教程 个人操作过程 最近自己尝试利用hexo github搭建了blog 来记录一下过程 一 准备环境 1 node环境 首先 安装 nodejs 因为Hexo是基于 Node js 驱动的一款博客框架 htt
  • MATLAB中fillmissing函数用法

    目录 语法 说明 示例 包含 NaN 值的向量 由 NaN 值组成的矩阵 插入缺失数据 使用移动中位数方法 使用自定义填充方法 包含缺失端点的矩阵 包含多个数据类型的表 fillmissing函数的功能是填充缺失的条目 语法 F fillm
  • 【Educoder作业】冯·诺依曼体系结构及工作原理理解

    Educoder作业 冯 诺依曼体系结构及工作原理理解 所有的那个实际场景模拟的题就不更了 没难度 趣味性更高 这个题和我们之前的一篇博客里面的题只一模一样的 链接 我们这里就不做任何讲解了 要说的那一篇里已经说过了 几天过去 有些程序的实
  • STM32F1软件仿真

    MDK 的一个强大的功能就是提供软件仿真 通过软件仿真 我们可以发现很多将要出现 的问题 避免了下载到 STM32 里面来查这些错误 这样最大的好处是能很方便的检查程序存 在的问题 因为在 MDK 的仿真下面 你可以查看很多硬件相关的寄存器
  • 1.Kubernetes(K8S)架构1(Master,Node和Pod)

    简介 K8S是当前主流的容器编排系统 服务编排系统要想实现服务的自动化部署和运行离不开容器编排系统 容器目的是解决服务器的异构问题 解决了部署的时候无需在考虑底层系统环境是否能够满足服务的需要 但是单独的容器并没有生产的价值 因为他只是提供