当前位置: 首页 > news >正文

K8s简介

1 简介

kubernetes简称k8s。是⽤于⾃动部署,扩展和管理容器化应⽤程序的开源系统。

中⽂官⽹:https://kubernetes.io/zh/
中⽂社区:https://www.kubernetes.org.cn/
官⽅⽂档:https://kubernetes.io/zh/docs/home/
社区⽂档:https://docs.kubernetes.org.cn/

Kubernetes 是⼀个可移植的、可扩展的开源平台,⽤于管理容器化的⼯作负载和服务(在k8s里部署的应用),可促进声明式配置和⾃动化(JSON格式)。 Kubernetes 拥有⼀个庞⼤且快速增⻓的⽣态系统。Kubernetes 的服务、⽀持和⼯具⼴泛可⽤。
名称 Kubernetes 源于希腊语,意为“舵⼿”或“⻜⾏员”。Google 在 2014 年开源了 Kubernetes 项⽬。
Kubernetes 建⽴在 Google 在⼤规模运⾏⽣产⼯作负载⽅⾯拥有⼗⼏年的经验 的基础上,结合了社区中最好的想法和实践。

2 K8s的部署和演化

在这里插入图片描述

传统部署时代:

早期,组织在物理服务器上运⾏应⽤程序。⽆法为物理服务器中的应⽤程序定义资源边界,这会导致资源分配问题。 例如,如果在物理服务器上运⾏多个应⽤程序,则可能会出现⼀个应⽤程序占⽤⼤部分资源的情况, 结果可能导致其他应⽤程序的性能下降。 ⼀种解决⽅案是在不同的物理服务器上运⾏每个应⽤程序,但是由于资源利⽤不⾜⽽⽆法扩展, 并且组织维护许多物理服务器的成本很⾼。

虚拟化部署时代:

作为解决⽅案,引⼊了虚拟化。虚拟化技术允许你在单个物理服务器的 CPU 上运⾏多个虚拟机(VM)。 虚拟化允许应⽤程序在 VM 之间隔离,并提供⼀定程度的安全,因为⼀个应⽤程序的信息 不能被另⼀应⽤程序随意访问。
虚拟化技术能够更好地利⽤物理服务器上的资源,并且因为可轻松地添加或更新应⽤程序,可以实现更好的实现可伸缩性,降低硬件成本等等。
每个 VM 是⼀台完整的计算机,在虚拟化硬件之上运⾏所有组件,包括其⾃⼰的操作系统。

容器部署时代:

容器类似于 VM,但是它们具有被放宽的隔离属性,可以在应⽤程序之间共享操作系统(OS)。 因此,容器被认为是轻量级的。容器与 VM 类似,具有⾃⼰的⽂件系统、CPU、内存、进程空间等。 由于它们与基础架构分离,因此可以跨云和 OS 发⾏版本进⾏移植。
容器因具有许多优势⽽变得流⾏起来。下⾯列出的是容器的⼀些好处:
**敏捷应⽤程序的创建和部署:**与使⽤ VM 镜像相⽐,提⾼了容器镜像创建的简便性和效率。
持续开发、集成和部署通过快速简单的回滚(由于镜像不可变性),⽀持可靠且频繁的 容器镜像构建和部署。
关注开发与运维的分离在构建/发布时⽽不是在部署时创建应⽤程序容器镜像, 从⽽将应⽤程序与基础架构分离。
可观察性不仅可以显示操作系统级别的信息和指标,还可以显示应⽤程序的运⾏状况和其他指标信号。
跨开发测试和⽣产的环境⼀致性:在便携式计算机上与在云中相同地运⾏。
跨云和操作系统发⾏版本的可移植性:可在 Ubuntu、RHEL、CoreOS、本地、 Google
Kubernetes Engine 和其他任何地⽅运⾏。
以应⽤程序为中⼼的管理:提⾼抽象级别,从在虚拟硬件上运⾏ OS 到使⽤逻辑资源在 OS 上运⾏
应⽤程序。
松散耦合、分布式、弹性、解放的微服务:应⽤程序被分解成较⼩的独⽴部分, 并且可以动态部署和管理 - ⽽不是在⼀台⼤型单机上整体运⾏。
资源隔离:可预测的应⽤程序性能。
资源利⽤:⾼效率和⾼密度。

3 K8s有哪些功能,可以做什么?

在⽣产环境中,你需要管理运⾏应⽤程序的容器,并确保不会停机。 例如,如果⼀个容器发⽣故障,则需要启动另⼀个容器。如果系统处理此⾏为,会不会更容易?
这就是 Kubernetes 来解决这些问题的⽅法! Kubernetes 为你提供了⼀个可弹性运⾏分布式系统的框架。 Kubernetes 会满⾜你的扩展要求、故障转移、部署模式等。 例如,Kubernetes 可以轻松管理系统的 Canary 部署。
Kubernetes 为你提供:
服务发现和负载均衡
Kubernetes 可以使⽤ DNS 名称或⾃⼰的 IP 地址公开容器,如果进⼊容器的流量很⼤,Kubernetes 可以负载均衡并分配⽹络流量,从⽽使部署稳定。

存储编排
Kubernetes 允许你⾃动挂载你选择的存储系统,例如本地存储、公共云提供商等。
⾃动部署和回滚
你可以使⽤ Kubernetes 描述已部署容器的所需状态,它可以以受控的速率将实际状态 更改为期望状态。例如,你可以⾃动化 Kubernetes 来为你的部署创建新容器, 删除现有容器并将它们的所有资源⽤于新容器。
⾃动完成装箱计算
Kubernetes 允许你指定每个容器所需 CPU 和内存(RAM)。 当容器指定了资源请求时,Kubernetes 可以做出更好的决策来管理容器的资源。
⾃我修复
Kubernetes 重新启动失败的容器、替换容器、杀死不响应⽤户定义的 运⾏状况检查的容器,并且在准备好服务之前不将其通告给客户端。
密钥与配置管理
Kubernetes 允许你存储和管理敏感信息,例如密码、OAuth 令牌和 ssh 密钥。 你可以在不重建容器镜像的情况下部署和更新密钥和应⽤程序配置,也⽆需在堆栈配置中暴露密钥。

4 K8s 不是什么

Kubernetes 不是传统的、包罗万象的 PaaS(平台即服务)系统。 由于 Kubernetes 在容器级别⽽不是在硬件级别运⾏,它提供了 PaaS 产品共有的⼀些普遍适⽤的功能, 例如部署、扩展、负载均衡、⽇志记录和监视。 但是,Kubernetes 不是单体系统,默认解决⽅案都是可选和可插拔的。 Kubernetes 提供了构建开发⼈员平台的基础,但是在重要的地⽅保留了⽤户的选择和灵活性。
Kubernetes:

  • 不限制⽀持的应⽤程序类型。 Kubernetes 旨在⽀持极其多种多样的⼯作负载,包括⽆状态、有状态和数据处理⼯作负载。
    如果应⽤程序可以在容器中运⾏,那么它应该可以在 Kubernetes 上很好地运⾏。
  • 不部署源代码,也不构建你的应⽤程序。 持续集成(CI)、交付和部署(CI/CD)⼯作流取决于组织的⽂化和偏好以及技术要求。
  • 不提供应⽤程序级别的服务作为内置服务,例如中间件(例如,消息中间件)、 数据处理框架(例如,Spark)、数据库(例如,mysql)、缓存、集群存储系统 (例如,Ceph)。这样的组件可以在
    Kubernetes 上运⾏,并且/或者可以由运⾏在 Kubernetes 上的应⽤程序通过可移植机制(例如, 开放服务代理)来访问。
  • 不要求⽇志记录、监视或警报解决⽅案。 它提供了⼀些集成作为概念证明,并提供了收集和导出指标的机制。
  • 不提供或不要求配置语⾔/系统(例如 jsonnet),它提供了声明性 API, 该声明性 API 可以由任意形式的声明性规范所构成。
  • 不提供也不采⽤任何全⾯的机器配置、维护、管理或⾃我修复系统。
  • 此外,Kubernetes 不仅仅是⼀个编排系统,实际上它消除了编排的需要。 编排的技术定义是执⾏已定义的⼯作流程:⾸先执⾏ A,然后执⾏ B,再执⾏ C。 相⽐之下,Kubernetes 包含⼀组独⽴的、可组合的控制过程, 这些过程连续地将当前状态驱动到所提供的所需状态。 如何从 A 到 C 的⽅式⽆关紧要,也不需要集中控制,这使得系统更易于使⽤ 且功能更强⼤、系统更健壮、更为弹性和可扩展。
    在这里插入图片描述

5 架构

5.1 主从架构

在这里插入图片描述
在这里插入图片描述

5.2 master节点

在这里插入图片描述

  1. kube-apiserver

API 服务器是 Kubernetes 控制⾯的组件, 该组件公开了 Kubernetes API。 API 服务器是 Kubernetes控制⾯的前端。
Kubernetes API 服务器的主要实现是 kube-apiserver。 kube-apiserver 设计上考虑了⽔平伸缩,也就是说,它可通过部署多个实例进⾏伸缩。 你可以运⾏ kube-apiserver 的多个实例,并在这些实例之间平衡流量。

  1. etcd

etcd 是兼具⼀致性和⾼可⽤性的键值数据库,可以作为保存 Kubernetes 所有集群数据的后台数据库。
您的 Kubernetes 集群的 etcd 数据库通常需要有个备份计划。
要了解 etcd 更深层次的信息,请参考 etcd ⽂档。

  1. kube-scheduler

控制平⾯组件,负责监视新创建的、未指定运⾏节点(node)的 Pods,选择节点让 Pod 在上⾯运⾏。
调度决策考虑的因素包括单个 Pod 和 Pod 集合的资源需求、硬件/软件/策略约束、亲和性和反亲和性规范、数据位置、⼯作负载间的⼲扰和最后时限。

  1. kube-controller-manager

在主节点上运⾏ 控制器 的组件。
从逻辑上讲,每个控制器都是⼀个单独的进程, 但是为了降低复杂性,它们都被编译到同⼀个可执⾏⽂件,并在⼀个进程中运⾏。

这些控制器包括:
节点控制器(Node Controller): 负责在节点出现故障时进⾏通知和响应。
副本控制器(Replication Controller): 负责为系统中的每个副本控制器对象维护正确数量的Pod。
端点控制器(Endpoints Controller): 填充端点(Endpoints)对象(即加⼊ Service 与 Pod)。
服务帐户和令牌控制器(Service Account & Token Controllers): 为新的命名空间创建默认帐户和 API 访问令牌。

  1. cloud-controller-manager

云控制器管理器是指嵌⼊特定云的控制逻辑的 控制平⾯组件。 云控制器管理器允许您链接聚合到云提供商的应⽤编程接⼝中, 并分离出相互作⽤的组件与您的集群交互的组件。
在这里插入图片描述

5.3 Node 节点

节点组件在每个节点上运⾏,维护运⾏的 Pod 并提供 Kubernetes 运⾏环境。
在这里插入图片描述
在这里插入图片描述
pod 之间互联是通过代理来进行的

5.4 整体架构

Kubetcl 发送命令给主节点,(进行一次部署),APIServer接收到命令以后,由scheduler调度给node节点运行这些部署。这其中产生的数据会存储在etcd里面以供读取,部署的时候一些产生的副本数量的管理,副本是由controller在master里面运行的controller完成的这些工作。
然后node节点接收到部署的命令以后,由Kubnelet节点的代理对象负责把相应的pod里面。(Pod是K8s里面最小的一个部署单元,Pod里可以部署几个服务,我们可以把容器运行到Pod里面,由Pod来组织这一类容器,一个Pod里的容器由独立的IP)。外网会通过网络代理来访问我们的Pod(Pod里面的容器),最终访问到我们里边的服务。
在这里插入图片描述
Container:容器,可以视docker启动的⼀个容器
Pod:
k8s使⽤Pod来组织⼀组容器
⼀个Pod中的所有容器共享同⼀⽹络
Pod是K8s中的最⼩部署单元
Volume
声明在Pod容器中可以访问的⽂件⽬录
可以被挂载在Pod中的⼀个或多个容器指定路径
⽀持多种后端存储抽象(本地存储,分布式存储,云存储…)

在这里插入图片描述

在这里插入图片描述
Controller:更⾼层的对象,部署和管理Pod

ReplicaSet:确保预期的Pod副本数量
Deplotment:⽆状态应⽤部署
StatefulSet:有状态应⽤部署
DaemonSet:确保所有的Node都运⾏⼀个指定的
Pod Job:⼀次性任务
Cronjob:定时任务

Deployment:

定义⼀组Pod的副本数⽬、版本等
定义控制器(Controller)维持Pod数⽬(⾃动恢复失败的Pod)
通过控制器⼀直盯的策略控制版本(滚动升级,回滚等)

在这里插入图片描述
Service:
定义⼀组Pod的访问策略
Pod的负载均衡,提供⼀个或者更多的Pod的稳定访问地址
⽀持多种访问及⽅式(ClusterIP、NodePort、LoadBalance)

向外暴露,一个service下有两个pods,这就是service的负载均衡
在这里插入图片描述
Label:标签,⽤于对象资源的查询,筛选

在这里插入图片描述
Namespace:命名空间,逻辑隔离
⼀个集群内部的逻辑隔离机制(鉴权,资源)
每个资源都属于⼀个namespace
同⼀个namespace的所有资源名不能重复
不同namespace可以资源名重复

在这里插入图片描述
API:
我们可以通过k8s的API来操作整个集群
可以通过kubctl、ui、curl最终发送http+json/yaml⽅式请求提交给API Server,然后控制k8s集群,k8s⾥的所有的资源对象都可以采⽤yaml或者json格式的⽂件定义或者描述
在这里插入图片描述

5.5流程描述

  1. 通过kubectl提交⼀个创建RC(Replication Controller)的请求,改请求通过APIServer被写⼊etcd中
  2. 此时Controller Manager通过Api Server的监听资源变化的接⼝监听到此RC事件
  3. 分析后,发现当前集群还没有他说对应的Pod实例
  4. 于是根据RC⾥⾯Pod模板定义⽣成⼀个Pod对象,通过APIServer写⼊etcd
  5. 此事件被Scheduler发现,他⽴即执⾏⼀个复杂的调度流程,为这个新的Pod选定⼀个落户的Node,然后通过APIServer将这⼀结果写⼊etcd中
  6. ⽬标Node上运⾏的Kubelet进程通过API Server检测到这个新⽣的 Pod,并按照他的定义,启动该Pod,然后负责此pod的⽣命周期的管理
  7. 随后,我们通过Kubectl提交⼀个新的映射到该Pod的service的创建请求
  8. ControllerManager通过Label标签查询到关联的Pod实例,然后⽣成service的Endpoints信息,并通过APiServer写⼊到etcd中
  9. 接下来,所有的Node上运⾏的Proxy进程通过ApiServer查询并监听service对象与其对应的Endpoints信息,建⽴⼀个软件⽅式的负载均衡器实现Service访问到后端Pod的流量转发功能

k8s⾥的所有的资源对象都可以采⽤yaml或者json格式的⽂件定义或描述
在这里插入图片描述
6 快速体验
(1)安装minikube
https://github.com/kubernetes/minikube/releases
下载minikuber-windows-amd64.exe 改名为minikube.exe
打开virtualBox,打开cmd
运⾏

minikube start --vm-driver=virtualbox --registry-mirror=https://registry.docker-cn.com

等待20分钟即可
(2)体验nginx部署升级

  1. 提交⼀个nginx deployment
    kubectl apply -f https://k8s.io/examples/application/deployment.yaml
  2. 升级 nginx deployment
    kubectl apply -f https://k8s.io/examples/application/deployment-update.yaml
  3. 扩容 nginx deployment

相关文章:

  • pat练习
  • 计算建模之EM算法
  • Django-(2)
  • opencv remap inverse 这里的x,y是dst下的,所以我没法在知道src的x,y下得到该点在dst的位置.
  • 温故知新(十三)——CAN
  • 如何跳出forEach循环
  • 大咖论道|银行核心系统国产分布式数据库选型思考
  • 简单5分钟,将lowcode低代码融入到你的中后台管理系统
  • token、cookie、session
  • 强大多云混合多K8S集群管理平台Rancher入门实战
  • 学习编程的第二十四天
  • 第五十一周总结——对象遍历方法
  • java计算机毕业设计民宿预订管理系统设计与实现源码+数据库+系统+lw文档+mybatis+运行部署
  • 渗透测试-微信小程序-公众号测试经验总结
  • innodb存储引擎学习–备份
  • CSS 专业技巧
  • CSS实用技巧干货
  • Docker 笔记(2):Dockerfile
  • export和import的用法总结
  • IndexedDB
  • iOS 颜色设置看我就够了
  • java 多线程基础, 我觉得还是有必要看看的
  • JavaSE小实践1:Java爬取斗图网站的所有表情包
  • MobX
  • vue数据传递--我有特殊的实现技巧
  • 从PHP迁移至Golang - 基础篇
  • 机器学习学习笔记一
  • 机器学习中为什么要做归一化normalization
  • 前端攻城师
  • 如何选择开源的机器学习框架?
  • 算法之不定期更新(一)(2018-04-12)
  • 微信小程序上拉加载:onReachBottom详解+设置触发距离
  • 新版博客前端前瞻
  • 学习ES6 变量的解构赋值
  • 用Visual Studio开发以太坊智能合约
  • Python 之网络式编程
  • Unity3D - 异步加载游戏场景与异步加载游戏资源进度条 ...
  • 阿里云重庆大学大数据训练营落地分享
  • 基于django的视频点播网站开发-step3-注册登录功能 ...
  • 专访Pony.ai 楼天城:自动驾驶已经走过了“从0到1”,“规模”是行业的分水岭| 自动驾驶这十年 ...
  • # centos7下FFmpeg环境部署记录
  • # include “ “ 和 # include < >两者的区别
  • (2021|NIPS,扩散,无条件分数估计,条件分数估计)无分类器引导扩散
  • (aiohttp-asyncio-FFmpeg-Docker-SRS)实现异步摄像头转码服务器
  • (非本人原创)我们工作到底是为了什么?​——HP大中华区总裁孙振耀退休感言(r4笔记第60天)...
  • (学习日记)2024.04.04:UCOSIII第三十二节:计数信号量实验
  • .NET 发展历程
  • .NET/C# 的字符串暂存池
  • .NET/C# 使用 #if 和 Conditional 特性来按条件编译代码的不同原理和适用场景
  • .NETCORE 开发登录接口MFA谷歌多因子身份验证
  • .NET程序员迈向卓越的必由之路
  • .NET精简框架的“无法找到资源程序集”异常释疑
  • .NET业务框架的构建
  • []常用AT命令解释()
  • [20161214]如何确定dbid.txt