带你一步一步摸索k8s

前提:

注:本文主要来源于作者在学习k8s的过程中的理解以及感悟

本文主要以作者的学习总结以及本人的理解来解释k8s

若有错误请指正!!

好,话不多说,我们开始( ̄︶ ̄)↗ 

k8s是什么?

这个是k8s的图标

上面就是k8s的图标,是不是看上去很像海盗船的船舵,没错,Kubernetes 这个名字源于希腊语,意为“舵手”或“飞行员”。k8s 这个缩写是因为 k 和 s 之间有八个字符的关系。而且是谷歌“藏了多年的秘密武器”——-Borg 系统的开源版本

好,现在我们知道了这个就是k8s,那我为什么需要k8s呢?我的虚拟机弄的好好的,怎么就要用k8s用docker容器呢?别着急,我们接着往下看

为什么需要k8s?

我们都知道写完软件之后需要进行部署,让我们先了解技术的进化之旅

1.传统物理部署

在很久很久以前(bushi),我们还是将软件直接部署到物理机上,这样的话不需要其他的技术干预,但是呢,关于资源的分配难以控制,因为都在一个物理机上,资源共享,会不可避免的产生资源竞争,程序之间会互相影响。不是说因为资源不隔离嘛,那我就隔离不就好了,所以虚拟化部署就出现了。

2.虚拟化部署

虚拟化部署就是在传统物理机的情况下,将物理机虚拟化成多个虚拟机,这样每个虚拟机的资源就隔离了,问题不就解决了吗,但是随着物联网的发展,虚拟化的技术也开始力不从心,每一个虚拟机都有一个操作系统,这个资源不就浪费了吗,那该怎么办呢?那我所有的运行需要的基本资源比如:操作系统,我全部封装起来共用,这样不就解决浪费问题了吗,所以容器化部署就出现了。

3.容器化部署

可以理解为轻量化的虚拟技术,就是每个容器都有自己的文件系统以及资源,但是共享操作系统。因此效率更高,损耗更少。

好了,我们知道了容器化部署是我们现在的主流,那新的问题就来了,如果我的一个容器挂了,怎么去快速新增一个新的容器来顶替呢?或者,如果我的并发量很大的时候,我怎么横向增加容器呢?

以上这些问题统称为“容器编排”问题,因为有这些问题,所以就有了容器编排工具,到这里我想你应该知道了,没错,k8s就是目前主流的容器编排工具。

所以k8s的出现就是为了解决容器编排问题,并且还提供一些额外的功能去便利我们对容器的部署以及管理,主要功能如下:

  • 自我修复:一旦某一个容器崩溃,能够在1秒中左右迅速启动新的容器
  • 弹性伸缩:可以根据需要,自动对集群中正在运行的容器数量进行调整
  • 服务发现:服务可以通过自动发现的形式找到它所依赖的服务
  • 负载均衡:如果一个服务起动了多个容器,能够自动实现请求的负载均衡
  • 版本回退:如果发现新发布的程序版本有问题,可以立即回退到原来的版本
  • 存储编排:可以根据容器自身的需求自动创建存储卷

好了,我们了解了为啥有k8s以及k8s的基础功能和它出现的目的,接下来,让我们仔细了解一下k8s当中的一些组件以及内部构造

k8s集群构造以及组件

k8s组件

我先通过一个概念来引入k8s集群的组件,首先我想各位学过redis和mysql的话应该都了解“主从”这个概念,就是主节点和从节点,k8s集群也是如此,主节点为“master”,从节点为“node”,master也叫控制节点,node也叫工作节点,其中

master负责集群的控制平面,负责集群的决策 ( 管理 ),而node则负责集群的数据平面,负责为容器提供运行环境 ( 干活 ),这下就清晰多了吧。

在master当中有几个重要的组件(现在知道有这些组件即可,混个眼熟后续使用之后慢慢就理解了)

ApiServer : 资源操作的唯一入口,接收用户输入的命令,提供认证、授权、API注册和发现等机制

Scheduler : 负责集群资源调度,按照预定的调度策略将 Pod 调度到相应的 node 节点上

ControllerManager : 负责维护集群的状态,比如程序部署安排、故障检测、自动扩展、滚动更新等

Etcd :负责存储集群中各种资源对象的信息,相当于 K8S 的数据库

在node中也有几个对应重要的组件

Kubelet : 负责维护容器的生命周期,即通过控制docker,来创建、更新、销毁容器

KubeProxy : 负责提供集群内部的服务发现和负载均衡

Container runtime:负责镜像管理以及 Pod 和容器的真正运行(CRI)例如(docker)

以上就是k8s集群中的基础组件以及架构,也可以结合下面的图片进行理解

上图就是k8s的基本工作流程

我将举一个例子来解释k8s的基本工作机制,该例子来源于阿里云社区中的一篇文章中,例子如下

以部署一个 nginx 服务来说明 kubernetes 系统各个组件调用关系:

  1. 首先要明确,一旦 kubernetes 环境启动之后,master 和 node 都会将自身的信息存储到 etcd 数据库中;
  2. 一个 nginx 服务的安装请求会首先被发送到 master 节点的 apiServer 组件;
  3. apiServer 组件会调用 scheduler 组件来决定到底应该把这个服务安装到哪个 node 节点上,在此时,它会从 etcd 中读取各个 node 节点的信息,然后按照一定的算法进行选择,并将结果告知 apiServer;
  4. apiServer 调用 controller-manager 去调度 Node 节点安装 nginx 服务;
  5. kubelet 接收到指令后,会通知 docker,然后由 docker 来启动一个 nginx 的 pod,pod 是 kubernetes 的最小操作单元,容器必须跑在 pod 中;
  6. 当Pod启动后,一个 nginx 服务就运行了,如果需要访问 nginx,就需要通过 kube-proxy 来对 pod 产生访问的代理

这样,外界用户就可以访问集群中的 nginx 服务了

了解了k8s的基本组件,再来看看k8s的基础架构

k8s基本架构

大概分为以下几层

生态系统层:在接口层之上的庞大容器集群管理调度的生态系统,可以划分为两个范畴:

Kubernetes 外部:日志、监控、配置管理、CI、CD、Workflow、FaaS、OTS 应用、ChatOps 等

Kubernetes 内部:CRI、CNI、CVI、镜像仓库、Cloud Provider、集群自身的配置和管理等

就像是你的手机里的应用商店,下载高德地图就可以进行导航,但是你的手机并不需要内置地图数据

接口层:顾名思义,简单来说就是“遥控器”,你可以通过kubectl命令去操控集群,比如你想看你的命名空间下有哪些容器,可以直接使用 kubectl get pods -n <命名空间>即可,直接使用命令行工具

管理层:就像是“任务管理器+防火墙”,会监控你的CPU等资源是否够用,在遇到流量暴增的时候会自动进行扩容操作,而且也会设置权限,比如普通用户不能删除系统文件等

应用层:启动你部署的应用,并且会分配路径以及进行负载均衡操作,就比如:你安装微信后,系统自动分配一个账号(类似服务发现),好友通过这个账号找到你。

核心层:Kubernetes 最核心的功能,对外提供 API 构建高层的应用,对内提供插件式应用执行环境。就像你买电脑时不用关心主板怎么设计,直接用它的接口插鼠标、键盘就行

然后我再用一个通俗的例子解释:

想象你要开一家奶茶店(相当于部署应用):

  1. ​核心层​​是店铺的营业执照和基础水电(必须要有)。
  2. ​应用层​​是制作奶茶的设备和小程序点单系统(让顾客能下单)。
  3. ​管理层​​是店长,负责监控销量、自动补货原料、管理员工权限。
  4. ​接口层​​是收银台的POS机,店员用它操作整个系统。
  5. ​生态系统​​是外卖平台、会员系统等第三方合作,帮你扩大生意。

通过这种分层设计,K8s既能保证核心稳定,又能灵活扩展新功能

以上就是所有我在学习中对于k8s的理解,下面我会给出,k8s中比较重要的一些概念名词的解释总结,这样可以让我在学习k8s的时候不会觉得很抽象。

k8s核心概念以及专业术语

一、基础概念

Pod

是什么:最小的部署单元,通常包括一个主容器以及多个辅助容器(例如日志收集器)

作用:容器之间共享网络、存储和生命周期,适合紧密工作的容器组

举个栗子:部署web应用+日志收集器在一个Pod,共享日志文件

Node(节点)

是什么:k8s集群中的工作机器,负责运行Pods

作用:与master保持通讯,管理pods的生命周期(kubelet),以及处理网络规则(kube-proxy)

NameSpace(命名空间)

作用:隔离Pods的运行环境,类似于“虚拟文件夹”。

常用场景:区别开发/测试/生产环境。

我的理解:每个namespace下可以有多个不同的pod,开发环境有开发环境的pod,测试有测试的pod,所以使用namespace进行分隔,这样可以很好的防止互相干扰

Label(标签)

是什么:键值对标签,用来标记资源(pod,service)

​用途​​:筛选资源(如“env=prod”筛选生产环境Pod)

二、部署与管理

Deployment

作用:声明式管理生成Pods,只需要在deployment中描述你期望的Pod的状态,就会自动更新Pod的状态(适用于无状态应用)

举个栗子​​:定义Web应用需要3个副本,K8s自动维护Pod数量,自动的进行扩容和缩容并且支持版本更新和回滚

​ReplicaSet

是什么​​:Deployment的底层实现,确保指定数量的Pod副本运行

联动关系​​:Deployment控制ReplicaSet,ReplicaSet控制Pod

StatefulSet

适用场景​​:管理有状态应用(如数据库),保障Pod唯一性和持久存储

三、​​网络与访问​

Service

作用​​:为一组Pod提供稳定访问入口(如负载均衡),Service可以将多个Pod绑定到一个DNS名称或IP地址上,从而允许其他应用程序通过该名称或地址访问这些Pod

service 有如下四种类型,默认是ClusterIP:

  • ClusterIP: 默认类型,自动分配一个仅集群内部可以访问的虚拟IP
  • NodePort: 在ClusterIP基础上为Service在每台机器上绑定一个端口,这样就可以通过 NodeIP:NodePort 来访问该服务
  • LoadBalancer: 在NodePort的基础上,借助cloud provider创建一个外部的负载均衡器,并将请求转发到 NodeIP:NodePort
  • ExternalName: 将服务通过DNS CNAME记录方式转发到指定的域名

​Ingress:

功能​​:外部流量统一入口,支持HTTP路由(如根据域名分发请求)

四、​​存储管理​

Volume(卷):

作用​​:为Pod提供持久化存储(如数据库数据)

类型​​:本地存储、NFS、云存储(如AWS EBS)

PersistentVolume(PV)

是什么​​:集群级别的存储资源(如一块云硬盘)

PersistentVolumeClaim(PVC)​​:应用对存储资源的申请(如“需要10GB空间”)

五、​​配置与安全​

​ConfigMap:

作用​​:存储非敏感配置(如环境变量、配置文件)

举个栗子​​:将数据库地址配置抽离到ConfigMap,避免硬编码

Secret

功能​​:安全存储敏感信息(如密码、证书),以Base64编码存储

NetworkPolicy

作用​​:控制Pod之间的网络通信(如禁止某些Pod互访)

总结表格

概念分类​​

​​核心组件​​

​​一句话作用​​

​​最小单元​​

Pod

容器组的运行载体

​​部署控制​​

Deployment/ReplicaSet

管理Pod副本数量和更新策略

​​服务暴露​​

Service/Ingress

提供稳定的内外网访问入口

​​存储管理​​

Volume/PVC

数据持久化与动态分配

​​配置隔离​​

Namespace/ConfigMap

资源隔离与环境配置管理

总结:

以上就是我个人在对k8s的学习过程中遇到的概念以及我个人对k8s的一些理解,我觉得了解了k8s的这些基础概念之后再去使用k8s会好很多,这样就不会导致使用资源的时候不知道那些专业名词代表什么,至于怎么去部署k8s集群,k8s的官方文档中有,以及如何通过kubectl命令操作k8s集群,在官网文档中也有相关的命令,所以我个人觉得,边了解k8s的概念,边进行上手操作,会让我们对这些概念有更深的理解,最后希望我的文章能帮助大家理解k8s,如果有错误的地方,请联系我进行修改,非常感谢!(ง •_•)ง