进击的K8S:Kubernetes基础概念
Kubernetes简介
Kubernetes简称K8S(因为k和s中间有8个字母),是一个开源的容器集群管理平台,基于Go语言编写。
使用K8S,将简化分布式系统上的容器应用部署,使得开发人员可以专注于业务软件,而非较为底层的负载均衡、服务监控等。因此,可以认为它是介于操作系统软件和应用软件之间的”中间件“。K8S具有强大的自动化机制,降低了系统后期的运维难度。
此外,K8S没有限定编程接口,无论Java、Go、C++还是Python编写的服务,都可以映射为K8S的Service。并且由于其对现有的语言、框架、中间件没有任何侵入性,使得服务易于迁移到K8S上。
本文力图使用通俗易懂的语言概括Kubernetes的一些概念。在阅读本文前,你至少需要对Linux、docker、容器、yaml/json等有所了解。
Kubernetes概貌认知
在遇到一项新技术时,笔者习惯于先搞清楚它“是什么“,为什么被发明出来,是如何使用和运作的。
为什么需要Kubernetes
如果读者对容器有所了解,并且有一定的使用经验,那么就很容易理解Kubernetes存在的理由。
容器是运行在物理机上的轻量化“虚拟机”,一般一个应用程序就会启用一个容器。由于各种原因,容器中的程序也许会出现错误,甚至容器和服务器本身会挂掉。在云数据中心有大量的服务器,每台服务器上可能运行着几十个乃至上百个容器,如果单纯靠运维人员去监视、操作每个容器,那肯定是不现实的。因此就需要更高一层的容器编排管理程序,来自动化地管理容器应用。
或许我们可以自己去搭建这个平台,不过Kubernetes的出现为我们省去了许多麻烦。有了Kubernetes,我们只需要安装和启动它的一组服务就可以了。开发或运维人员只需要编写一些yaml或json文件,指定集群的期望状态,然后在Terminal运行kubectl命令对集群进行操作,剩下的过程都由Kubernetes自动完成。这样,开发人员就可以专注于业务应用,而非与大量的服务器硬件和操作系统本身打交道,同时后期运维也变得非常简单。
Kubernetes的服务组成
通常至少需要启动以下的服务以构成完整的Kubernetes系统:
- etcd:数据库。平台内的各种数据、程序的状态在这里存储和交换。不过etcd并不是Kubernetes实现的,后者只是使用它作为平台的数据库。
- docker:Kubernetes管理的对象。准确来说管理的对象是容器,docker只是Kubernetes支持的容器运行时的其中一种。当然,它本身也不是Kubernetes实现的。
- kube-apiserver:各类资源的增、删、改、查、watch等操作的统一接口。
- kube-controller-manager:集群的管理控制中心,负责各类资源的管理。比如某个Node宕机时,controller-manager会发现故障并自动化修复,保证集群处在预期的工作状态。简单来说,它解决Pod数量和状态“对不对”的问题。
- kube-scheduler:负责POD的调度工作,负责将Controller Manager创建的Pod调度到具体的Node上。简单来说,它解决controller manager创建的Pod“去哪”的问题。
- kubelet:运行在Node上,管理下发到本节点的Pod本身及Pod中的容器。
- kube-proxy:Kubernetes集群内有大量的容器和服务,它们通过TCP相互通信,kube-proxy就负责解决通信的问题。
你可以通过Kubernetes官网的这张图来了解其整体结构:
Kubernetes关键概念
或许上一节的一些术语还让读者非常疑惑,现在我们一起来具体看看一些重要概念的意思。
集群和节点
一个集群就是数台运行着应用程序的服务器,每台服务器被称为一个节点,至少3个节点才可以称得上是一个集群。
节点可以是物理机,也可以是虚拟机(传统意义上的),只要能够运行docker和Kubernetes服务。
节点有2种:
- 主节点Master:是整个集群的管理中心。Master上运行的进程包括:
- etcd
- kube-apiserver
- kube-controller-manager
- kube-scheduler
- 工作节点Node:运行具体的工作负载(容器中的应用程序)。Node上运行的进程包括:
- 容器运行时
- kubelet
- kube-proxy
Tip:此处有一个小的歧义,工作节点Node直译也是节点。“节点”一词到底是Node和Master的合称,还是单指Node,英文语境下似乎是后者,而中文里似乎比较模糊。笔者目前习惯于将Node和Master都称作”节点“,而将Node称作”工作节点“,这样指代比较明确。
Node可以在运行期间动态加入集群,默认情况下kubelet会向Mater注册自己。一旦加入集群,kubelet会定时向Mater节点汇报自身状态,以便Master进行管理调度。
如果某个Node超过指定时间没有上报信息,就会被Master判定为失联。该Node的状态将被标记为Not Ready,上面的负载会被转移。
对象
Kubernetes对象是Kubernetes系统中的持久实体。Kubernetes使用这些实体来表示集群的状态,包括:
- 哪些容器正在运行,运行在那些Node上
- 容器应用可用的资源
- 关于应用如何运行的策略
一旦创建了对象,Kubernetes会确保对象存在。通过创建对象,可以告诉Kubernetes系统你希望集群的目标状态是什么样的。
一般在yaml或json文件中定义对象,再通过Kubernetes API来使用(增删改查)。有两种方式来操作对象(即调用API),一是通过kubectl命令行工具调用,二是在编程语言中调用——目前官方提供了Go和Python的库。
Tip:对象不是一个进程或一组进程,指示对象存在的是一段信息的记录(通常是etcd中或文件中)。
Name和UID
所有对象都用Name和UID来明确标识。
Name就是对象的名称,通常一部分是由用户在对象定义文件中自定义的。那么另一部分是什么?
可以思考这样一个问题:以上面的Pod为例,假如有5个myweb应用的副本(这非常正常,短时间内很可能有多个用户访问一个网页),如何区分它们?笔者理解的是,Kubernetes创建Pod时会在Name中加上一段随机的字符,以区分不同的副本,如myweb-w3ec4,myweb-t9p84等(笔者随便写的,具体的机制还没有学习到,大概也是哈希之类)。这有点类似于git的版本号。
从上面也可以看出,一个Name在同一时间只能被一个对象拥有。如果对象被删除,可以使用相同的Name创建新的对象。
UID则完全是由Kubernetes生成的。在Kubernetes集群的整个生命周期内,每个对象都拥有不同的UID。也就是说,不仅同一时刻所有的对象UID都不同,而且即便某个对象被删除后重新创建,也会拥有不同的UID。
Pod
Pod可以说是Kubernetes中最重要的对象,它是Kubernetes中的最小部署单元。Pod通常由一组容器构成,包括一个根容器,和其他一些共同完成业务功能的容器。如下图所示:
为什么不以容器本身作为管理的单元,而是又抽象出Pod?原因主要有以下几点:
- 一项业务功能通常是由好几个应用程序共同完成的,需要作为一个整体。但单个业务容器异常不能代表业务整体挂掉,难以判断一项业务是否正常进行。抽象为Pod之后,用根容器的状态代表整个Pod的状态解决了这个问题。
- Pod内部通过共享根容器挂载的卷,简化了业务容器间的通信。
- Pod内部共享根容器的IP,简化了与Pod之间(不同业务之间)的通信。
Pod的两种类型
Pod信息存放的位置,实际上对应了Pod的两种类型:普通Pod,静态Pod。
普通Pod被创建后,其信息会被存放在etcd数据库中,然后会被调度到具体的Node上进行绑定,该Node中的kubelet将其实例化成一组容器。默认情况下,如果一个容器出现问题,Kubernetes检测到后将重启整个Pod——实际上是重启Pod中的所有容器。如果Node宕机,则将在其他Node重新生成新的完全一样的Pod代替它。
与此相反,静态Pod则比较特殊,其信息存放在某个具体的Node上的一个具体文件中,只在此Node运行,不会被转移。
Pod的资源限额
可以对Pod使用的计算资源做限额,包括CPU和Memory两种。
CPU限额的单位是千分之一个CPU核心,记作m。通常一个容器的配额有100300m,即0.10.3个CPU核心。Memory限额的单位是内存字节数。
对配额限定有两个参数:
- Requets:资源的最小申请量,系统必须满足要求。
- Limits:资源最大允许使用的量,超过它可能会kill该容器并重启。
Service
Service是Kubernetes中另一种重要的对象,它定义了一种访问实体资源(如Pod)的策略,或者说入口,这就是通常说的“微服务”。
考虑一个图片处理的后台应用,它有3个副本。这些副本是可以互相代替的,也就是访问谁的效果都是一样的,甚至可能挂掉重启。前端不应该也没必要关心到底调用哪个副本,Service定义的统一入口实现了前后端的解耦。
Pod的IP会随着Pod本身的销毁和创建发生变化。与此相反,每个Service创建时都会被分配一个全局唯一的虚拟IP地址,称为Cluster-IP。在Service的整个生命周期内,该Cluster-IP不会发生变化。客户端实际上访问的是Service,并且我们还希望客户端能够通过名称去访问。
“通过名称而不是地址去访问”,这句话让读者有何联想?没错,就是DNS。用Service的Name与Service的Cluster-IP做一个DNS域名映射,这就是Kubernetes的服务发现机制。
参考资料:
《Kubernetes权威指南》(龚正等著)
进击的K8S:Kubernetes基础概念的更多相关文章
- Kubernetes(K8s)基础概念 —— 凿壁偷光
Kubernetes(K8s)基础概念 -- 凿壁偷光 K8s是什么:全称 kubernetes (k12345678s) 作用:用于自动部署,扩展和管理"容器化应用程序"的 ...
- 1-2、kubernetes架构概述和kubernetes基础概念
kubernetes https://draveness.me/understanding-kubernetes http://kubernetes.kansea.com/docs/ master/n ...
- kubernetes基础概念知多少
kubernetes(简称k8s)是一种用于在一组主机上运行和协同容器化应用程序的管理平台,皆在提供高可用.高扩展性和可预测性的方式来管理容器应用的生命周期.通过k8s,用户可以定义程序运行方式.部署 ...
- K8s - Kubernetes重要概念介绍(Cluster、Master、Node、Pod、Controller、Service、Namespace)
K8s - Kubernetes重要概念介绍(Cluster.Master.Node.Pod.Controller.Service.Namespace) Kubernetes 是目前发展最 ...
- 【k8s】基础概念 + 工作原理
工作原理: 原理图 工作原理描述: 1>用户通过kubectl或者API server的REST API接口,提交需要运行的docker容器(创建pod请求): 2>api server将 ...
- 4、kubernetes基础概念
一.基础概念 1.Master节点 整个集群的控制中枢.Master节点是Kubernetes集群的控制节点,在生产环境中不建议部署集群核心组件外的任何Pod,公司业务的Pod更是不建议部署到Mast ...
- 从零开始入门 K8s | Kubernetes 网络概念及策略控制
作者 | 阿里巴巴高级技术专家 叶磊 一.Kubernetes 基本网络模型 本文来介绍一下 Kubernetes 对网络模型的一些想法.大家知道 Kubernetes 对于网络具体实现方案,没有什 ...
- 入门Kubernetes -基础概念
一.Kubernetes概述 Kubernetes ,又称为 k8s(首字母为 k.首字母与尾字母之间有 8 个字符.尾字母为 s,所以简称 k8s)或者简称为 "kube" ,是 ...
- kubernetes基础概念
kubernetes是基于容器技术的分布式架构领先方案.具有完备的集群管理能力,包括多层次的安全防护和准入机制.多租户应用支撑能力.透明的服务注册和服务发现机制.内建智能负载均衡器.强大的故障发现和自 ...
- Kubernetes基础概念及架构概述
Kubernetes 架构 Kubernetes是一个全新的基于容器技术的分布式架构,虽然Kubernetes只有三年,但它是谷歌十几年以来大规模应用容器技术的经验积累和升华的一个重要发展成果.确切的 ...
随机推荐
- kvm命令管理虚拟机
virsh 既有命令行模式,也有交互模式,在命令行直接输入 virsh 就进入交互模式, virsh 后面跟命令参数,则是命令行模式: KVM 工具集合 libvirt:操作和管理KVM虚机的虚拟化 ...
- kubernetes kubectl 命令自动补全
yum install -y bash-completion source /usr/share/bash-completion/bash_completion source <(kubectl ...
- 使用docker-compose方式部署es和kibana以及cerebro
使用的镜像可以从这个网站查看最新的:https://hub.docker.com/ 参考极客时间上的教程转发来的 使用步骤:安装docker和docker-compose 运行: docker-com ...
- .Net 7 C#11 原始字符串
.Net7 的到来的同时,也带来了 C# 11,而令我最期待的就是 C# 11 的 原始字符串了,当我知道这个的时候,简直比过年还要开心. 非原始字符串 首先我们看看现在写字符串的方式 var str ...
- 从 C# 崩溃异常 中研究页堆布局
一:背景 1.讲故事 最近遇到一位朋友的程序崩溃,发现崩溃点在富编辑器 msftedit 上,这个不是重点,重点在于发现他已经开启了 页堆 ,看样子是做了最后的挣扎. 0:000> !analy ...
- 220726 T1 树染色问题 (树的直径)
题目描述 高钧在校园中漫步时,经过了一棵树.这时,几个同学突然冒出来控制住了他. 这棵树有 nn 个节点, 每个节点有黑白两种颜色, 为了更好的 alb , 需要把所有节点染成同一种颜色. 为了更好的 ...
- 220403 考试爆炸记 (T1T2)
T1 最大约数和 先放一下我考时的代码.(没想到能A过洛谷的数据,可能是洛谷的数据有点弱) #include<bits/stdc++.h> using namespace std; int ...
- 为什么ArrayList的subList结果不能转换为ArrayList????
subList是List接口中的一个方法,该方法主要返回一个集合中的一段子集,可以理解为截取一个集合中的部分元素,它的返回值也是一个List. 让我们初始化一个例子: import java.util ...
- 个人数据保全计划:(1) NAS开箱
前言 从几年前第一个硬盘故障导致参赛的文件丢失之后,我就开始意识到数据安全的重要性,开始用各种云盘做备份,当时还不是百度云一家独大,我们也都没意识到网盘备份是极其不靠谱的行为,直到因为某些不可抗力因素 ...
- 齐博x1标签实例:调用多个圈子同时调用贴子
下面讲解,在首页,如何调用圈子的同时也调用他们相关的贴子. 单单调用圈子,就像调用文章一样,很多人都能轻松实现,比如下面的代码 {qb:tag name="xxx" type=&q ...