行业资讯
从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 wgetCentOS/RHEL:yum install -y vim curl wget判断标准不是你能记住多少命令而是给你一台新服务器你能完成“安装一个 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 --driverdocker启动成功后它会自动配置kubectlK8S 命令行工具连接到这个集群。方案二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-literallog.levelINFO在 Deployment 的 YAML 中可以将 ConfigMap 挂载为卷或设置为环境变量。Secret 示例存储密码、令牌等# 注意以下命令会在 shell 历史中留下记录生产环境应用更安全的方式。 kubectl create secret generic db-secret --from-literalpasswordMyPssw0rdSecret 的数据是 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。PendingPod 无法被调度到节点。检查kubectl describe pod的事件常见原因节点资源不足、不满足节点选择器/亲和性、有污点。ErrImagePull/ImagePullBackOff镜像拉取失败。检查镜像名和标签是否正确。检查镜像仓库是否需要认证私有仓库需创建imagePullSecrets。检查节点网络是否能访问镜像仓库。CrashLoopBackOff容器启动后立即退出。kubectl logs pod-name看容器退出前的日志。kubectl describe pod pod-name看更详细的事件。检查容器内应用启动所需的配置、环境变量、依赖是否齐全。检查livenessProbe是否配置过于严格导致健康检查失败而重启。5.2 Service 无法访问现象Pod 是Running的但通过 Service 访问不了。检查 Service 的 Endpointskubectl 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 --imagebusybox --restartNever --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 核心后再接触。GitOpsArgo CD, Flux。学习这条路最怕的就是一直看视频、读文章而不动手。最好的方法就是给自己设定一个小项目比如“在 K8S 上部署一个带数据库的博客系统”然后去拆解它如何做 Docker 镜像如何写 Deployment 和 Service如何管理配置和密码如何做数据备份在这个过程中遇到的所有问题都会让你对 Docker 和 K8S 的理解深一层。
郑州网站建设
网页设计
企业官网