十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

零基础自学阿里云K8s运维:从ECS到实战部署全攻略

零基础自学阿里云K8s运维:从ECS到实战部署全攻略 先说结论零基础自学阿里云运维 K8s 完全可行但这条路上最大的敌人不是 K8s 本身而是“看文档五分钟装环境一下午”的门槛。我见过太多人不是学不会而是被一堆含糊的命令、没标注的配置、突然冒出来的网络报错劝退了。这篇指南就是想把门槛拆掉从一台干净的阿里云 ECS 开始带你走完 Linux 基础、K8s 集群搭建、部署真实项目的全流程。所有命令都带注释所有步骤都解释为什么要这么做最后还留了一个可以直接落地的练习项目。这篇内容适合谁如果你完全没接触过运维但想往云原生方向转或者你写过代码但没真正管过服务器又或者你已经有服务器运维经验想搞懂 K8s 这层编排系统到底怎么用。只要照着敲每一步都能看到结果整个过程大概需要 3 到 5 天的业余时间。当然最终想成为真正的运维工程师你还需要持续积累但入门这条路读完这篇就够了。1. 先看全局这份指南在解决什么学习路线怎么规划本部分不急着上手先把 K8s 和运维的关系、学习路径、云资源规划讲透。搞清楚这些后面每一步操作你都不会迷茫。1.1 阿里云运维与 K8s 到底在做什么阿里云运维本质上是依托阿里云的基础设施ECS 云服务器、VPC 网络、SLB 负载均衡、OSS 对象存储等来保障应用的稳定运行。如果你自己搞过博客、部署过玩具项目大概清楚单机部署的痛苦一个服务挂掉了要手动重启流量大了要手动加机器配置分散在各自机器上。K8sKubernetes要解决的就是这套问题——它把多台服务器抽象成一个资源池应用以容器的方式发布由调度器自动分配到合适的机器上宕机了自动重启流量大了自动扩容。在阿里云的语境下K8s 有两种玩法。第一种是自建集群在 ECS 上用工具把 K8s 装起来网络、存储、证书全自己管好处是便宜、可控、学到的东西多。第二种是直接用阿里云 ACK容器服务 Kubernetes 版控制台点几下就有集群节点坏了自动替换更适合企业生产。我这篇指南会把重点放在自建上因为零基础阶段需要理解原理而不是只做“控制台点击员”。等你理解了原理再去用 ACK上手成本极低。运维这个词听着抽象拆开其实就是三件事一是保证服务的可用性出了问题能快速恢复二是保证资源的高效性能用 2 台机器解决的事不用 5 台三是保证流程的规范性发布、回滚、权限管控都有章法。K8s 恰好在这三件事上都是核心工具。所以你学的不只是 K8s而是一套现代运维的底层思维。1.2 零基础自学四阶段路线对于零基础我最不建议一上来就照着官方文档装一个完整的生产级集群。那玩意儿步骤长、组件多中间任何一个网络插件出问题排查到怀疑人生。我建议把学习路径切成四个阶段每个阶段都有正反馈坚持下来的概率大得多。第一阶段是 Linux 基础和常用命令。大约 1 到 2 天搞定 vi/vim 编辑、文件目录操作、权限管理、systemctl 服务管理、网络排查工具telnet、ping、curl、日志查看tail、grep。你不需要变成运维大牛但至少要能在无界面的服务器上自如行走。第二阶段是容器与镜像。大约 1 天搞懂 Docker 是什么、镜像和容器的区别、Dockerfile 怎么写、常用 docker 命令ps、images、exec、logs、rm、stop、私有镜像仓库的概念。K8s 本身不管容器运行时细节它依赖底层容器技术所以这层必须过。第三阶段是 K8s 集群安装与核心概念。大约 1 到 2 天理解 Node、Pod、Deployment、Service、Ingress、Namespace 这几个核心对象。安装我建议先在单台机器上跑一个轻量级 K8s比如 K3s先把流程跑通再去理解多节点集群。第四阶段是实战项目。大约 2 天把一个真实的小项目比如一个带数据库的 Web 应用部署到集群上涉及配置管理、网络暴露、存储挂载、健康检查、滚动更新。做完这个你基本就入门了。这四阶段对应下面章节的安排。如果你已经熟悉了某块内容可以跳过相应部分但如果你真是从零开始请按顺序走不要跳。1.3 账号、RAM 权限与 ECS 资源规划在阿里云上实操强烈建议不要用主账号直连操作。你需要在 RAM访问控制里创建一个子账号赋予“AliyunECSFullAccess”ECS 管理权限、“AliyunVPCFullAccess”网络权限、“AliyunACKFullAccess”容器服务权限后面可能用到。这样一来就算误操作删了机器也不会把整个账号的资产都搭进去。创建一个专属的 RAM 用户并分配权限是这个阶段最重要的一个安全习惯。然后是 ECS 资源规划。零基础学习阶段建议从一开始就用一台 2 核 4 GB 的 ECS系统选 Ubuntu 22.04 或 CentOS 7.9如果你之后要进公司可能很多老系统还是 CentOS 系。如果碰巧有新人优惠一年几百块就搞定了。为什么不用 1 核 2 GBK8s 一跑起来光系统组件就得吃掉不少内存1 核 2 GB 会频繁内存不足学习体验极差。2 核 4 GB 是平滑入门的最低配置。另外别急着买公网带宽很大的机器带宽 3 Mbps 到 5 Mbps 就够了你学习时拉取镜像可能稍微慢点但把阿里云的容器镜像加速器配上后速度完全可接受。如果预算紧张也可以用抢占式实例在国内的正式环境可能不稳定但学习期短性价比极高一次几毛钱到几块钱练完就释放。2. 环境准备把一台干净的 ECS 变成可用的运维实验场这一阶段的目标是用 SSH 能连上服务器具备基础的文件 / 服务 / 网络 / 日志排查能力为后续安装容器和 K8s 打好地基。你会觉得这些命令琐碎但到了排障阶段早晚会用到。2.1 首次登录SSH、安全组与基本网络检查购买完 ECS 后第一时间配置安全组。阿里云的 ECS 实例默认绑定了安全组它就像服务器自带的一层虚拟防火墙。我们学习阶段常用的端口有22SSH 登录80 / 443HTTP / HTTPS 访问6443K8s API Server10250Kubelet 监控端口30000-32767NodePort 服务端口段安全组配置原则是“最小授权”就是只把需要暴露的端口放开且源地址尽量限定为你自己的 IP可以去百度搜“本机 IP”查到。有些同学学 K8s 排查问题时发现连不上节点多半不是 K8s 的问题而是安全组没放开端口。SSH 登录的话我推荐直接用终端或 Windows 上的 PowerShell执行ssh root你的公网IP如果是首次登录会让你输密码。如果是日常开发强烈建议把公钥配好之后登录就不用每次输密码了ssh-keygen -t rsa -b 4096 -C 你的备注 # -t 指定算法-b 指定长度-C 只是备注信息改个自己认得的名就行 ssh-copy-id root你的公网IP # 把本机公钥拷贝到服务器的 authorized_keys 文件里以后再登录就免密登录进去后先做三件事。第一件事确认网络和 DNS 正常执行ping -c 4 baidu.com如果不通检查 DNS第二件事执行curl https://www.aliyun.com确认能发起 HTTPS 请求如果卡住说明可能被某种出口网络策略干扰第三件事执行uname -a看系统内核版本和架构确认是 x86_64。这几项通过后服务器基础网络就 OK 了。2.2 高频 Linux 命令快速清单带注释阿里云运维的很多场景都离不开 Linux 命令这里我挑出最常用的一批每条附上注释和使用场景零基础可以直接照着用。# 文件和目录操作 ls -alh # 列出当前目录所有文件-a 显示隐藏文件-l 显示详细-h 以人类可读方式显示大小 cd /opt/apps # 跳转到 /opt/apps 目录 pwd # 查看当前所在目录 mkdir -p /opt/apps/logs # 递归创建目录-p 表示父目录不存在时自动创建 cp -r /opt/apps /opt/apps_backup # 递归复制目录 mv /opt/apps /opt/apps_old # 移动或重命名目录 rm -rf /opt/apps_bak # 删除目录或文件-r 递归-f 强制慎用一旦删除无法恢复 find / -name *.log 2/dev/null # 全盘查找 .log 文件2/dev/null 屏蔽权限报错 # 文件内容查看与编辑 cat /etc/os-release # 查看系统版本信息 head -n 20 /var/log/syslog # 查看文件前 20 行 tail -n 50 -f /var/log/syslog # 查看文件后 50 行-f 持续跟踪文件新增内容排障神器 grep -i error /var/log/syslog # 在日志文件中忽略大小写查找 error 关键词 vim /etc/hosts # 用 vim 编辑文件输入 i 进入编辑模式按 Esc 后输入 :wq 保存退出 # 服务管理 systemctl status nginx # 查看 nginx 服务状态 systemctl restart nginx # 重启服务修改配置后常用 systemctl enable nginx # 设置开机自启 systemctl disable nginx # 取消开机自启 # 网络排查 ping -c 4 baidu.com # 测试网络连通性 telnet 127.0.0.1 80 # 测试本机 80 端口能否连接 ss -lntp # 查看当前监听的端口及对应进程 curl -I http://127.0.0.1 # 查看 HTTP 响应头判断服务是否正常 netstat -an | grep 8080 # 查看 8080 端口是否被占用老命令部分发版已没有 # 磁盘和内存 df -h # 查看磁盘使用情况 free -m # 查看内存使用情况单位 MB du -sh /opt/apps # 查看目录占用的磁盘空间 top # 实时查看进程资源占用按 q 退出学习这些命令的时候别死记就把自己想象成一个“网站管理员”。网站打不开了你先 ping 服务器看网络通不通通了再看进程在不在进程在就 curl 看端口响应响应不对就 tail 看日志。这么一串联命令自然就记住了。2.3 初始化配置更新源、时间同步与常见组件安装拿到新机器的第二件事是更新软件源。阿里云的 ECS 默认已经配置好了阿里云软件源这也是选阿里云的一个便利之处但如果你买的机器版本偏老或者你是用其他方式初始化的最好重配一次。Ubuntu 下执行sudo apt update sudo apt upgrade -y # update 更新软件包索引upgrade 升级软件包-y 自动确认CentOS 则用sudo yum update -y时间同步也容易被忽略。很多组件包括 K8s 的证书签发对时间敏感时间不准会导致 TLS 握手失败。所以务必安装 chrony 或 systemd-timesyncd# Ubuntu sudo apt install -y chrony sudo systemctl enable --now chrony # CentOS sudo yum install -y chrony sudo systemctl enable --now chrony除此之外如果你之后需要拉代码建议装 gitsudo apt install -y git # 或 sudo yum install -y git配置好基础环境后顺手测试一个长期不会用但关键时刻救命的操作快照。阿里云控制台 - ECS - 磁盘 - 创建快照。快照相当于服务器某一时刻的备份。做实验前打一个快照万一系统搞崩了直接回滚。这不是命令但比任何命令都重要。3. K8s 集群搭建从选型到单机集群跑通接下来进入核心。这个阶段的目标是拥有一个可用的 K8s 集群。我会重点讲工具选型和安装步骤尽量用轻量方案降低零基础入门的心智负担。3.1 选型思路K3s、kubeadm 与阿里云 ACK 怎么选扫一眼市面上的方案主要有三个。一是 kubeadmK8s 官方推荐的集群引导工具。它能搭出相对标准的集群但需要自己处理容器运行时、CNI 网络插件、证书、kubelet 等一堆组件。生产环境肯定要懂但对零基础来说前面几个坑镜像下载慢、网络插件版本不匹配、容器运行时配置不对就足够劝退人了。它更适合第二阶段进阶时研究。二是 K3s一个轻量级 K8s 发行版由 Rancher 社区维护。它把组件简化、打包安装只需一条命令默认使用 SQLite 存储状态且体积很小单二进制文件特别适合学习、资源有限和边缘计算场景。零基础入门我强烈推荐先上 K3s。它也是标准的 K8skubectl 照常能用Deployment、Service 等核心对象完全一致差别主要在底层组件裁剪和默认配置。等你熟练了再用 kubeadm 去组多节点集群会顺利很多。三是阿里云 ACK。这是托管版 K8s 服务好处是控制台创建几分钟搞定坏处是你碰不到控制平面组件理解和排查问题的深度必然受限。如果你是公司项目要快速上线ACK 是最优解但如果你是自学请先亲手搭一个。我个人建议的学习组合拳先用 K3s 快速跑通部署再用 kubeadm 装一套“正儿八经”的集群哪怕单节点最后过渡到 ACK 或生产环境时就会觉得一切尽在掌握。3.2 安装 K3s 并验证集群状态命令带注释登录服务器后执行以下命令安装 K3s# 安装 K3s 最新稳定版 curl -sfL https://get.k3s.io | sh -这条命令会自动检测系统架构、下载 K3s 二进制、注册 systemd 服务并完成启动。正常情况下一两分钟就能装完。装完后执行# 查看 k3s 服务状态确保 running sudo systemctl status k3s # 使用 k3s 自带的 kubectl 查看节点状态 sudo /usr/local/bin/k3s kubectl get nodes看到节点状态为 Ready说明集群已经可用。这里有个细节K3s 默认把 kubeconfig 文件放在了/etc/rancher/k3s/k3s.yaml让本机操作 K8s 的工具是 kubectl你每次执行 kubectl 都需要带上--kubeconfig参数或把配置导出到默认路径# 把 k3s 的 kubeconfig 导出到默认位置方便直接用 kubectl 命令 export KUBECONFIG/etc/rancher/k3s/k3s.yaml kubectl get nodes -o wide另外如果你希望在本地电脑上直接操作远程 K8s 集群可以在本地安装 kubectl然后把服务器的 kubeconfig 下载下来重命名成 config 放到本地~/.kube/目录。注意修改 config 文件中的 IP从 127.0.0.1 改成你的公网 IP。出于安全考虑建议只在学习阶段这么做而且用完后尽快撤销权限。3.3 理解 K8s 核心对象与命名空间K8s 难很多是因为概念多。这里我用一张“现实类比”的表格把它讲明白。你可以把 K8s 想象成一家公司K8s 概念类比作用与说明Node工位/机器集群中的服务器是运行应用的物理基础Pod工位上的一个独立工作间最小的调度单元里面可以有一个或多个容器通常一个Deployment岗位编制声明“我要跑几个副本”负责滚动更新、回滚和自愈Service前台总机为多个 Pod 提供统一访问入口可以做负载均衡Ingress门卫/路由表基于域名和路径将外部请求转发到不同 ServiceNamespace部门逻辑隔离资源一个集群中可以划分多个命名空间有了这个类比你再看后面要执行的 YAML 文件就不会懵了。我们部署应用时通常先定义 Deployment要几个副本再定义 Service让集群内部能访问到这些 Pod最后定义 Ingress让外部能访问到 Service。这是最常见的一条链路。3.4 阿里云 ACK 与自建集群的差异点如果你的目标是学好阿里云运维ACK 迟早要会用。ACK 的托管版相当于腾讯或阿里帮我们管理了 K8s 的 control planemaster 节点所以我们不用关心 apiserver、etcd、controller-manager 等组件的健康也不需要给 master 节点打补丁。但你仍然要给工作节点配置好安全组、容器运行时、存储插件等。在 ACK 的创建流程中有几个坑需要注意。第一个是网络插件ACK 默认的 Terway 网络模式灵活性高但消耗部分 IP 资源如果你不确定选 Flannel 更省心第二个是节点池创建时选好操作系统镜像推荐 Alibaba Cloud Linux 3不要选自带 Docker 的镜像直接使用 containerd 运行时就好第三个是云盘插件如果集群要挂云盘做持久化存储务必在创建集群时勾选 CSI 插件这与后面的实践PVC/PV直接挂钩。ACK 的好处是创建后可以一键在控制台看到集群概览、节点监控、日志能明显感受到企业级运维的便捷。但请记住云上托管不等于什么都不用管配额、成本、安全组、镜像仓库权限这些运维工作依旧存在。 K8s 的底子打好了用 ACK 才会发挥最大价值。4. 核心实操从 0 部署一个可落地的练习项目安装完集群接下来是所有人都最期待的部分把一个能看到的 Web 应用跑在 K8s 里。我会设计一个轻量、完整的练习项目并拆解每个 YAML 文件的作用。这个项目要覆盖应用部署、外部访问、配置管理、数据持久化四个关键点做完这一整个流程你绝对会打通理解 K8s 的任督二脉。4.1 练习项目设计一个带 Redis 的访客计数器项目不搞花哨就是一个 Python Flask 应用每访问一次页面计数器加一数据存在 Redis 中。大致架构是一个 Web 应用 Pod一个 Redis PodWeb 应用通过 Service 暴露在集群环境内Redis 不直接暴露只作为内部依赖。你可能会说“这么简单的东西有啥用”但它麻雀虽小五脏俱全真实项目同样需要这两类不同角色的工作负载。我会用两张 YAML 文件来部署。第一张创建 redis 的 Deployment 和 Service第二张创建 flask 应用的 Deployment、Service 和 Ingress。文件能一次写对最好写不对也别慌报错信息就写在你的终端里对照着逐项修就好。在动手前先确认一下当前命名空间和节点状态然后在服务器上创建一个工作目录mkdir -p ~/k8s-practice cd ~/k8s-practice # 所有 YAML 都放在这个目录下方便管理和提交4.2 部署 Redis理解 Deployment、Service 与探针下面这段是 Redis 的 Deployment YAML。它有四处值得留意的点容器镜像版本、端口、探针、资源限制。apiVersion: apps/v1 kind: Deployment metadata: name: redis-deploy labels: app: redis spec: replicas: 1 selector: matchLabels: app: redis template: metadata: labels: app: redis spec: containers: - name: redis image: redis:7-alpine ports: - containerPort: 6379 resources: requests: memory: 64Mi cpu: 250m limits: memory: 128Mi cpu: 500m readinessProbe: # 就绪探针Pod 内端口能连上才算就绪 tcpSocket: port: 6379 initialDelaySeconds: 5 periodSeconds: 10复制到redis.yaml后执行kubectl apply -f redis.yaml kubectl get pods -o wide再创建一个 ClusterIP 类型的 Service让内部应用可通过“redis-service”这个域名访问 RedisapiVersion: v1 kind: Service metadata: name: redis-service spec: selector: app: redis ports: - port: 6379 targetPort: 6379执行kubectl apply -f redis-service.yaml后验证一下# 查看 Service 详情确认 Endpoints 已就绪 kubectl get svc kubectl get endpoints redis-service这里可能出现的坑如果 Endpoints 下面没有 IP说明 Service 的 selector 没匹配到 Pod 标签。这种低级错误排起来最耗费时间所以一开始就注意标签对齐。用kubectl get pods --show-labels查看 Pod 的标签再和 Service 的 selector 对上很快就能定位。4.3 部署 Flask 应用Ingress、ConfigMap 与现实化Flask 应用需要一个环境变量告诉你它要去连哪个 Redis。配置管理用 ConfigMap 最合适。先看一下 ConfigMap 文件apiVersion: v1 kind: ConfigMap metadata: name: flask-config data: REDIS_HOST: redis-service REDIS_PORT: 6379再看 Flask 应用的 DeploymentapiVersion: apps/v1 kind: Deployment metadata: name: flask-app labels: app: flask-app spec: replicas: 2 # 两个副本一个挂了另一个还能顶上 selector: matchLabels: app: flask-app template: metadata: labels: app: flask-app spec: containers: - name: flask-app image: your-flask-image:latest # 请替换成你自己构建的镜像 ports: - containerPort: 5000 envFrom: - configMapRef: name: flask-config readinessProbe: httpGet: path: / port: 5000 initialDelaySeconds: 5 periodSeconds: 5镜像怎么来你可以提前在 Dockerfile 里写好FROM python:3.10-slim WORKDIR /app COPY requirements.txt . RUN pip install -r requirements.txt -i https://mirrors.aliyun.com/pypi/simple/ COPY app.py . CMD [python, app.py]构建镜像并推送到自己的仓库学习阶段可以用阿里云容器镜像服务 ACR 的个人免费版。如果完全没有镜像仓库也可以把镜像构建在服务器本地但由于 K8s 默认从远端拉取镜像本地镜像建议推到仓库或使用 containerd 的本地导入能力过程更繁琐所以建议一开始就注册一个 ACR 个人版。再创建 Service 和 Ingress。Service 仍然用 ClusterIPIngress 负责把来自外部的请求路由到 Flask ServiceapiVersion: v1 kind: Service metadata: name: flask-service spec: selector: app: flask-app ports: - port: 80 targetPort: 5000 --- apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: flask-ingress spec: rules: - host: k8s-demo.example.com http: paths: - path: / pathType: Prefix backend: service: name: flask-service port: number: 80把域名k8s-demo.example.com解析到服务器 IP 后你就可以用这个域名访问应用了。如果你没有域名也可以通过 NodePort Service 直接体验但 Ingress 在企业生产里使用更普遍值得练。4.4 补充将应用 HTTPS 化与 MySQL 持久化零基础学运维一定会遇到“HTTPS 怎么配”的问题。阿里云上可以申请免费 SSL 证书常规免费证书现支持一键续期你拿到证书后可以把它配到 Ingress 里。K8s 中通行的做法是用 Secret 存放证书然后在 Ingress 里开启 TLS# 创建 TLS Secret kubectl create secret tls k8s-demo-tls --certfullchain.pem --keyprivkey.pem # Ingress 增加 tls 配置 apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: flask-ingress spec: tls: - hosts: - k8s-demo.example.com secretName: k8s-demo-tls rules: - host: k8s-demo.example.com http: paths: - path: / pathType: Prefix backend: service: name: flask-service port: number: 80不过这里有一个非常容易踩的坑如果你用 ACK 的 SLB 转发 HTTPS你得先在阿里云控制台把证书上传并配置到负载均衡然后再把后端 Service 流量转发到 K8s 内。层级关系不同反映出的现象也不同最常见的就是“浏览器报证书错误但 K8s 里怎么检查都正常”。另一个进阶练习是 MySQL 持久化。我把核心逻辑说一下你需要创建 PVCPersistentVolumeClaim再写 Deployment 里使用该 PVC 作为数据目录。在阿里云 ACK 上你可以选择云盘存储类比如alicloud-disk-essd通过动态 Provisioning 自动创建云盘。在自建 K3s 上也可以用其内置的 Local-Path 存储类本地路径这个非常适合学习kubectl get storageclass # NAME PROVISIONER RECLAIMPOLICY # local-path (default) rancher.io/local-path Delete下面这个 MySQL 状态化部署的 YAML 可以作为练习交给读者自己完成apiVersion: v1 kind: PersistentVolumeClaim metadata: name: mysql-pvc spec: storageClassName: local-path accessModes: - ReadWriteOnce resources: requests: storage: 5Gi把这些练完你基本已经掌握了 K8s 核心对象的使用后续只是再加 StatefulSet、HPA、ServiceAccount、NetworkPolicy 这些进阶内容而已。5. 运维排障实战常见问题与排查思路一旦开始实操报错是常态。本章专门整理一套排查思路和常见问题速查表这是普通文档里不会写的内容。你会发现真正拉开运维水平差距的不是背了多少命令而是定位问题的速度。5.1 高频故障速查表下面这张表是我在实际学习、工作中总结的高频报错基本把新手阶段的坑全覆盖了。故障现象可能原因定位命令解决套路Pod 一直 Pending节点资源不足 / 调度失败kubectl describe pod pod名看 Events 区域排查资源和污点taintsPod 一直 ContainerCreating镜像拉取失败 / 存储挂载失败kubectl describe pod pod名先看 Events再看节点上的 containerd 日志Pod 一直 CrashLoopBackOff应用启动后退出kubectl logs pod名看应用日志可能是配置错误或依赖未就绪Service 能通但域名不通CoreDNS 问题kubectl get pods -n kube-system看 coredns 是否 Running必要时删除 Pod 让其重建外部访问不了 NodePort安全组没放行端口客户端 telnet 服务器IP 端口去阿里云控制台加安全组规则kubectl 报权限错误kubeconfig 过期或证书问题kubectl config view重新生成 kubeconfig检查时间同步节点显示 NotReadykubelet 或 CNI 插件异常登录节点执行journalctl -u k3s或systemctl status k3s修复 CNI 网络插件或重启节点服务5.2 核心排查三步法describe、logs、exec遇到任何 K8s 问题我都会按以下三步走。先kubectl get pods看整体状态再kubectl describe pod pod名看事件最下面的 Events 区域往往直接告诉你原因最后kubectl logs pod名看应用日志定位程序问题。如果应用日志看不出来还可以kubectl exec -it pod名 -- sh进入 Pod 内部用 curl、ping、telnet 等命令检查网络或配置。这套方法的精髓在于先看基础设施层面的调度和启动状态再看应用层面的运行状态两个层次分开排查。很多人一上来就去网上一顿搜报错效率极低。先看 describe 里的 Events原因往往就在那里白纸黑字写着“Failed to pull image”或“0/1 nodes are available”比任何搜索引擎都直接。5.3 四个容易搞晕的细节配置 kubectl 时最容易搞晕的是 kubeconfig 的 context。一台机器上可能有多个集群比如你用 K3s 练习同时公司有个 ACK 集群忘记切换 context 就把 Deployment 发到错误集群了。用kubectl config get-contexts查看用kubectl config use-context 名字切换先把这招学会再继续操作。第二个容易搞晕的是 Service 的 port、targetPort、nodePort 三者关系。port 是 Service 的端口targetPort 是容器的端口nodePort 是节点上对外暴露的端口。访问流量路径是“节点 IP:nodePort - Service IP:port - Pod IP:targetPort”中间任何一段对不上链路就断了。第三个容易搞晕的是镜像拉取策略。镜像标签写latest时默认策略是Always每次都拉最新版私有仓库更新不及时就会导致 Pod 拉到旧镜像写固定版本号比如redis:7-alpine时默认策略是IfNotPresent本地有就不再拉。学习阶段建议固定版本号这样才能保证环境一致性。第四个容易搞晕的是命名空间。很多新手用kubectl get pods看不到任何 Pod就以为集群坏了其实只是当前 Namespace 里没有资源而kube-system里的系统组件活得好好的。记住默认命令只操作当前 Namespace必须用-n或-A指定你要看的命名空间。5.4 containerd 与镜像操作要点新版 K8s以及 K3s 的默认运行时都使用 containerd 而不是 Docker。有些人在节点上执行docker images发现什么都看不到这不代表没有镜像。containerd 的命令是crictlcrictl images crictl ps -a crictl logs 容器ID常见困境是在节点上手动docker pull了一个镜像然后 K8s 用它创建 Pod 时还是报“镜像拉取失败”。原因往往是 containerd 没有 docker 的认证配置或者镜像在本地 Docker 里但 containerd 不认。这时有两个选择一是直接用crictl pull拉镜像二是把 Docker 的 config.json 同步到 containerd 的配置目录。这个坑非常典型尤其在你搭私有仓库的时候。5.5 集群备份与恢复等等比你想的更简单很多零基础同学压根没考虑过备份直到某一天 K3s 数据目录损坏才醒悟。K8s 的备份分两层etcd 数据备份和资源清单备份。对于生产集群etcd 备份是正路但对于 K3s 学习环境我建议平时直接把所有 YAML 文件收进一个 Git 仓库并用kubectl get deploy,svc,ingress,configmap -n 你的命名空间 -o yaml backup.yaml定期导出一份资源清单。这样就算集群重建也可以用kubectl apply -f backup.yaml一键恢复。这比折腾 etcd 快得多而且对零基础更友好。阿里云云盘快照也不能忽略。如果你的 ECS 数据盘上有重要数据比如数据库文件直接在控制台上创建快照然后隔两三天手动做一次增量快照即可。对学习型项目来说这套方式成本低但关键时刻能救命。6. 给新手的几条实在建议讲真K8s 入门失败率很高不是因为它难而是因为很多人把它想得太难还没开始就怕了或者一上来就挑战太高强度的操作。我最后想分享几条亲测有效的建议。第一先“抄”后“超”别从零开始写 YAML。官方文档里每个资源对象都有完整的示例照着抄改改名字和镜像跑通了再逐步调整参数。真正的高手也是这么起步的。第二遇到报错先读事件再搜解决方案。K8s 的报错往往已经告诉了你 80% 的原因只是你缺少耐心看它。把kubectl describe输出的最后几行 Events 当成聊天信息一样去读排障速度会快很多。第三多用 Linux 和它对个话。 K8s 最终跑在 Linux 上很多问题归根结底是 Linux 的问题。不会看日志就去看 systemd不会搞网络就抓包不会看资源就用 top。这些基础能力越早补后面越轻松。第四做实验时批量完成、错了不慌。哪怕是生产架构师也不可能次次部署一次成功。YAML 写错、端口写错、镜像名写错都是常态。重要的是你掌握了“如何知道哪里错了”和“如何修正”的闭环能力。只要这个闭环还在你就在进步。第五所有练习项目一定要落盘。学完一个阶段后把这个阶段用到的命令、YAML、问题笔记整理到自己的知识库里。用最朴素的 Markdown 记就行。别高估自己的记忆力三个月后你会回来感谢自己的笔记。如果你愿意接下来可以做这些进阶尝试用 kubeadm 搭一个双节点或多节点集群练习滚动发布和回滚给集群加 HPA水平自动伸缩并压测观察扩缩容甚至把阿里云 ACR 和 ACK 用起来体验企业级发布流程。每往前一步你对云原生运维的理解就更深一层。我现在回头看当初每个“不知道为什么”的报错都是最宝贵的成长点。动手吧先把第一个 Pod 跑起来后面的一切都会慢慢变清晰。
返回列表