K8s很难,很多人学了很久都入不了门。

我也是从零基础开始学K8s的。一开始,看官方文档,看得云里雾里;跟着教程操作,又不知道为什么要这么做。踩了很多坑,也走了很多弯路,花了几个月时间,才慢慢入门。

本文分享我的K8s学习路线,包括学习阶段、每个阶段学什么、用什么资源、做什么练习,以及常见的误区。如果你想学K8s但不知道从何入手,希望这篇文章能帮到你。

一、学习K8s的前提

在学K8s之前,需要有一些基础知识。

1. Linux基础

K8s运行在Linux上,很多操作都是命令行。需要掌握:

  • 常用命令:ls、cd、cp、mv、rm、grep、awk、sed等
  • 文件系统:目录结构、权限、软链接等
  • 进程管理:ps、top、kill等
  • 网络基础:IP、端口、DNS、iptables等
  • 文本编辑器:vim或nano

如果Linux基础不好,学K8s会很吃力。建议先花一两周时间,把Linux基础补一补。

2. Docker基础

K8s是容器编排工具,容器是基础。需要掌握:

  • 容器的概念:什么是容器,和虚拟机的区别
  • Docker的常用命令:run、ps、images、build、exec、logs等
  • Dockerfile:怎么写Dockerfile,怎么构建镜像
  • 镜像仓库:怎么推送和拉取镜像
  • 网络和存储:容器的网络模式、数据卷

如果连Docker都不会,直接学K8s,会完全听不懂。建议先把Docker学扎实。

3. 网络基础

K8s的网络比较复杂,需要有一定的网络基础:

  • TCP/IP协议
  • DNS解析
  • 端口和端口映射
  • 负载均衡
  • 虚拟网络(VPC、Overlay网络)

网络是K8s的难点之一,基础不好的话,学起来会很痛苦。

4. 编程基础

不是必须的,但有编程基础会学得更快:

  • 能看懂YAML文件
  • 能写简单的脚本(Shell、Python等)
  • 了解RESTful API

K8s的配置文件都是YAML格式,API是RESTful的,有编程基础会更容易理解。

二、学习路线总览

我把K8s的学习分为五个阶段:

  1. 入门阶段:了解K8s是什么,能做什么,搭建一个简单的集群
  2. 基础阶段:掌握核心概念和常用操作
  3. 进阶阶段:深入理解K8s的原理和高级特性
  4. 实战阶段:在实际项目中使用K8s
  5. 专家阶段:源码、二次开发、性能优化

每个阶段,都有不同的学习重点和练习目标。

三、第一阶段:入门(1-2周)

入门阶段的目标是:了解K8s是什么,能做什么,搭建一个简单的集群,部署第一个应用。

1. 了解K8s的基本概念

先了解K8s的基本概念:

  • 什么是K8s:容器编排工具,用于自动化部署、扩展和管理容器化应用
  • K8s的起源:Google的Borg,2014年开源
  • K8s的特点:自动部署、自动扩缩容、自愈、服务发现和负载均衡
  • K8s的架构:Master节点和Worker节点
  • 核心组件:API Server、etcd、Scheduler、Controller Manager、kubelet、kube-proxy

这一步,不需要深入理解,有个大概印象就行。

推荐资源:

  • K8s官方文档的"Concepts"部分
  • 《Kubernetes in Action》前两章
  • B站的K8s入门视频

2. 搭建本地集群

搭建一个本地的K8s集群,用于学习和练习。

推荐用minikube或kind:

  • minikube:单节点集群,适合初学者
  • kind:把K8s跑在Docker容器里,启动快

搭建步骤(以minikube为例):

  1. 安装VirtualBox或Docker
  2. 安装kubectl
  3. 安装minikube
  4. 运行minikube start
  5. 运行kubectl get nodes,确认集群正常

这一步,可能会遇到各种问题:网络问题、镜像拉不下来、虚拟化没开等。遇到问题不要怕,搜一下,慢慢解决。

3. 部署第一个应用

集群搭好后,部署第一个应用。

用kubectl run命令,部署一个Nginx:

kubectl create deployment nginx --image=nginx
kubectl expose deployment nginx --port=80 --type=NodePort
minikube service nginx

然后在浏览器里访问,看到Nginx的欢迎页面,就成功了。

这一步,让你对K8s有一个直观的感受:原来部署应用这么简单。

4. 了解基本操作

学习一些基本的kubectl命令:

  • kubectl get:查看资源(pods、services、deployments等)
  • kubectl describe:查看资源的详细信息
  • kubectl logs:查看容器日志
  • kubectl exec:进入容器
  • kubectl delete:删除资源
  • kubectl apply:应用配置文件

这些命令,是日常使用K8s最常用的,要熟练掌握。

四、第二阶段:基础(2-4周)

基础阶段的目标是:掌握K8s的核心概念和常用操作,能独立部署和管理应用。

1. Pod

Pod是K8s的最小调度单位,必须深入理解:

  • 什么是Pod:一组容器的集合,共享网络和存储
  • Pod的生命周期:Pending、Running、Succeeded、Failed、Unknown
  • Pod的重启策略:Always、OnFailure、Never
  • 多容器Pod:sidecar模式
  • Pod的探针:livenessProbe、readinessProbe、startupProbe
  • 资源限制:requests和limits

练习:

  • 创建一个单容器Pod
  • 创建一个多容器Pod(sidecar模式)
  • 配置livenessProbe和readinessProbe
  • 配置资源限制

2. Deployment和ReplicaSet

Deployment是管理Pod的控制器,是最常用的资源:

  • ReplicaSet:保证Pod的副本数
  • Deployment:管理ReplicaSet,支持滚动更新和回滚
  • 滚动更新:逐步替换旧版本的Pod
  • 回滚:出问题时回滚到上一个版本
  • 扩缩容:增加或减少Pod的副本数

练习:

  • 创建一个Deployment
  • 执行滚动更新
  • 执行回滚
  • 手动扩缩容
  • 配置HPA(自动扩缩容)

3. Service

Service是K8s的服务发现和负载均衡机制:

  • Service的类型:ClusterIP、NodePort、LoadBalancer、ExternalName
  • Service的原理:kube-proxy、iptables或IPVS
  • 服务发现:DNS解析
  • 端口:port、targetPort、nodePort

练习:

  • 创建ClusterIP类型的Service
  • 创建NodePort类型的Service
  • 用DNS在Pod之间访问Service
  • 理解Service和Pod的关系(通过label selector)

4. ConfigMap和Secret

配置管理:

  • ConfigMap:存储非敏感配置
  • Secret:存储敏感信息(密码、密钥等)
  • 使用方式:环境变量、命令行参数、挂载为文件

练习:

  • 创建ConfigMap,通过环境变量注入到Pod
  • 创建Secret,通过文件挂载到Pod

5. Volume和持久化存储

存储管理:

  • Volume:Pod级别的存储,Pod删除后数据丢失
  • PersistentVolume(PV):集群级别的存储
  • PersistentVolumeClaim(PVC):用户对存储的请求
  • StorageClass:动态存储供给

练习:

  • 使用emptyDir Volume
  • 使用hostPath Volume
  • 创建PV和PVC,挂载到Pod
  • 使用StorageClass动态创建PV

6. Namespace

命名空间,用于资源隔离:

  • 什么是Namespace:逻辑上的集群分区
  • 常用Namespace:default、kube-system、kube-public
  • 资源限额:ResourceQuota和LimitRange
  • 切换Namespace:kubectl config set-context

练习:

  • 创建Namespace
  • 在Namespace中创建资源
  • 配置ResourceQuota

推荐资源:

  • K8s官方文档的"Tasks"部分
  • 《Kubernetes in Action》第3-8章
  • 动手实验,每个概念都要亲手操作

五、第三阶段:进阶(4-8周)

进阶阶段的目标是:深入理解K8s的原理,掌握高级特性,能排查和解决问题。

1. K8s架构深入

深入理解K8s的架构和组件:

  • API Server:所有请求的入口,负责认证、授权、准入控制
  • etcd:分布式键值存储,存储集群的所有数据
  • Scheduler:负责Pod的调度
  • Controller Manager:各种控制器的集合
  • kubelet:运行在每个节点上,管理Pod的生命周期
  • kube-proxy:负责Service的网络代理
  • CoreDNS:集群内的DNS服务

理解每个组件的作用和工作原理,以及它们之间的交互。

2. 网络模型

K8s的网络是难点,需要深入理解:

  • K8s网络模型:每个Pod有独立的IP,Pod之间可以直接通信
  • Pod网络:CNI插件(Flannel、Calico、Cilium等)
  • Service网络:kube-proxy的iptables/IPVS模式
  • Ingress:HTTP层的路由
  • 网络策略:NetworkPolicy,控制Pod之间的网络访问

练习:

  • 安装Calico或Cilium CNI插件
  • 配置Ingress,实现域名路由
  • 配置NetworkPolicy,限制Pod之间的访问

3. 调度

理解K8s的调度机制:

  • 调度流程:过滤、打分、绑定
  • 节点选择:nodeSelector、nodeAffinity
  • Pod亲和性:podAffinity、podAntiAffinity
  • 污点和容忍:Taint和Toleration
  • 资源调度:requests和limits的影响
  • 自定义调度器

练习:

  • 用nodeSelector把Pod调度到指定节点
  • 配置nodeAffinity
  • 给节点打污点,配置容忍

4. 控制器和Operator

理解K8s的控制器模式:

  • 控制器模式:期望状态 vs 实际状态,不断调和
  • 常用控制器:Deployment、StatefulSet、DaemonSet、Job、CronJob
  • StatefulSet:有状态应用的部署
  • DaemonSet:每个节点运行一个Pod
  • Job和CronJob:一次性任务和定时任务
  • Operator:自定义控制器,管理复杂应用

练习:

  • 用StatefulSet部署有状态应用(如MySQL)
  • 用DaemonSet部署日志收集组件
  • 用CronJob运行定时任务
  • 了解Operator模式,尝试用Operator部署应用

5. 安全

K8s的安全:

  • 认证:用户认证、Service Account
  • 授权:RBAC(基于角色的访问控制)
  • 准入控制:Admission Controller
  • Pod安全标准:Privileged、Baseline、Restricted
  • 网络安全:NetworkPolicy
  • 镜像安全:镜像扫描、私有仓库

练习:

  • 创建Role和RoleBinding,限制用户权限
  • 创建Service Account,给Pod分配权限
  • 配置Pod安全策略

6. 可观测性

监控、日志、追踪:

  • 监控:Prometheus + Grafana
  • 日志:EFK(Elasticsearch、Fluentd、Kibana)或Loki
  • 追踪:Jaeger或Zipkin
  • 指标:Metrics Server、cAdvisor

练习:

  • 安装Prometheus和Grafana,监控集群
  • 安装Loki,收集日志
  • 了解分布式追踪

推荐资源:

  • K8s官方文档的"Concepts"深入部分
  • 《Kubernetes in Action》第9-15章
  • K8s源码(可选)
  • 技术博客和分享

六、第四阶段:实战(持续)

实战阶段的目标是:在实际项目中使用K8s,积累经验。

1. 搭建生产级集群

搭建一个生产级的K8s集群:

  • 多Master节点,高可用
  • 独立的etcd集群
  • 网络插件(Calico或Cilium)
  • 存储(Ceph或云存储)
  • 监控和日志
  • 安全配置

可以用kubeadm、kubespray或云厂商的托管K8s(EKS、GKE、AKS)。

2. 部署实际应用

把实际的应用部署到K8s上:

  • 无状态应用:Web服务、API服务
  • 有状态应用:数据库、消息队列
  • 微服务架构:服务发现、配置管理、链路追踪
  • CI/CD:自动构建、自动部署

3. 运维和排障

积累运维和排障经验:

  • 集群升级
  • 节点维护
  • 应用故障排查
  • 性能优化
  • 灾难恢复

排障是最能锻炼人的。遇到问题,一步步排查,理解底层原理。

七、第五阶段:专家(持续)

专家阶段:

  • 阅读K8s源码,理解核心组件的实现
  • 参与K8s社区,贡献代码
  • 开发CRD和Operator
  • 性能调优和大规模集群管理
  • 云原生生态:Service Mesh(Istio)、Serverless(Knative)等

这个阶段,需要长期的积累和实践。

八、常见的误区

说说学K8s常见的误区。

误区一:只看不练

很多人学K8s,只看文档和视频,不动手操作。

K8s是实践性很强的技术,只看不练,永远学不会。一定要动手操作,每个概念都要亲手实验。

误区二:追求大而全

K8s的概念很多,有些人想一次全部学会,结果什么都没学会。

建议循序渐进,先掌握核心概念(Pod、Deployment、Service),再学高级特性。

误区三:跳过基础

有些人Linux和Docker还没学好,就直接学K8s,结果越学越糊涂。

基础很重要。Linux、Docker、网络,这些基础打好了,学K8s会事半功倍。

误区四:死记硬背

K8s的命令和配置很多,有些人死记硬背,结果过几天就忘了。

要理解原理,理解了原理,命令和配置自然就记住了。

误区五:不看官方文档

有些人只看二手教程,不看官方文档。

官方文档是最权威、最及时的。要养成看官方文档的习惯,遇到问题先查文档。

九、学习资源推荐

推荐一些学习资源:

官方文档:

  • K8s官方文档:https://kubernetes.io/docs/
  • K8s中文文档:https://kubernetes.io/zh/docs/

书籍:

  • 《Kubernetes in Action》:最经典的K8s书籍,推荐
  • 《Kubernetes权威指南》:国内作者写的,也不错
  • 《Kubernetes设计与实现》:深入原理

视频:

  • B站搜索"K8s教程",有很多免费视频
  • CNCF的官方培训

实践环境:

  • minikube:本地学习
  • kind:本地多节点集群
  • 云厂商免费额度:阿里云、腾讯云、AWS等

社区:

  • K8s中文社区
  • CNCF中国
  • 各种技术微信群、QQ群

十、写在最后

K8s很难,但也不是学不会。

关键是:打好基础,循序渐进,动手实践,持续积累。

我从零基础到入门,花了几个月时间。中间也有过放弃的念头,但坚持下来了。现在,K8s已经成为我工作中不可或缺的工具。

2022年8月,K8s 1.25已经发布(注:K8s 1.25于2022年8月23日发布,本文写作时基于1.25的特性前瞻)。K8s还在不断发展,新特性层出不穷。学习K8s是一个长期的过程,要保持学习的习惯。

最后,用一句话总结:"K8s学习没有捷径,打好基础,动手实践,持续积累,你就能入门。"

愿你在K8s的学习道路上,少走弯路,早日入门。