1 简介

本专栏主要讲解Kubernetes技术。主要内容包括环境部署、容器组Pod、命名空间NameSpace、ReplicaSet控制器、Deployment控制器、StatefuSet控制器、Job控制器、CronJob控制器、DaemonSet控制器、Service服务、Ingress网关、存储Storage、集群Cluster、调度Scheduling、访问控制ControllingAccess、可视化Dashboard及包管理工具Helm。

2 特点

2.1 快速部署

Kubernetes在线部署经常遇到的挑战是网络和网速,要么网络不通,要么网速不行,共同特点就是费九牛二虎之力,学习环境没搞成。
为了解决这个痛点,本专栏在1-Setup一章,特地介绍了本专栏的实验环境,以及如何快速搭建它。
专栏系列文章所需的命令行程序、镜像文件、Docker环境、Kubernetes环境、Helm环境全部可以离线导入或安装,非常容易复刻,更快聚焦核心技术。向K8s运行成功的人寻找K8s运行成功的方法,智者首选。
本环境部署Kubernetes环境时,使用的是轻量级的K3s,K3s与K8s在学习和使用时差别不是很大,文章中的各个例子,在K8s环境理论上也是可以运行成功的。但要注意,如果使用的是自己搭建的K8s环境,需要注意版本,有些示例可能在你的版本上无法成功运行。
对于本专栏文章来说,由于K8s的组件(如kube-apiserver、kubelet、kubeproxy等是)独立程序部署的,而K3s则将它们打包到同一个文件,如果遇到启动参数或插件启停等问题,两者解决方法将有所不同,这个在实际遇到时已经在文章中有说明,总之我们学习时可以不用特意区分是K8s还是K3s环境。
1-Setup中还提供了一键部署和卸载K8s的脚本,支持单机及集群部署方式,卸载也只需要一个命令,当我们调试过程中如果不小心把环境搞坏,可以一键卸载并一键重新部署。

2.2 重视实践

Kubernetes技术体系庞大,官方文档非常详细。但在实际学习和工作中,根据每个人的角色不同,如开发、测试、运维,支持,需要掌握的侧重点也不同,官网的有些内容可能对某些人并不使用适用。本专栏文章尽可能避免介绍深奥晦涩又复杂的理论知识,而是在一个个的示例中阐述Kubernetes技术原理,只为证明计算机是一门特别重视实践的科学。
对于各文章中的每个示例,在本专栏搭建的环境都是可以成功运行的,并且每一步都有运行结果和详细说明,我们即使没有虚拟机环境,也可以根据运行结果和详细说明看明白各示例所要表述的知识点。喜欢打游戏的大抵知道,当我们看一款游戏的视频攻略时,基本上相当于我们自己打了一次,道理相通,至于看完攻略是否自己亲自去打一盘,就要看自己喜好了。

2.3 大道至简

Kubernetes能做的事情很多,微服务里常见的如服务发现(Eureka、Nacos、Consul、Zookeeper)、熔断限流(Sentinel、Hystrix、Istio)、消息队列(RocketMQ、Kafka、RabbitMQ)、数据存储(MySQL、Redis、MongoDB、PostgreSQL)、监控观测(Prometheus、Grafana、Jaeger、Zipkin)、日志采集(Filebeat、Logstash、ElasticSearch)等,只要封装到镜像里,都可以被Kubernetes调用。我们可以搭建一个基于Prometheus+Grafana的监控平台,可以搭建一个基于Tekton的云原生CI/CD平台,还可以搭建一个基于ELK的日志平台,但这些都没有在本专栏体现。本专栏重点介绍的是Kubernetes核心技术,而不是某一特定领域的应用,试想,你用Kubernetes搭建了ELK平台,但平台不通时,一边要检查Kubernetes Pod状态、服务状态、网络代理状态,一边还要去检查ElasticSearch的红绿黄健康状态,两个本可以不相干的技术栈糅合在一起,无疑增加了学习成本和研究负担。我们可以在两套独立环境下,一个搞Kubernetes,一个搞ELK非虚拟化版,两者都弄得稍微明白了再把他们搅合在一起。
基于这种思想,本专栏尽量减少新技术栈的引入,只用了两个常见的镜像,nginx和busybox,所有示例基本围绕这两个镜像开展,真正聚焦Kubernetes的核心技术。

2.4 循序渐进

Kubernetes的主要技术点,大致可以分为Pod、命名空间、控制器、存储、服务、网关、负载均衡、集群、扩展等几类,本专栏没有分门别类介绍这些技术点,而是循序渐进,根据后面文章依赖前面文章时先把被依赖文件前置的方式,对文章进行排序,如果发现有的文章看不懂,说明前面的技术还没有具备,需要往前翻翻。
前12章,在一台虚拟机就可以完成验证,但这只能说是单台设备,并不是单机,这是因为K3s在部署时,把管理平面节点和工作节点部署在了一起,这个节点,既是管理节点又是工作节点。
13章开始是集群相关,需要准备至少2台虚拟机。

2.5 取一舍九

本专栏的另一个特点是,不追求大而全,有写得详细的地方,也有舍弃不写的地方。比如某些特别重要的概念,如配额管理、HPA、探针、生命周期等知识,后续有缘再说吧,金无足赤人无完人,百科全书包含不了第101个学科,托马斯阿奎斯的《神学大全》里面也没有写中国的神仙,一个专栏也不可能包揽所有的知识点,能保证内容不出错就不错了汗!。
其实内容有错,也不是没有作用。谁能想到,就是因为笔者之前看过一本介绍Kubernetes的书,发现错误内容太多,才萌生写一个靠谱点介绍Kubernetes的专栏的想法的呢。
很多人都有一种迷之自信,觉得自己做事情肯定比别人做得更好,实际上呢,自己做出的东西,往往还不如别人。比如这个专栏,可能出的错误,比别人书里面的错误更多。尽信书不如无书,史多曲笔,况乎专栏,谬误之处,诸君多斧正。
如果还想深入了解Kubernetes,推荐一下这个站点吧,https://kubernetes.io/docs/home/

3 各章主要内容

3.1 环境部署Setup

本章主要介绍环境搭建。古云,工欲善其事必先利其器。好的开始是成功的一半。与其花费大量时间寻找科学上网工具,配置代理解决网速问题,解决兼容性问题,不如直接使用本章介绍的方法,配合提供的配套资料包,轻松复刻本专栏系列文章的运行环境,一键部署,一次成功。
本章主要内容为介绍虚拟机操作系统安装方法、常用rpm安装、Docker部署及镜像导入、K3s安装、Helm安装、nfs服务搭建等内容。

3.2 容器组Pod

Pod是Kubernetes的最小执行单元,中文可以翻译为容器组,但一般不翻译,直接叫它Pod就行。
为什么要先了解Pod呢,因为Pod是后面章节的基础,比如,命名空间,我们知道命名空间的概念,但命名空间里面有什么呢,至少得先有个Pod吧,看,这就是Pod的重要性。再比如,后面介绍了Deployment、StatefulSet、Job、CronJob、DaemonSet这些控制器,什么是控制器呢,就是控制Pod的器件,所以Pod还是很重要。又比如,后面介绍的集群,调度,漂移,驱逐,亲和性,污点,容忍度啥的,说的都是Pod的事。存储、服务、网关这几章,虽然和Pod没有直接关系,但它们和控制器关系紧密,控制器又和Pod关系紧密,所以Pod是基础中的基础。
本章介绍了Pod的基础知识。读完本章,我们应该能掌握如何在Kubernetes集群中创建Pod,删除Pod,查看Pod运行状态,查看Pod详情,进入及退出Pod,使用资源配置清单yaml文件创建Pod。本章出现的两个镜像nginx和busybox是主角,后面会经常出现。

3.3 命名空间NameSpace

有过面向对象编程基础的,对命名空间应该不会陌生,C++/Java/Golang都有命名空间的概念。Kubernetes中,命名空间起到一种资源逻辑隔离的作用。举例来说,同一命名空间资源名不能相同,不同命名空间的资源名可以是相同的。
本章介绍了命名空间的创建,删除,查看详情等基本操作,并给出了在不同命名空间下创建Pod的示例,接下来介绍了命名空间的使用场景。
为了方便起见,我们后续的资源创建大部分都是在default默认命名空间下进行的,这样编写资源配置清单时,可以少写一行和namespace相关的内容。

3.4 控制器ReplicaSet

ReplicaSet存在感相对较低,因为Pod和Deployment太出名了,并且Deployment、ReplicaSet、Pod还经常一起出现,所以常常被人类忽视。苍穹之上,繁星满天,璀璨夺目,光辉灿烂。想要被看到,就得更加努力地发光,就很卷,这里面卷出一大批耀眼的明星,代表星物如,紫薇、天狼、太白、长庚、牛郎织女夫妇、天枢七兄弟,它们卷出了自己的星生价值。在这种赶英超美热火朝天的背景下,有一颗小星星出生了,它就是ReplicaSet。ReplicaSet体型瘦小,色泽哑暗,但它的父母望子成龙,终日期盼它长大后成为一代巨星。ReplicaSet遥望太空,经常想,作为一个星星,就必须要发光吗,就必须要努力被看到吗,这种价值观是谁定义的呢,我就喜欢一个星静静地呆着,没事管理一下Pod,不也挺开心的吗,为什么一定要与日月同辉呢,说到日月,月亮也真够拼的了,自己不能发光,但仍然想法设法地努力被大家看到,还有太白长庚,它们也是这样的星,真是太励志了,大家都这么拼,究竟是为什么呢。然而人类并不像ReplicaSet这么想,现在不这么想,以前也不这么想,有两千五百年前一首诗为证:“嘒彼小星,三五在东,肃肃宵征,夙夜在公,实命不同。”,感慨同星不同命,劳碌但无用。
虽然ReplicaSet存在感较低,但它并不是不重要。我们想想康雍乾他仨,你能说雍不重要吗?祭天修坝,康让他干啥他就干啥,主打一个听话(虽然康说的最重要的一句话他没听),并且,没有雍,乾的人生就无从谈起,皮之不存毛将焉附,所以,雍,不庸。Deployment、ReplicaSet、Pod就是这样的一种紧密关系,ReplicaSet,任务单调,就是管Pod,Deployment让它怎么管他就怎么管,只管Pod副本数量,不管Pod升级回滚,简单高效。
本章主要介绍了ReplicaSet控制器,在没有Deployment参与下,如何与Pod交互,如何实现Pod副本的扩缩容。通过本章,我们应该能知道如何创建、删除、查看ReplicaSet,尽管这个平时几乎不怎么会用到。

3.5 控制器Deployment

Deployment是非常常用的一类控制器,只要是无状态服务,首先想到的就是它。本章从一个典型的Deployment资源清单开始,介绍了Deployment的特点及基本操作,又重点介绍了Deployment的滚动更新机制,并演示了RollingUpdate和Recreate两种升级效果。

3.6 服务Service

Service将一组Pod封装成一个虚拟服务,提供统一入口、负载均衡和服务发现功能。本章内容很多,示例也不少,主要介绍了ClusterIP、NodePort、LoadBalancer和ExternalName,给出使用示例。接下来讲了一个概念Endpoints,如何自动和手动创建Endpoints。详细讲解了Service的三大作用:统一入口、负载均衡和服务发现。最后一节介绍了如何通过IP和DNS域名两种方式访问各种类型的Service。

3.7 存储Storage

之前介绍的Pod和Deployment,都还没涉及存储的概念,Pod没有额外挂载存储卷。本章开始介绍存储,介绍了emptyDir、hostPath、nfs、PV/PVC、configMap和setret六类存储的概念、原理、及使用。其中PVC和PV是崭新概念,特别是自动创建PV的StorageClass,需要额外部署provisioner,稍微有些繁琐但不难,静下心来看看就明白了。

3.8 有状态控制器StatefulSet

这个控制器用得也非常多,和Deployment分庭抗礼。控制器共一石,Deployment得四斗,StatefulSet得四斗,自古及今其他控制器共用二斗,就是这么重要。StatefulSet控制器有三大特点,有序部署、稳定的网络标识及持久化存储。其中稳定的网络标识离不开Headless Service,所以在那一节还穿插介绍了一个Headless Service。最后,避免不了将两个重要的控制器,StatefulSet和Deployment,比较一番。

3.9 访问控制Controlling-Access

安全这东西,用不到的时候真没什么用,用到的时候,真的很有用。Kubernetes官方文档给出了非常复杂的安全机制,但我们实际使用时,几乎可以把它三下五除二地等价为RBAC,当kubectl命令执行遇到权限问题,改改Role或ClusterRole就可以了。有时候,理念太牛,也容易感受山巅的寒冷和孤独,曲高和者寡,阳春白雪的粉丝也不一定比下里巴人的多。举个例子,SeLinux,我们对它的认识,应该是从set enforce 0开始的吧,iptables这个体系,也是从iptables -F才开始逐渐了解它。
API Server是一个处理REST请求的服务,一个REST请求,需要经过认证-授权-准入三个步骤。本章重点内容为授权中常见的一种授权方式RBAC。RBAC涉及三个主体和四个资源对象,主体为普通用户、普通用户组和服务账户,四个资源对象分别是Role、ClusterRole、RoleBinding、ClusterRoleBinding,前两个资源对象描述角色具有的操作权限,后两个资源对象描述角色和主体的绑定关系。本章最后给出两个示例,一个是普通用户的认证和授权,一个是服务账户的认证和授权。

3.10 可视化WebUI-Dashboard

前面我们操作Kubernetes资源对象都是在命令行窗口下,这里就介绍一种可视化管理方式。Dashboard是Kubernetes官方提供的可视化方案,虽然还有其他方案,但这里我们先从官方的开始了解比较好。
本章重点在于如何部署Dashboard环境,通过Web页面操作Kubernetes这块的介绍并不多,也可以说是没有介绍。

3.11 网关Ingress

Service有它的优点,也有缺点,只能暴露IP和端口,不能暴露域名,且服务越多需要暴露的端口也越多。Ingress就是为了解决Service缺点而生的。江山代有才人出,一代新人换旧人,但Kubernetes的世界没有这么残酷,没有尔虞我诈,没有结党营私,Service和Ingress在不同的领域,各领风骚好几年。Ingress更神奇的地方在于,它的包容性很强,实现方案很多,Nginx系,Envoy系,轻量系,大大小小十几种,而且还处于军阀割据阶段,五代十国的故事还在小范围内继续上演着。本章本着不站队只站对的原则,选择了nginx系作为介绍,其他的也一样,简单点理解,Ingerss就是Service上加了个七层转发。

3.12 包管理工具Helm

Kubernetes资源对象很多,yaml、json方式管理,项目小还行,大了就麻烦,管理员不愿意从事这么单调的工作。为了偷懒,勤快的人开发了一个叫Helm的资源清单管理器,把各式各样的资源清单文件统一管理,能分组,有模板,能一键部署和卸载,有应用仓库复用,所以深受欢迎。
本章我们介绍了如何使用Helm,并对比不使用Helm部署应用和使用Helm部署应用两种方式,直观感受Helm神奇的力量。Kubernetes得Helm,犹孟德得奉孝,玄德遇孔明,意义不可言表。

3.13 集群Cluster

谈起Kubernetes,集群是绕不开的话题。集群搭配服务治理,有效缓解三高问题,还是有点用。我们这里不谈集群,只谈Kubernetes集群。认识了Kubernetes集群,我们的知识就又明显增加了。单控制平面模式,高可用控制平面模式,驱逐,漂移,故障检测,脑裂,Raft,Quorum,这些看似没用实际上也没多大作用的知识点都在本章的示例中有所体现。

3.14 控制器Job

Job是Kubernetes的一个控制器,它一般用来执行一次性任务,在批处理、数据迁移、离线计算等场景经常用到。本章先介绍Job的核心特征,接下来蹭一下Deployment的热度,与Deployment对比一下,虽然这个对比也没对比出来个啥,然后讲了Job控制器的资源清单文件,各字段含义,最后是一个综合示例,运行一个busybox容器,向宿主机的一个目录写入日志文件,执行完就退出,任务结束。

3.15 控制器CronJob

CronJob是一种定时任务控制器,它底层依赖Job,这从名字也可以看出来,就像John和Johnson那样直白。同理,CronJob还依赖Cron,好巧不巧,Unix/Linux里面也有一个cron,它俩李逵李鬼,反正同是天涯落草人。CronJob有cron一样定时任务管理功能,Job一样的执行力,所以它可以按照指定时间执行任务,如果指定的是一个循环时间,那将会是一个循环任务。

3.16 控制器DaemonSet

DaemonSet也是K8s的一种控制器。这个控制器还是挺有意思的,它可以在每个节点上运行一个Pod副本,更厉害的是,当有新的节点加到集群时,这个节点上也会运行一个Pod副本,当有节点从集群移除时,Pod也会被DaemonSet回收。这种技术,在600年前,我们就使用过。太祖创立锦衣卫,成祖创办东厂,于是,有锦衣卫的地方,就有东厂的人,锦衣卫走了,东厂的人也就撤了。
本章简单介绍了DaemonSet的概念,核心特点,使用场景,与Job控制器的区别,为什么和Job比较呢,因为这俩控制器,身上都带着任务,有相似的属性。接下来,通过一个示例,演示了DaemonSet控制器的用法。

3.17 调度Scheduling

调度是将Pod分配到合适的Node上的过程。调度的主角是兵部尚书kube-scheduler,它有虎符,调来调去。但我们这里并不讲它,它适合在Kubernetes史的列传部分出现。在本章,我们主要讲几个调度策略,因为这是我们平时最有可能接触到的东西,以后可能会用上,用啥学啥,不用不学,屠龙术学得再好一辈子也屠不了几个龙。调度主要有硬编码调度,Node亲和性、Pod亲和性、反亲和性调度,污点、容忍度这些内容,本章通过具体示例都做了一一展示。

Logo

开源鸿蒙跨平台开发社区汇聚开发者与厂商,共建“一次开发,多端部署”的开源生态,致力于降低跨端开发门槛,推动万物智联创新。

更多推荐