Kubernetes笔记 (1) - 系统概述

2023-11-16

Kubernetes概述

Kubernetes由google开源,它的开发和设计都深受Google内部久负盛名的系统Borg的影响,而且,它的许多顶级贡献者之前也是Borg系统的开发者。Borg是Google内部使用的大规模集群管理系统。

Kubernetes吸取了Borg在过去十数年间积累的经验和教训,刚刚面世就立即广受关注和青睐,目前已经成为容器编排领域事实上的标准。很多人将Kubernetes视为Borg系统的一个开源实现版本。

Kubernetes使用共享网络将多个物理机或虚拟机汇集到一个集群中,在各服务器之间进行通信,该集群是配置Kubernetes的所有组件、功能和工作负载的物理平台。集群包含Master和Node。
Master
Master是集群的网关和中枢,负责诸如为用户和客户端暴露API、跟踪其他服务器的健康状态、以最优方式调度工作负载,以及编排其他组件之间的通信等任务,它是用户或客户端与集群之间的核心联络点,并负责Kubernetes系统的大多数集中式管控逻辑。

Node
Node是Kubernetes集群的工作节点,负责接收来自Master的工作指令并根据指令相应地创建或销毁Pod对象,以及调整网络规则以合理地路由和转发流量等。

Kubernetes集群组件

一个典型的Kubernetes集群由一个或一组Master和多个Node、一个集群状态存储系统(etcd)和add-ons组成。
Kubernetes的系统架构:
在这里插入图片描述

Master节点主要由apiserver、controller-manager和scheduler三个组件,以及一个用于集群状态存储的etcd存储服务组成,而每个Node节点则主要包含kubelet、kube-proxy及容器引擎等组件。

Master组件

API Server

API Server负责输出RESTful风格的KubernetesAPI,它是发往集群的所有REST操作命令的接入点,并负责接收、校验并响应所有的REST请求,结果状态被持久存储于etcd中。

Controller Manager

Kubernetes中,集群级别的大多数功能都是由几个被称为控制器的进程执行实现的,这几个进程被集成于kube-controller-manager守护进程中。由控制器完成的功能主要包括生命周期功能和API业务逻辑.

  • 生命周期功能:包括Namespace创建和生命周期、Event垃圾回收、Pod终止相关的垃圾回收、级联垃圾回收及Node垃圾回收等。
  • API业务逻辑:例如,由ReplicaSet执行的Pod扩展等
Scheduler

在API Server确认Pod对象的创建请求之后,Scheduler就会根据集群内各节点的可用资源状态,以及要运行的容器的资源需求做出调度决策。

Cluster State Store

etcd被用作Kubernetes集群状态的存储,etcd是独立的服务组件,并不隶属于Kubernetes集群自身。生产环境中应该以etcd集群的方式运行以确保其服务可用性。

Node组件

kubelet

kubelet是Node的核心代理程序,它是运行于工作节点之上的守护进程,从API Server接收关于Pod对象的配置信息并确保它们处于期望的状态(desired state)。kubelet会在API Server上注册当前工作节点,定期向Master汇报节点资源使用情况,并通过cAdvisor监控容器和节点的资源占用状况。

容器运行时环境

每个Node都需要容器运行时(ContainerRuntime)环境,才能下载镜像、启动容器。kubelet以插件的方式载入配置的容器环境,目前支持Docker、RKT、cri-o和Fraki等容器环境。

kube-proxy

每个Node都需要运行一个kube-proxy守护进程,它能够按需为Service资源对象生成iptables或ipvs规则,从而捕获访问当前Service的ClusterIP的流量并将其转发至正确的后端Pod对象。

Addons

Kubernetes集群还依赖于一系列add-ons以提供完整的功能,它们通常是由第三方提供的特定应用程序,且托管运行于Kubernetes集群之上,比如

  • KubeDNS:在Kubernetes集群中调度运行提供DNS服务的Pod,同一集群中的其他Pod可使用此DNS服务解析主机名。
  • Kubernetes Dashboard:可以通过Dashboard来管理集群中的应用甚至是集群自身。
  • Heapster:容器和节点的性能监控与分析系统,其功能会逐渐由Prometheus结合其他组件所取代。
  • Ingress Controller:与负载均衡相关。

Kubernetes网络模型基础

云计算的核心是虚拟化技术,网络虚拟化技术又是其最重要的组成部分,用于在物理网络上虚拟多个相互隔离的虚拟网络,实现网络资源切片,提高网络资源利用率,实现弹性化网络。

为了提供更灵活的解决方式,Kubernetes的网络模型需要借助于外部插件实现,它要求任何实现机制都必须满足以下需求:

  • 所有Pod间均可不经NAT(网络地址转换)机制而直接通信
  • 所有节点均可不经NAT机制而直接与所有容器通信
  • 容器自己使用的IP也是其他容器或节点直接看到的地址,所有Pod对象都位于同一平面网络中,而且可以使用Pod自身的地址直接通信。

Kubernetes集群包含三种网络:

  • 各主机(Master、Node和etcd等)自身所属的网络,用于各主机之间的通信,其地址配置于主机的网络接口,且在Kubernetes集群构建之前就已配置好,它并不能由Kubernetes管理。
  • 专用于Pod资源对象的网络,它是一个虚拟网络,用于为各Pod对象设定IP地址等网络参数,其地址配置于Pod中容器的网络接口之上。Pod网络需要借助kubenet插件或CNI插件实现,插件可独立部署于Kubernetes集群之外,也可托管于Kubernetes之上,在创建Pod对象时由其自动完成各网络参数(Pod IP)的动态配置。
  • 专用于Service资源对象的网络,也是虚拟网络,用于为Kubernetes集群之中的Service配置IP地址,但此地址并不配置于任何主机或容器的网络接口之上,而是通过Node之上的kube-proxy配置为iptables或ipvs规则,从而将发往此地址的所有流量调度至其后端的各Pod对象之上。Service网络在Kubernetes集群创建时予以指定,而各Service的地址(Cluster IP)则在用户创建Service时予以动态配置。

综上,Kubernetes为Pod和Service资源对象分别使用了各自的专用网络,Pod网络由Kubernetes的网络插件配置实现,而Service的网络则由Kubernetes集群予以指定。

学习资料

《Kubernetes实战进阶》 马永亮著

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

Kubernetes笔记 (1) - 系统概述 的相关文章

  • curl:(7)无法连接到192.168.99.100端口31591:连接被拒绝

    这些是我的豆荚 hello kubernetes 5569fb7d8f 4rkhs 0 1 ImagePullBackOff 0 5d2h hello minikube 5857d96c67 44kfg 1 1 Running 1 5d2h
  • 如何找出 Kubernetes 中可用的端口?

    我想在 kubernetes 集群中的不同端口上运行多个服务 并且想知道如何检查哪些端口可用并且不会与我的服务产生任何冲突 我还想知道每个端口上的服务名称 以便我可以更好地理解我的配置 有类似的问题涉及验证哪个NodePorts已经在使用中
  • 在 Kubernetes API 中启用 CORS

    有没有办法在 Kubernetes API 上启用 CORS 以便我可以使用不同的域向 Kubernetes API 发送 ajax 请求 通过将 cors allowed origins http 参数添加到 etc default ku
  • 解析 dockerfile 路径时出错:请使用 --dockerfile 在构建上下文中提供 Dockerfile 的有效路径

    apiVersion v1 kind Pod metadata name kaniko spec containers name kaniko image gcr io kaniko project executor latest args
  • Jenkinsfile 泊坞窗

    我正在 docker 容器内的 GCE 上运行一个 jenkins 实例 并希望从此 Jenkinsfile 和 Github 执行多分支管道 我正在使用GCE詹金斯 https cloud google com solutions con
  • prometheus 节点实例列表

    是否可以使用 prometheus 获取节点实例列表 我有一个节点导出器 但我没有看到这样的指标 我们应该添加一个新的运算符吗 您可以使用kube 状态指标 https github com kubernetes kube state me
  • 运行 istio-proxy 后启动容器/pod

    我正在尝试使用 Istio 和 Envoy 通过 Kubernetes 实现服务网格 我能够设置服务和 istio proxy 但无法控制容器和 istio proxy 的启动顺序 我的容器是第一个启动的 并尝试通过 TCP 访问外部资源
  • Kubernetes Pod 中现在几点了?

    假设我有一些 NET Core 代码在 k8s pod 中运行 我要求 DateTime Now 我假设我将从运行 pod 的主机获取日期时间 有没有办法获得在 k8s 集群中一致的日期时间值 容器中的时钟与主机相同 因为它由内核控制 时区
  • Kubernetes 集群自动缩放器似乎不适用于 GKE?

    我定义了一个节点池 最小实例设置为 1 最大实例设置为 5 并启用了自动缩放 但它似乎并没有缩小规模 我已经封锁了一个节点 已经过去12个多小时了 没有待处理的 Pod 删除节点不会减少我自己的部署的副本数量 相关节点上运行以下 pod f
  • 在容器中运行多个相似的进程有意义吗?

    提供有关该问题的背景的简要背景 目前 我和我的团队正在将微服务迁移到 k8s 以减少维护多个部署工具和管道的工作量 我们计划迁移的微服务之一是 ETL Worker 它监听 SQS 上的消息并执行多阶段处理 它是使用 PHP Laravel
  • Kubernetes - 服务之间的通信

    我目前正在开发 kubernetes 集群 集群工作正常 我需要在不使用代理的情况下建立服务之间的通信 例如我有以下服务 worker app1 app2 app3 Worker 需要直接通过 SSH 登录应用程序容器并执行一些命令 在 d
  • kubernetes/openshift 中的请求与限制 cpu

    我在为 Openshift 中的 pod 选择正确的请求和限制设置时遇到一些困境 一些数据 在启动期间 应用程序需要至少 600 毫核才能在 150 秒内完成就绪检查 启动后 200 毫核应该足以让应用程序保持空闲状态 所以我从文档中的理解
  • Podman:如何解析使用 Kubernetes YAML 部署的 pod 的主机名

    我正在使用 podman 4 5 dev 我使用以下方式部署了两个 Pod podman kube 播放 foo yaml podman kube play bar yaml 我在文件中指定了 pod 的主机名 但它们不会在容器内得到解析
  • 如何将新的 Kubernetes Minion 添加到当前集群

    我有一个运行在 3 台服务器上的 Kubernetes 集群 一台主服务器和 2 台服务器 我想添加另一个小黄人 是否可以添加 Minion 而无需再次进行完整安装 到目前为止 在寻找执行此操作的指南时 我只能找到有关建立整个集群的优秀指南
  • 有没有办法用Lettuce自动发现Redis集群中新的集群节点IP

    我有一个Redis集群 3主3从 运行在一个库伯内斯簇 该集群通过Kubernetes 服务 Kube 服务 我将我的应用程序服务器连接到 Redis 集群 使用Kube 服务作为 URI 通过 Redis 的 Lettuce java 客
  • Kubernetes 的艰难之路 - 如何设置节点不可调度

    我正在从头开始配置 Kubernetes 集群 原因 它是虚拟机内的本地设置 一切都很好 除了master节点被创建为可调度的 我尝试过分配master通过将所需参数传递给 kubelet 二进制文件来对节点进行标签和适当的污点 不能解决问
  • Kubernetes 通过基于时间的触发器扩展 Pod

    我有一台在 Kubernetes 上运行的服务器来处理每小时的处理作业 考虑使用服务来公开 pod 并使用 外部 cron 作业来访问负载均衡器 以便 kubernetes 可以根据需要自动缩放以处理更高的负载 然而在实现中 如果 cron
  • 如何防止两个卷声明在 Kubernetes 上声明同一个卷?

    在 GKE 上的 Kubernetes 集群上 我有以下持久卷声明 PVC kind PersistentVolumeClaim apiVersion v1 metadata name registry spec accessModes R
  • 指定命名空间时,无法使用 nginx-stable 中的 helm 安装 nginx ingress

    我有个问题 我正在尝试使用 helm 3 安装 nginx 但当我指定命名空间时它不起作用 知道为什么吗 它无需任何操作即可工作 helm install nginx release nginx stable nginx ingres n
  • Kubernetes / kubectl - “必须指定容器名称”,但看起来确实如此?

    我正在调试 kubectl 的日志输出 其中指出 Error from server BadRequest a container name must be specified for pod postgres operator 49202

随机推荐

  • STC单片机 普通 I/O 口中断功能介绍和使用

    STC单片机 普通 I O 口中断功能和使用 STC单片机普通 I O 口中断 不是传统外部中断 STC目前支持普通 I O 口中断的单片机 STC8部分以及STC32G STC8H 部分系列支持所有的 I O 中断 且支持 4 种中断模式
  • Apollo项目坐标系研究

    声明 本文系作者davidhopper原创 未经允许 不得转载 百度Apollo项目用到了多种坐标系 其中帮助文档提及的坐标系包括 全球地理坐标系 The Global Geographic coordinate system 局部坐标系
  • 雪花算法-项目中唯一ID的生成

    之前项目中使用雪花算法 生成全局唯一ID 记录一下 来源 https www cnblogs com relucent p 4955340 html 作者 永夜微光 package com wd cc common util Twitter
  • Texture::getSourceFileType()

    Texture getSourceFileType
  • 滑动窗口最大值——单调队列的实践

    一 单调队列的介绍 单调队列 即单调递减或单调递增的队列 而且 队首和队尾都可以进行出队操作 但只有队尾可以进行入队操作 它类似于下面这幅图 二 239 滑动窗口最大值 给你一个整数数组 nums 有一个大小为 k 的滑动窗口从数组的最左侧
  • vscode批量注释快捷键

    光标选中想要注释的所有代码 ctrl 取消同理
  • 如何在多线程异步的情况下保证事务?

    在Spring环境下 如果使用了 Transactional 注解 那么当你的 inert 操作时异步的话 则会不在当前事务里面 那么后续的回滚操作 不会将这次异步操作的插入进行回滚 那么我们有方式来保证多线程异步场景下的事务吗 Servi
  • React中的组件的渲染函数(Render Function)是什么?什么是React中的函数组件和类组件?如何在React中进行状态管理?

    1 请解释一下React中的组件的渲染函数 Render Function 是什么 以及如何使用和实现渲染函数 React中的组件可以有多种形式的渲染函数 包括传统的render 方法 以及近年来兴起的函数组件和Hooks中的useStat
  • vue封装组件

    在 Vue 中 封装组件可以使代码更加模块化和灵活 提高代码的复用性和可维护性 下面是一个简单的封装组件的示例 1 创建组件
  • Linux系统编程之信号

    本篇博客所回顾的知识 学习目标 一 信号介绍 从图中可以看出 信号的优先级是高于普通操作的 出现信号就一定要先执行完才能继续做之前的事情 注意 如何查看信号都有哪些呢 答 用命令 kill l 来do 注意 每一个进程都有一个唯一的定时器a
  • rabbitmq整合springboot:ChannelAwareMessageListener和@RabbitListener的使用

    Springboot中使用Rabbimq监听队列中有两种方式 一种是 RabbitListener注解的方式 一种是实现springboot ChannelAwareMessageListener接口的方式 前者使用如下 消费者 Compo
  • Windows 10版本business_editions和consumer_editions的区别?

    Windows 10版本business editions和consumer editions的区别 答1 二者都内置专业版 不同之处在于 consumer editions 版本包含 Home 家庭版 Education 教育版 Prof
  • websocket封装

    封装 class SocketPlugin constructor param this websocket null this isConnect false this timeoutNum null this isActivelyClo
  • 动态多光源 Light-Pre-Pass Lighting 实现

    辛苦数天 终于有所突破 在rendermonkey里用glsl实现的代码请去这里下载 关于渲染器结构设计可参见 http www cnblogs com cloudffx archive 2011 08 31 2160208 html 关于
  • java三种实现文件上传方法

    文章转载自点击看原文 前言 因自己负责的项目 jetty内嵌启动的SpringMvc 中需要实现文件上传 而自己对java文件上传这一块未接触过 且对 Http 协议较模糊 故这次采用渐进的方式来学习文件上传的原理与实践 该博客重在实践 一
  • 房屋租赁

    作者主页 编程指南针 作者简介 Java领域优质创作者 CSDN博客专家 CSDN内容合伙人 掘金特邀作者 阿里云博客专家 51CTO特邀作者 多年架构师设计经验 腾讯课堂常驻讲师 主要内容 Java项目 Python项目 前端项目 人工智
  • Android静态注册内部类广播BroadcastReceiver

    用静态注册内部类广播出现异常 09 14 11 31 25 576 E AndroidRuntime 3391 FATAL EXCEPTION main 09 14 11 31 25 576 E AndroidRuntime 3391 ja
  • Kettle下载Redisinput插件查询Redis数据

    Kettle下载Redisinput插件查询Redis数据 安装插件 1 下载Redisinput插件 https download csdn net download ispringmw 12909650 2 将完整插件包复制到Kettl
  • CGI之C语言篇

    为什么要进行CGI编程 在HTML中 当客户填写了表单 并按下了发送 submit 按钮后 表单的内容被发送到了服务器端 一般的 这时就需要有一个服务器端脚本来对表单的内容进行一些处理 或者是把它们保存起来 或者是按内容进行一些查询 或者是
  • Kubernetes笔记 (1) - 系统概述

    Kubernetes概述 Kubernetes由google开源 它的开发和设计都深受Google内部久负盛名的系统Borg的影响 而且 它的许多顶级贡献者之前也是Borg系统的开发者 Borg是Google内部使用的大规模集群管理系统 K