带你一步一步摸索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的基本工作机制,该例子来源于阿里云社区中的一篇文章中,例子如下
以部署一个 nginx 服务来说明 kubernetes 系统各个组件调用关系:
- 首先要明确,一旦 kubernetes 环境启动之后,master 和 node 都会将自身的信息存储到 etcd 数据库中;
- 一个 nginx 服务的安装请求会首先被发送到 master 节点的 apiServer 组件;
- apiServer 组件会调用 scheduler 组件来决定到底应该把这个服务安装到哪个 node 节点上,在此时,它会从 etcd 中读取各个 node 节点的信息,然后按照一定的算法进行选择,并将结果告知 apiServer;
- apiServer 调用 controller-manager 去调度 Node 节点安装 nginx 服务;
- kubelet 接收到指令后,会通知 docker,然后由 docker 来启动一个 nginx 的 pod,pod 是 kubernetes 的最小操作单元,容器必须跑在 pod 中;
- 当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 构建高层的应用,对内提供插件式应用执行环境。就像你买电脑时不用关心主板怎么设计,直接用它的接口插鼠标、键盘就行
然后我再用一个通俗的例子解释:
想象你要开一家奶茶店(相当于部署应用):
- 核心层是店铺的营业执照和基础水电(必须要有)。
- 应用层是制作奶茶的设备和小程序点单系统(让顾客能下单)。
- 管理层是店长,负责监控销量、自动补货原料、管理员工权限。
- 接口层是收银台的POS机,店员用它操作整个系统。
- 生态系统是外卖平台、会员系统等第三方合作,帮你扩大生意。
通过这种分层设计,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,如果有错误的地方,请联系我进行修改,非常感谢!(ง •_•)ง
发布评论