从Linux到K8S:云原生运维实战入门路径与避坑指南
这类教程最值得先看的不是它覆盖了多少知识点,而是能不能帮你把 Docker 和 Kubernetes (K8S) 这两项云原生运维的核心技术,从“知道名字”变成“能在自己环境里跑起来、管起来”。很多新手卡在第一步:环境装不上、命令看不懂、概念太抽象。这篇内容会围绕一个更实际的路径展开:先搞定 Linux 基础操作,再让 Docker 跑起来,最后用 K8S 把容器管起来。整个过程我会拆成可验证的步骤,告诉你每个环节最容易出问题的地方在哪,以及怎么判断自己这一步到底成功了没有。
如果你刚接触运维,或者想从传统运维转向云计算方向,那么关注点应该是“动手”而不是“背理论”。我会把重点放在命令、配置、故障排查这些能立刻验证的事情上。
1. 先理清学习路径:Linux -> Docker -> K8S,一步都不能跳
很多人一上来就想搭 K8S 集群,结果连最基本的 Linux 文件权限、网络配置都没搞清楚,卡在预检环节就进行不下去了。正确的入门顺序必须是线性的。
1.1 为什么必须先过 Linux 这一关?
Docker 和 K8S 都运行在 Linux 环境(即便是 Windows 或 macOS 上的 Docker Desktop,其底层也是 Linux 虚拟机)。如果你连通过 SSH 连接服务器、用vim或nano编辑配置文件、用systemctl管理服务、用curl测试端口这些操作都不熟,后续所有步骤都会举步维艰。
我建议的 Linux 入门清单(不是背命令,而是完成具体任务):
登录与文件操作:能使用 SSH 客户端(如 PuTTY、Termius、或系统终端)连接到一台远程 Linux 服务器(可以是云服务器 ECS,也可以是本地虚拟机)。登录后,完成以下操作:
- 用
pwd看当前目录。 - 用
ls -la查看文件详情和权限。 - 用
mkdir创建目录,用touch创建空文件。 - 用
cp,mv,rm复制、移动、删除文件(使用rm时要格外小心)。 - 用
cat,less,tail -f查看文件内容。
- 用
权限与用户:理解
chmod,chown的基本用法。例如,让一个脚本可执行:chmod +x your_script.sh。网络与进程:
ping测试网络连通性。curl或wget下载文件或测试 Web 服务。netstat -tulpn或ss -tulpn查看端口监听情况。ps aux | grep nginx查看特定进程。systemctl status docker查看 Docker 服务状态(安装后)。
包管理:根据你的 Linux 发行版,学会安装软件。
- Ubuntu/Debian:
apt update && apt install -y vim curl wget - CentOS/RHEL:
yum install -y vim curl wget
- Ubuntu/Debian:
判断标准:不是你能记住多少命令,而是给你一台新服务器,你能完成“安装一个 Nginx 并让它跑在 80 端口”这个任务。这涵盖了用户权限、包安装、服务启动、防火墙(如果需要)和端口验证。
1.2 Docker 是容器化的起点,别急着学高级特性
Docker 的核心价值是把应用和它的运行环境打包成一个镜像。对于入门,你只需要掌握几个核心动作:
- 拉取镜像:从仓库获取别人打包好的环境。
- 运行容器:把镜像变成正在运行的进程。
- 查看日志:知道你的应用在容器里干了什么。
- 数据持久化:让容器内的数据能保存到主机上。
- 端口映射:让容器内的服务能被外部访问。
很多教程一上来就讲 Dockerfile 编写、多阶段构建、Docker Compose。我建议新手先绕过这些,用现成的镜像(比如 Nginx, Redis, MySQL)把上面 5 个动作练熟。能稳定运行一个 MySQL 容器,并且能从主机连上去,这比写一个复杂的 Dockerfile 更重要。
1.3 K8S 是容器编排,核心是“声明”而非“命令”
当你能够熟练运行和管理多个 Docker 容器后,自然会遇到问题:容器挂了谁重启?如何批量更新?网络怎么互通?存储怎么共享?这就是 K8S 要解决的问题。
K8S 的学习门槛在于其概念体系:Pod、Deployment、Service、ConfigMap、Secret、Volume 等。入门时,不要试图一次性理解所有概念。抓住最核心的工作流:
- 用
kubectl run或编写一个 YAML 文件,声明你想要的应用状态(例如:运行 2 个 Nginx 实例)。 - 使用
kubectl apply -f your-file.yaml提交给 K8S。 - K8S 会自动调度 Pod 到节点,拉取镜像,启动容器,并持续保持这个状态。
- 通过
kubectl get pods,kubectl logs,kubectl describe来观察和排查。
关键心态转变:在 Docker 里,你通过命令直接操作容器;在 K8S 里,你通过 YAML 文件告诉集群“我想要什么样子”,集群自己去完成。你的主要工作从“执行命令”变成了“编写和调试 YAML 文件”。
2. 环境准备:选对系统与安装方式,避开 80% 的坑
实战的第一步是搭建环境。选择不当会导致后续学习阻力巨大。
2.1 操作系统选择:优先使用 Linux 发行版
虽然 Docker Desktop 支持 Windows 和 macOS,但对于学习 K8S,我强烈建议使用 Linux 环境。原因如下:
- 一致性:生产环境几乎都是 Linux,在 Linux 上学习能避免因系统差异导致的问题。
- 资源开销:原生 Linux 运行 Docker 效率更高,不需要额外虚拟机层(Docker Desktop 在 Win/Mac 上需要虚拟化支持)。
- 学习路径平滑:直接在 Linux 上操作,你练习的每一步(包括故障排查)都直接对应生产技能。
具体选择:
- 新手友好:Ubuntu Server LTS 版本(如 22.04 LTS)。社区活跃,资料多。
- 企业常见:CentOS Stream 或 Rocky Linux。如果你目标岗位偏传统企业,可以选这个。
- 轻量尝试:如果机器配置低,可以用 Alpine Linux,但它的包管理工具是
apk,与apt/yum不同。
怎么获取 Linux 环境?
- 云服务器(ECS):最方便。在阿里云、腾讯云等平台购买一台最低配置的按量付费实例(学习用,一天成本很低)。选择 Ubuntu 22.04 镜像,用 SSH 连接。
- 本地虚拟机:使用 VirtualBox 或 VMware Workstation Player(免费)。下载 Ubuntu ISO 文件安装。需要给虚拟机分配至少 2核 CPU、4GB 内存、20GB 磁盘。
- WSL2 (Windows 10/11):这是一个折中方案。在 Windows 上安装 WSL2(例如 Ubuntu 发行版),然后在 WSL2 里安装 Docker。这比完整虚拟机轻量,但某些涉及内核或网络的高级特性可能受限,且不适合作为 K8S 节点(单节点学习集群可以)。
注意:不要在你的主力生产环境或重要个人电脑上直接折腾 Docker/K8S 安装,最好用独立的虚拟机或云服务器。
2.2 Docker 安装:使用官方脚本,但先看明白它在做什么
网上有很多一键安装脚本。最稳妥的是参考 Docker 官方文档。以 Ubuntu 为例,步骤通常是:
# 1. 卸载旧版本(如果是新系统可跳过) sudo apt-get remove docker docker-engine docker.io containerd runc # 2. 更新 apt 包索引并安装依赖 sudo apt-get update sudo apt-get install -y ca-certificates curl gnupg lsb-release # 3. 添加 Docker 官方 GPG 密钥和仓库 sudo mkdir -p /etc/apt/keyrings curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg echo \ "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \ $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null # 4. 安装 Docker Engine sudo apt-get update sudo apt-get install -y docker-ce docker-ce-cli containerd.io docker-compose-plugin安装后,必须执行以下验证:
# 启动 Docker 服务并设置开机自启 sudo systemctl start docker sudo systemctl enable docker # 运行 hello-world 镜像,这是最经典的测试 sudo docker run hello-world如果看到 “Hello from Docker!” 等输出信息,说明 Docker 安装成功,并且能正常拉取和运行容器。
常见坑点:
- 权限问题:默认需要
sudo才能运行docker命令。为了方便,可以将当前用户加入docker组:sudo usermod -aG docker $USER。执行后需要退出 SSH 重新登录生效。 - 镜像源慢:国内拉取 Docker Hub 镜像可能很慢。需要配置国内镜像加速器。修改或创建
/etc/docker/daemon.json,加入(以阿里云为例,你需要去容器镜像服务控制台获取自己的加速器地址):
然后重启服务:{ "registry-mirrors": ["https://your-mirror.mirror.aliyuncs.com"] }sudo systemctl restart docker。 - 存储驱动:对于较新的系统,通常使用
overlay2驱动,一般无需改动。如果遇到存储相关问题,可以检查docker info | grep Storage。
2.3 K8S 环境搭建:入门首选 Minikube 或 K3s,别硬刚多节点集群
对于初学者,在单机上搭建一个多节点的 K8S 集群(如使用 kubeadm)过程繁琐,对资源要求高,且容易因网络、镜像等问题失败。我建议从以下两种更轻量的方案开始:
方案一:Minikube(最主流的学习工具)Minikube 会在你的机器上创建一个单节点的 K8S 集群。
- 优点:与官方 K8S 兼容性好,功能完整,社区支持强。
- 缺点:需要虚拟机驱动(如 VirtualBox)或容器驱动(如 Docker),会占用一定资源。
- 安装(在已安装 Docker 的 Linux 上):
启动成功后,它会自动配置# 下载 Minikube 二进制文件 curl -LO https://storage.googleapis.com/minikube/releases/latest/minikube-linux-amd64 # 安装到系统路径 sudo install minikube-linux-amd64 /usr/local/bin/minikube # 启动集群(使用 Docker 驱动,这是最简单的方式) minikube start --driver=dockerkubectl(K8S 命令行工具)连接到这个集群。
方案二:K3s(轻量级 K8S,非常适合边缘和资源受限环境)K3s 是 Rancher 发布的经过裁剪的 K8S 发行版,去掉了很多非核心组件,安装极其简单。
- 优点:安装快(一条命令),资源占用极低,适合低配机器。
- 缺点:某些高级特性或 API 可能与标准 K8S 有细微差别,但对于学习核心概念完全足够。
- 安装:
# 使用官方一键脚本安装 curl -sfL https://get.k3s.io | sh - # 安装完成后,kubectl 配置会自动生成 sudo kubectl get nodes
验证 K8S 集群: 无论用哪种方式,安装后都用以下命令验证:
# 查看集群节点状态,应为 Ready kubectl get nodes # 查看所有命名空间的 Pod,应该能看到一些系统 Pod(如 coredns) kubectl get pods -A如果get nodes显示节点状态为Ready,并且get pods -A没有大量CrashLoopBackOff或Error状态的 Pod,说明基础集群是健康的。
3. 核心实战:从运行第一个容器到部署多副本应用
环境就绪后,我们进入实战环节。遵循从简到繁的原则。
3.1 Docker 核心操作实战
我们以部署一个简单的 Web 应用为例。
任务:运行一个 Nginx 容器,并将宿主机的 8080 端口映射到容器的 80 端口。
# 1. 拉取镜像(如果本地没有会自动从仓库拉取) docker pull nginx:alpine # alpine 版本更小巧,适合学习 # 2. 运行容器 docker run -d --name my-nginx -p 8080:80 nginx:alpine # -d: 后台运行 # --name: 给容器起个名字,方便管理 # -p 8080:80: 端口映射,主机8080 -> 容器80 # 3. 验证 curl http://localhost:8080 # 应该能看到 Nginx 的欢迎页面 HTML进阶操作:数据持久化与日志查看
- 查看日志:
docker logs my-nginx。加上-f参数可以实时跟踪日志输出。 - 进入容器:
docker exec -it my-nginx /bin/sh。这让你能进入容器内部执行命令,就像登录一台小服务器。退出用exit。 - 数据卷挂载:让容器内的数据(如网站文件、配置文件)保存在主机上。
# 先在主机创建目录 mkdir -p ~/nginx-html # 运行容器并挂载卷 docker run -d --name my-nginx-v2 -p 8081:80 -v ~/nginx-html:/usr/share/nginx/html nginx:alpine # -v: 挂载卷,主机路径:容器内路径 # 现在你可以在 ~/nginx-html 目录下放一个 index.html,然后访问 http://localhost:8081 就能看到你的页面了。 - 停止、删除容器:
docker stop my-nginx # 停止 docker rm my-nginx # 删除(需先停止) docker rm -f my-nginx # 强制删除运行中的容器(慎用)
关键排查点: 如果curl访问失败,按顺序检查:
- 容器状态:
docker ps看容器是否在运行 (STATUS为Up)。如果没运行,用docker logs my-nginx看启动日志。 - 端口映射:确认
-p参数写对了,并且主机 8080 端口没有被其他程序占用 (netstat -tulpn | grep 8080)。 - 防火墙:如果是云服务器,确保安全组/防火墙规则放行了 8080 端口。
3.2 K8S 核心操作实战:理解 Pod 与 Deployment
在 K8S 里,最小的部署单元是 Pod(一个或多个紧密关联的容器)。但我们一般不直接创建 Pod,而是通过 Deployment 来管理 Pod 副本。
任务:使用 Deployment 部署一个 Nginx,并通过 Service 暴露它。
第一步:创建一个 YAML 文件,例如nginx-deployment.yaml。
apiVersion: apps/v1 kind: Deployment metadata: name: nginx-deployment spec: replicas: 2 # 指定 Pod 副本数为 2 selector: matchLabels: app: nginx template: metadata: labels: app: nginx spec: containers: - name: nginx image: nginx:alpine ports: - containerPort: 80 --- apiVersion: v1 kind: Service metadata: name: nginx-service spec: selector: app: nginx # 选择标签为 app: nginx 的 Pod ports: - protocol: TCP port: 80 # Service 的端口 targetPort: 80 # Pod 容器的端口 type: NodePort # 类型为 NodePort,会在每个节点上开放一个端口(30000-32767)映射到该 Service第二步:应用这个配置。
kubectl apply -f nginx-deployment.yaml第三步:验证部署。
# 查看 Deployment 状态 kubectl get deployments # 应该看到 nginx-deployment,且 READY 为 2/2 # 查看 Pod 状态 kubectl get pods # 应该看到两个名字类似 nginx-deployment-xxxxx-xxxx 的 Pod,状态为 Running # 查看 Service kubectl get svc nginx-service # 会显示 CLUSTER-IP 和 PORT(S),例如 80:3xxxx/TCP,其中 3xxxx 是 NodePort第四步:访问应用。
- 在 Minikube 中:
minikube service nginx-service会自动打开浏览器。 - 在 K3s 或标准集群中:你需要知道节点的 IP 地址(
kubectl get nodes -o wide),然后用节点 IP 和 NodePort 访问,例如http://<节点IP>:3xxxx。
核心概念解释:
- Deployment:它确保始终有指定数量(
replicas)的 Pod 副本在运行。如果某个 Pod 挂了,Deployment 会自动创建一个新的来替换。 - Service:为一组 Pod(通过标签选择器
selector选定)提供一个稳定的访问入口(IP 和端口)。NodePort类型使得可以从集群外部访问。 - YAML 文件结构:
apiVersion,kind,metadata,spec是四大支柱。spec下的内容根据资源类型不同而不同。
排查命令: 当 Pod 状态不是Running时,按顺序使用:
kubectl describe pod <pod-name>:查看 Pod 的详细事件,经常能直接看到错误原因(如镜像拉取失败、资源不足)。kubectl logs <pod-name>:查看 Pod 内容器的日志。kubectl logs <pod-name> -c <container-name>:如果 Pod 内有多个容器,用-c指定容器名。
4. 生产化思维:从“能跑”到“能稳定跑”
教程里的 Demo 能跑起来只是第一步。要真正用于实践,必须考虑稳定性、可维护性和故障恢复。
4.1 资源限制与健康检查
在 K8S 中,不给 Pod 设置资源请求和限制,就像开车不看油表。这可能导致某个 Pod 吃光节点内存,拖垮整个节点。
在 Deployment 的容器配置中添加资源限制和健康检查:
containers: - name: nginx image: nginx:alpine ports: - containerPort: 80 resources: requests: # 请求的资源,调度依据 memory: "64Mi" cpu: "250m" # 250 milliCPU,即 0.25 个 CPU 核心 limits: # 资源上限,超过会被限制或重启 memory: "128Mi" cpu: "500m" livenessProbe: # 存活探针,检查容器是否活着 httpGet: path: / port: 80 initialDelaySeconds: 5 # 容器启动后等5秒开始探测 periodSeconds: 10 # 每10秒探测一次 readinessProbe: # 就绪探针,检查容器是否准备好接收流量 httpGet: path: / port: 80 initialDelaySeconds: 5 periodSeconds: 5- 作用:
livenessProbe失败,K8S 会重启容器;readinessProbe失败,Service 会将该 Pod 从负载均衡中剔除,直到它恢复就绪。
4.2 配置与敏感信息管理
不要把配置(如数据库地址)和密码硬编码在镜像或 YAML 里。使用 ConfigMap 和 Secret。
ConfigMap 示例(存储应用配置):
# 从文件创建 ConfigMap kubectl create configmap my-config --from-file=./application.properties # 或从字面值创建 kubectl create configmap my-config --from-literal=log.level=INFO在 Deployment 的 YAML 中,可以将 ConfigMap 挂载为卷或设置为环境变量。
Secret 示例(存储密码、令牌等):
# 注意:以下命令会在 shell 历史中留下记录,生产环境应用更安全的方式。 kubectl create secret generic db-secret --from-literal=password=MyP@ssw0rdSecret 的数据是 Base64 编码的(仅编码,不加密)。在 Pod 中同样可以挂载为卷或环境变量引用。
4.3 日志与监控
“出了问题不知道去哪看”是运维大忌。
- 日志:在 K8S 中,容器的标准输出和标准错误日志可以通过
kubectl logs查看。对于生产环境,需要集中式日志收集方案,如 EFK (Elasticsearch, Fluentd, Kibana) 或 Loki。 - 监控:基础监控可以使用
kubectl top pods/nodes查看资源使用。生产环境需要 Prometheus + Grafana 组合,来监控集群节点、Pod、Service 的各种指标(CPU、内存、网络、请求数、延迟等)。
4.4 持续集成与部署 (CI/CD) 思路
手动kubectl apply只适合测试。生产环境需要自动化流程。一个简单的 GitOps 思路:
- 应用代码和 Kubernetes YAML 文件存放在 Git 仓库中。
- 当代码变更推送到特定分支(如 main)时,触发 CI 流程(如 Jenkins、GitLab CI、GitHub Actions)。
- CI 流程负责构建 Docker 镜像,并推送到镜像仓库(如 Docker Hub、阿里云容器镜像服务)。
- CI 流程更新 Kubernetes YAML 文件中的镜像标签,并自动执行
kubectl apply或通过工具(如 Argo CD、Flux)同步到集群。
这个流程确保了部署的可追溯性和一致性。
5. 故障排查心法:从现象到根源的排查顺序
遇到问题不要慌,按照从外到内、从浅到深的顺序排查。
5.1 Pod 启动失败
现象:kubectl get pods显示CrashLoopBackOff,ErrImagePull,ImagePullBackOff,Pending。
- Pending:Pod 无法被调度到节点。检查
kubectl describe pod的事件,常见原因:节点资源不足、不满足节点选择器/亲和性、有污点。 - ErrImagePull/ImagePullBackOff:镜像拉取失败。
- 检查镜像名和标签是否正确。
- 检查镜像仓库是否需要认证(私有仓库需创建
imagePullSecrets)。 - 检查节点网络是否能访问镜像仓库。
- CrashLoopBackOff:容器启动后立即退出。
kubectl logs <pod-name>看容器退出前的日志。kubectl describe pod <pod-name>看更详细的事件。- 检查容器内应用启动所需的配置、环境变量、依赖是否齐全。
- 检查
livenessProbe是否配置过于严格,导致健康检查失败而重启。
5.2 Service 无法访问
现象:Pod 是Running的,但通过 Service 访问不了。
- 检查 Service 的 Endpoints:
kubectl get endpoints <service-name>。如果 Endpoints 列表为空,说明 Service 没有找到匹配的 Pod。检查 Service 的selector和 Pod 的labels是否匹配。 - 检查 Pod 端口:确认 Pod 内容器确实在监听 Service 中
targetPort指定的端口。 - 检查网络策略:如果集群使用了网络插件(如 Calico)并配置了 NetworkPolicy,可能会阻止流量。
- 如果是 NodePort 类型:确认节点的防火墙/安全组放行了 NodePort 端口范围(30000-32767)。
5.3 节点异常
现象:kubectl get nodes显示节点状态为NotReady。
- 登录到问题节点。
- 检查 K8S 核心服务:
systemctl status kubelet(节点代理)。如果服务停止,尝试systemctl restart kubelet并查看日志journalctl -u kubelet。 - 检查容器运行时:
systemctl status docker(或containerd)。 - 检查节点资源:
free -h看内存,df -h看磁盘空间。磁盘满(特别是/var)是常见原因。
5.4 通用排查命令总结
把这些命令存下来,遇到问题按顺序跑一遍:
# 1. 看整体状态 kubectl get pods -A kubectl get nodes # 2. 看具体资源详情和事件(最关键) kubectl describe pod <pod-name> kubectl describe node <node-name> # 3. 看日志 kubectl logs <pod-name> kubectl logs <pod-name> --previous # 查看之前崩溃容器的日志 # 4. 进入容器调试(如果容器内有shell) kubectl exec -it <pod-name> -- /bin/sh # 5. 检查网络连通性 kubectl run busybox --image=busybox --restart=Never --rm -it -- sh # 在 busybox 容器内执行 ping 或 nslookup 测试6. 学习资源与进阶方向
教程和课件能带你入门,但真正的能力来自于解决实际问题和阅读官方文档。
- 官方文档永远是第一选择:
- Docker Docs: https://docs.docker.com/
- Kubernetes Docs: https://kubernetes.io/docs/home/
- 中文社区有 Kubernetes 官方文档的中文翻译,质量很高。
- 动手实验:
- Katacoda (已关闭,但类似平台很多):寻找在线的交互式 K8S 实验平台。
- 在自己的云服务器或本地虚拟机反复搭建、摧毁、重建集群。熟练使用
kubeadm搭建集群是深入理解组件的好方法。
- 认证与课程:
- Docker Certified Associate (DCA)
- Certified Kubernetes Administrator (CKA):这是业界公认的含金量较高的 K8S 运维认证,考试是实操性的,非常锻炼人。
- 关注生态工具:
- 持久化存储:CSI 驱动,了解 PersistentVolume (PV) 和 PersistentVolumeClaim (PVC)。
- 网络:Calico, Flannel, Cilium 等 CNI 插件。
- 服务网格:Istio, Linkerd(在精通 K8S 核心后再接触)。
- GitOps:Argo CD, Flux。
学习这条路,最怕的就是一直看视频、读文章而不动手。最好的方法就是给自己设定一个小项目,比如“在 K8S 上部署一个带数据库的博客系统”,然后去拆解它:如何做 Docker 镜像?如何写 Deployment 和 Service?如何管理配置和密码?如何做数据备份?在这个过程中遇到的所有问题,都会让你对 Docker 和 K8S 的理解深一层。
