news 2026/6/12 0:37:00

K8s实操四天速成包:含每日讲义PDF/MD+可运行YAML模板(Service/RBAC/Metrics)

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
K8s实操四天速成包:含每日讲义PDF/MD+可运行YAML模板(Service/RBAC/Metrics)

本文还有配套的精品资源,点击获取

简介:从第二天开始,连续四天带你动手搭建和管理Kubernetes集群,每天配套Markdown和PDF双格式讲义,图文资源齐全,适配kubeadm部署的本地实验环境。第二天聚焦Pod与Deployment基础操作;第三天详解Service暴露方式,包含NodePort配置模板(service-nodeport.yaml);第四天集成Metrics Server实现资源监控,并部署RBAC权限控制文件(mandatory.yaml);第五天落地常用推荐插件(recommended.yaml)。所有YAML文件开箱即用,稍作修改就能在真实集群中执行。导学大纲用XMind梳理知识路径,帮你快速理清K8s核心组件关系和服务暴露逻辑。适合零基础自学、讲师备课或团队内部技术拉练,内容不讲理论堆砌,只留关键命令、配置要点和排错提示。

1. 这不是K8s理论课,是四天“能跑通、能改、能排错”的实操包

你打开这个资料包时,大概率正站在两个现实路口之间:一边是翻了三天《Kubernetes权威指南》却连一个Pod都起不起来的挫败感;另一边是团队下周就要上马微服务架构,而你手里的集群还卡在kubectl get nodes返回NotReady的状态。别急——这套“K8s实操四天速成包”,就是专为这种“时间紧、任务重、环境糙”的真实场景设计的。它不讲Pod是什么抽象概念,而是直接给你pod-nginx.yaml,告诉你删掉哪一行就能让容器立刻吐出404而不是CrashLoopBackOff;它不解释RBAC的API Group设计哲学,而是把mandatory.yaml里每一行apiVersionkindsubjects字段的取值逻辑,用你本地kubeadm集群的实际输出截图对照着标出来;它甚至提前预判了你在Day3配NodePort时最可能踩的三个坑:kube-proxy没开iptables模式、云厂商安全组没放端口、service selector标签和pod label对不上——每个都配了kubectl describe svc xxx的典型输出片段和逐行解读。

关键词里写的“K8s实操”不是虚的——所有内容都经过我本人在三台不同配置的物理机(i5-8400/16G/Ubuntu 22.04、Ryzen 5 3600/32G/CentOS 7.9、MacBook Pro M1/16G/UTM虚拟机)上,用kubeadm v1.28.2完整复现过至少五轮。YAML模板不是从官网Ctrl+C/V粘贴来的“理想状态”,而是带着真实环境的妥协痕迹:比如metrics-server-deployment.yaml里特意保留了--kubelet-insecure-tls参数,因为kubeadm默认生成的kubelet证书在自建集群里常被忽略校验;service-nodeport.yamlnodePort: 30080这个值,是我反复测试后确认在绝大多数Linux发行版防火墙规则下不会被systemd-resolved或firewalld拦截的“安全端口区间”。PDF讲义不是MD文件的简单转换,而是针对打印场景优化了字体层级、删减了命令行高亮色块(避免黑白打印机糊成一片)、给所有kubectl命令加了行号标注——方便讲师在投影仪上指着第7行说:“这里漏了namespace,你们看控制台报错第一句就提示了”。这不是一套“学完就能当架构师”的资料,而是一份“今天下午搭好集群,明天上午就能把测试环境的Spring Boot应用挂上去”的作战地图。

2. 内容整体设计与思路拆解:为什么是这四天?为什么只到Day5?

2.1 四天节奏的底层逻辑:避开理论深坑,直击交付瓶颈

很多人学K8s卡死在“第一天”——不是因为不会装kubectl,而是因为被etcd、CNI、Kubelet启动流程这些底层组件绕晕了。这套资料刻意跳过Day1的集群搭建,直接从Day2开始,原因很实在:90%的国内中小团队实际使用的都是kubeadm一键部署的集群,且运维同学已经帮你搞定基础环境。你真正要面对的,是“集群有了,但我的服务怎么让用户访问?”、“监控面板为啥全是NaN?”、“开发同事说权限不够,我该给他什么角色?”这类交付现场问题。所以四天的设计完全按生产环境问题倒推:

  • Day2(Pod/Deployment)解决“服务怎么活下来”的问题。重点不是讲ReplicaSet原理,而是让你亲手把一个Nginx Pod从Pending状态拉到Running,并用kubectl logs -f实时看到访问日志滚动。这里埋了一个关键细节:所有YAML模板都强制指定imagePullPolicy: IfNotPresent,因为本地实验环境几乎没人配私有镜像仓库,用Always会导致每次创建都去Docker Hub拉镜像,超时失败率极高——这是我在三次内部培训中观察到的最高频报错。

  • Day3(Service)攻克“服务怎么被访问”的生死线。NodePort配置不是简单贴个yaml,而是拆解成三步验证:先用curl http://<node-ip>:30080确认节点层通路,再用kubectl port-forward svc/nginx 8080:80做隧道验证,最后才上Ingress。配套的service-nodeport.yaml里,selector字段的值app: nginx和Day2的Pod模板严格对齐,避免新手因标签不一致导致Endpoint为空的经典陷阱。

  • Day4(Metrics+RBAC)直面“服务怎么被信任和观测”的管理难题。Metrics Server部署必须和RBAC绑定讲解,因为kubectl top nodes报错metrics.k8s.io/v1beta1unavailable,90%的情况是mandatory.yaml里ClusterRoleBinding的subjects没指向正确的ServiceAccount。我们把system:auth-delegator这个容易拼错的字符串,在PDF讲义里用红色方框单独标注,并附上kubectl get clusterrolebinding metrics-server -o yaml的完整输出对比图。

  • Day5(recommended.yaml)落地“服务怎么更顺手”的工程实践。这里的插件不是罗列清单,而是按使用频率排序:CoreDNS排第一(没有它,所有服务发现都失效),Dashboard排第二(但明确警告“仅限内网调试,生产禁用”),最后才是Metrics Adapter(为HPA做准备)。每个插件的YAML都带# [WARNING]注释块,比如Dashboard的service-account.yaml里写着:“此SA拥有cluster-admin权限,请勿在生产环境部署”。

这个节奏的本质,是把K8s学习从“组件认知”转向“问题解决”。你不需要理解kube-scheduler的调度算法,但必须知道kubectl describe pod xxx输出里Events段最后一行FailedScheduling意味着什么,以及如何用kubectl get nodes --show-labels快速定位节点标签缺失。

2.2 为什么止步Day5?——聚焦“能闭环”的最小知识集

市面上很多K8s课程堆砌到Day10,涵盖Operator、CRD、Kustomize等高级主题,但实际调研显示:73%的初级运维和开发人员,在入职前三个月最常遇到的K8s问题,全部集中在Pod生命周期管理、Service暴露、基础监控和权限分配这四个环节。Day5的recommended.yaml已是能力边界——它包含的CoreDNS、Dashboard、Metrics Server,恰好构成一个可独立运行的最小可观测集群闭环:你能解析服务名(CoreDNS)、能图形化看Pod状态(Dashboard)、能查CPU/MEM使用率(Metrics Server)。再往后如Ingress Controller、Cert-Manager、Prometheus,虽然重要,但属于“需要根据业务选型”的扩展层,而非“不掌握就无法交付”的基础层。

更重要的是,Day5刻意留白。recommended.yaml里Dashboard的Service类型是NodePort而非LoadBalancer,就是逼你动手改成ClusterIP再配Ingress——这个改动过程,比直接给你一个完美的Ingress YAML更能建立网络模型认知。所有资料的终点,不是给你一个封闭的答案,而是给你一把能自己打开下一扇门的钥匙。

3. 核心细节解析与实操要点:讲义之外,那些没写进PDF的硬核经验

3.1 讲义双版本的设计意图:MD是你的操作手册,PDF是你的汇报武器

很多人以为MD和PDF只是格式差异,其实它们承载完全不同的使用场景:

  • Markdown讲义(讲义(md版)目录)是纯命令行工作流。所有kubectl命令都带$前缀,关键参数用**粗体**高亮(如kubectl apply -f **service-nodeport.yaml**),错误输出用>引用块呈现(如> Error from server (NotFound): services "nginx" not found)。更关键的是,每个命令后紧跟“执行后你应该看到什么”——比如kubectl get pods -n kube-system之后,会明确写出预期输出的前三行:
    NAME READY STATUS RESTARTS AGE coredns-5d78c9869d-2zq8p 1/1 Running 0 2d metrics-server-7bf5c6b79d-8v9wq 1/1 Running 0 1d
    这样你一眼就能判断是否成功,不用再翻文档猜状态码。

  • PDF讲义(讲义(pdf版)目录)是为“非终端场景”设计的。比如你给领导做技术方案汇报,需要展示“K8s服务暴露路径”,PDF里就有清晰的三层架构图:客户端→NodePort→Service→Pod,每层用不同颜色箭头标注流量方向,并在Service层旁批注“此处需确保kube-proxy运行模式为iptables(非ipvs)”。所有截图都经过裁剪,只保留kubectl get svc输出的关键列(NAME、TYPE、CLUSTER-IP、EXTERNAL-IP、PORT(S)),避免信息过载。甚至字体大小都做了适配:标题用18pt加粗,命令行代码用12pt等宽字体,备注文字用10pt灰色——确保投影到会议室大屏时,后排同事也能看清PORT(S)列的80:30080/TCP

提示:MD讲义里的所有代码块,都经过shellcheck静态扫描,确保无语法错误;PDF讲义中的所有截图,均来自真实kubeadm v1.28.2集群,时间戳可见右下角(如2024-06-15 14:22:31),杜绝“P图教学”。

3.2 YAML模板的“可运行”秘密:不只是语法正确,更是环境友好

所有YAML文件放在assets/目录下,但它们的“可运行”属性,藏在你看不见的细节里:

  • 镜像版本锁定pod-nginx.yaml里写的是image: nginx:1.25.3-alpine,而非nginx:latest。因为latest在不同时间拉取可能得到不同版本,Alpine版则确保最小攻击面且兼容性稳定。我们测试过1.25.3在CentOS 7.9和Ubuntu 22.04上均无glibc兼容问题。

  • 资源限制的务实取值deployment-nginx.yamlresources.requests.memory: "64Mi",这个值不是拍脑袋定的。我们用kubectl top pods监控了Nginx容器空载时的真实内存占用,发现稳定在42-58Mi之间,所以设64Mi既留出缓冲,又避免因requests过高导致调度失败(尤其在单节点实验集群)。

  • RBAC的最小权限实践mandatory.yaml里的ClusterRole定义,只包含Metrics Server必需的nodes/statspods/stats权限,删掉了官网示例中多余的secretsconfigmaps读取权限。这样即使误部署到生产环境,风险也局限在监控数据层面。

  • NodePort端口的避坑选择service-nodeport.yamlnodePort: 30080,这个值经过三重验证:① 大于30000(K8s默认NodePort范围下限);② 小于32767(Linux临时端口上限,避免与系统进程冲突);③ 在netstat -tuln | grep :30080中确认未被占用。我们甚至写了检查脚本check-port.sh放在assets/目录,运行它会自动扫描30000-32767区间内所有可用端口。

3.3 XMind导学大纲:不是知识树,而是故障排查路线图

导学大纲k8s-4day-xmind.xmind的结构,表面是知识脉络,实则是按“报错关键词”组织的索引:

  • 当你看到kubectl get nodes返回NotReady,大纲会指引你跳转到“Day2 → 集群健康检查 → kubelet状态验证”分支;
  • kubectl top nodes报错the server is currently unable to handle the request,大纲直接链接到“Day4 → Metrics Server部署 → RBAC权限修复”节点,并附上kubectl auth can-i --list -n kube-system的预期输出;
  • 当Service无法访问,大纲提供三级排查路径:网络层(telnet <node-ip> 30080)→ K8s层(kubectl get endpoints nginx)→ 应用层(kubectl exec -it <pod> -- curl localhost:80)

这个大纲的每个节点,都对应一个真实故障场景。它不教你“什么是Endpoint”,而是告诉你“当你在kubectl get endpoints输出里看到<none>时,下一步该检查Pod的label是否匹配Service的selector”。

4. 实操过程与核心环节实现:从Day2到Day5,每一步都附带“现场录像式”记录

4.1 Day2:Pod与Deployment——让容器真正活下来

4.1.1 创建Pod的“三板斧”验证法

不要一上来就kubectl apply -f pod-nginx.yaml。先执行这三步,建立环境基线:

  1. 检查节点状态
    bash kubectl get nodes -o wide # 预期输出:STATUS为Ready,ROLES含control-plane或<none>,VERSION为v1.28.2 # 若STATUS为NotReady,立即执行:sudo systemctl status kubelet

  2. 验证容器运行时
    bash sudo crictl ps -a | head -5 # 预期看到coredns、etcd等系统容器。若为空,说明containerd未启动:sudo systemctl start containerd

  3. 确认镜像已存在
    bash sudo crictl images | grep nginx # 若无输出,手动拉取:sudo crictl pull nginx:1.25.3-alpine

注意:crictl是K8s推荐的容器运行时CLI,比docker ps更可靠,因为它直连containerd socket,不受Docker Desktop干扰。

4.1.2 pod-nginx.yaml的核心字段解读(附实测日志)
apiVersion: v1 kind: Pod metadata: name: nginx-pod labels: app: nginx # ← 此标签将被Day3的Service selector引用 spec: containers: - name: nginx image: nginx:1.25.3-alpine ports: - containerPort: 80 protocol: TCP resources: requests: memory: "64Mi" # ← 实测空载占用52Mi,此值确保调度成功 cpu: "100m" restartPolicy: Always # ← 关键!若设为Never,容器退出后不会重启

创建后,用以下命令组合验证:

# 1. 看Pod状态(重点关注READY列) kubectl get pods -w # -w参数持续监听,直到出现Running # 2. 查看实时日志(确认Nginx已启动) kubectl logs nginx-pod -f # 应看到"using 1 worker processes"等启动日志 # 3. 进入容器执行curl(验证内部网络) kubectl exec -it nginx-pod -- curl -s http://localhost:80 | head -3 # 预期输出HTML片段,证明容器内服务正常

实操心得:若kubectl logs返回Error from server: no such container,90%是Pod刚创建就被OOMKilled。此时立即执行kubectl describe pod nginx-pod,在Events段找OOMKilled字样,然后调高resources.requests.memory

4.1.3 Deployment升级的“灰度”技巧

deployment-nginx.yaml比Pod多了滚动更新能力。但新手常犯的错是直接kubectl apply后就认为升级完成。正确做法是:

# 1. 先查看当前副本状态 kubectl get deploy nginx-deploy -o wide # 2. 修改镜像版本(如从1.25.3升级到1.25.4) sed -i 's/nginx:1.25.3-alpine/nginx:1.25.4-alpine/g' deployment-nginx.yaml # 3. 执行滚动更新(注意--record参数,便于回滚) kubectl apply -f deployment-nginx.yaml --record # 4. 实时观察滚动过程(关键!) kubectl rollout status deploy nginx-deploy -w # 输出"deployment \"nginx-deploy\" successfully rolled out"即完成 # 5. 验证新Pod的镜像版本 kubectl get pods -l app=nginx -o jsonpath='{.items[0].spec.containers[0].image}' # 应返回nginx:1.25.4-alpine

注意:kubectl rollout statuskubectl get deploy更可靠,因为它等待所有新Pod Ready才返回成功。曾有学员因跳过此步,直接访问服务导致502错误——旧Pod已销毁,新Pod尚未就绪。

4.2 Day3:Service暴露——打通从集群外到容器的最后一公里

4.2.1 NodePort配置的“三重门”验证

service-nodeport.yaml看似简单,但必须通过三道关卡:

apiVersion: v1 kind: Service metadata: name: nginx-service spec: type: NodePort selector: app: nginx # ← 必须与Day2 Pod的labels.app值完全一致! ports: - port: 80 targetPort: 80 nodePort: 30080 # ← 端口必须在30000-32767之间

第一重门:节点层连通性

# 在Master节点执行(假设节点IP为192.168.1.100) curl -v http://192.168.1.100:30080 # 若返回Nginx欢迎页,说明kube-proxy已将请求转发到Pod # 若超时,检查防火墙:sudo ufw status(Ubuntu)或 sudo firewall-cmd --list-ports(CentOS)

第二重门:K8s层服务绑定

# 检查Endpoints是否关联到Pod kubectl get endpoints nginx-service # 预期输出类似:192.168.1.101:80(Pod IP:Port) # 若为<none>,执行:kubectl get pods -l app=nginx,确认Pod的label是否匹配selector # 深度诊断:查看kube-proxy日志 sudo journalctl -u kube-proxy | tail -20 | grep -i "nginx-service" # 若出现"no endpoints for service",说明selector不匹配

第三重门:应用层健康检查

# 进入Pod内部,确认服务监听80端口 kubectl exec nginx-pod -- netstat -tuln | grep :80 # 应返回:tcp6 0 0 :::80 :::* LISTEN # 若无输出,说明Nginx未启动,检查Pod日志:kubectl logs nginx-pod
4.2.2 Service类型选择决策树
场景推荐类型原因风险提示
本地实验/开发调试NodePort无需额外组件,直接用节点IP访问端口需手动管理,云环境可能被安全组拦截
测试环境(多服务)ClusterIP + Ingress统一入口,支持域名路由需额外部署Ingress Controller(Day5的recommended.yaml含Nginx Ingress)
生产环境(裸金属)LoadBalancer自动分配外部IP仅云厂商支持,本地集群需MetalLB等替代方案

实操心得:在service-nodeport.yaml中,我们故意将type: NodePort写在spec第一行,而非末尾。因为kubectl apply时,若YAML格式错误,K8s会优先报告type字段解析失败,比报selector语法错误更容易定位问题。

4.3 Day4:Metrics Server与RBAC——让监控数据真实可信

4.3.1 Metrics Server部署的“四步通关”

Metrics Server不是装上就完事,必须验证数据链路完整:

  1. 部署Metrics Server(含RBAC)
    bash kubectl apply -f assets/metrics-server-deployment.yaml kubectl apply -f assets/mandatory.yaml # 包含ClusterRole/Binding

  2. 等待API注册
    bash kubectl get apiservice | grep metrics # 预期输出:v1beta1.metrics.k8s.io kube-system/metrics-server True # 若为False,执行:kubectl describe apiservice v1beta1.metrics.k8s.io

  3. 验证指标获取
    bash kubectl top nodes # 首次运行可能需30秒,预期输出节点CPU/MEM使用率 kubectl top pods -n kube-system # 应看到metrics-server自身占用率(通常<5% CPU)

  4. 故障快查表
    | 现象 | 可能原因 | 快速验证命令 |
    |------|----------|--------------|
    |kubectl top nodes报错unable to fetch metrics| Metrics Server Pod未就绪 |kubectl get pods -n kube-system \| grep metrics|
    |kubectl top nodes返回<unknown>| kubelet未开启–read-only-port |sudo ps aux \| grep kubelet \| grep read-only-port|
    |kubectl top pods无输出 | Pod未上报指标(需容器内应用暴露/metrics端点) |kubectl exec <pod> -- curl -s localhost:8080/metrics|

4.3.2 mandatory.yaml的RBAC权限精析

mandatory.yaml是Metrics Server的权限基石,其关键段落如下:

--- apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRole metadata: name: system:metrics-server rules: - nonResourceURLs: - "/metrics" verbs: - "get" - apiGroups: - "" resources: - "pods" - "nodes" - "nodes/stats" # ← 核心!获取节点统计信息 - "configmaps" verbs: - "get" - "list" - "watch" --- apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRoleBinding metadata: name: system:metrics-server roleRef: apiGroup: rbac.authorization.k8s.io kind: ClusterRole name: system:metrics-server subjects: - kind: ServiceAccount name: metrics-server # ← 必须与metrics-server-deployment.yaml中serviceAccountName一致 namespace: kube-system

注意:subjects.name必须与Deployment中spec.template.spec.serviceAccountName完全相同。我们曾遇到学员因复制粘贴时多了一个空格,导致kubectl auth can-i --list -n kube-system显示no resources found,最终用kubectl get sa -n kube-system逐行比对才发现。

4.4 Day5:recommended.yaml——生产就绪的插件组合拳

4.4.1 recommended.yaml的插件加载顺序逻辑

该文件不是插件清单,而是按依赖关系编排的部署序列:

# 1. CoreDNS(必须第一个,所有服务发现的基础) apiVersion: v1 kind: ServiceAccount metadata: name: coredns namespace: kube-system # 2. Dashboard(依赖CoreDNS解析kubernetes.default.svc) apiVersion: v1 kind: ServiceAccount metadata: name: kubernetes-dashboard namespace: kubernetes-dashboard # 3. Metrics Server(依赖Dashboard的ServiceAccount权限) apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRoleBinding metadata: name: kubernetes-dashboard namespace: kubernetes-dashboard subjects: - kind: ServiceAccount name: kubernetes-dashboard namespace: kubernetes-dashboard roleRef: apiGroup: rbac.authorization.k8s.io kind: ClusterRole name: cluster-admin

部署命令必须严格按顺序:

# 1. 先部署CoreDNS(若集群无DNS,后续所有kubectl命令都会超时) kubectl apply -f assets/recommended.yaml -l component=coredns # 2. 再部署Dashboard(等待CoreDNS就绪) kubectl apply -f assets/recommended.yaml -l component=dashboard # 3. 最后部署Metrics Server(依赖Dashboard的RBAC) kubectl apply -f assets/recommended.yaml -l component=metrics-server

提示:-l component=xxx是kubectl的label selector,可精准部署单个插件,避免全量apply导致冲突。

4.4.2 Dashboard安全访问的“最小化”实践

recommended.yaml中Dashboard的Service是NodePort,但访问时必须走Token认证:

# 1. 创建专用ServiceAccount(非默认admin) kubectl create serviceaccount dashboard-admin-sa -n kube-system # 2. 绑定cluster-admin角色(仅限测试环境!) kubectl create clusterrolebinding dashboard-admin-sa \ --clusterrole=cluster-admin \ --serviceaccount=kube-system:dashboard-admin-sa # 3. 获取Token(复制输出的长字符串) kubectl -n kube-system create token dashboard-admin-sa

访问地址:https://<master-ip>:30080(NodePort端口),登录时选择Token方式,粘贴上一步获取的字符串。

重要警告:cluster-admin权限仅用于本地调试!生产环境应创建最小权限角色,例如只允许get/list/watchpods、services等资源。

5. 常见问题与排查技巧实录:那些讲义里没写的“血泪教训”

5.1 四天高频问题速查表

问题现象根本原因排查命令解决方案
kubectl get nodes返回NotReadykubelet未启动或containerd异常sudo systemctl status kubelet
sudo systemctl status containerd
启动服务:sudo systemctl start kubelet containerd
kubectl apply -f xxx.yaml报错error validating dataYAML缩进错误或字段名拼错yamllint xxx.yaml(需先安装:pip install yamllint用VS Code的YAML插件实时校验,或在线工具 https://www.yamllint.com
kubectl top nodes返回error: Metrics API not availableMetrics Server未注册API或RBAC未生效kubectl get apiservice v1beta1.metrics.k8s.io
kubectl auth can-i --list -n kube-system
检查mandatory.yaml中ClusterRoleBinding的subjects.name是否与Deployment中serviceAccountName一致
Service无法访问,kubectl get endpoints显示<none>Pod的label与Service的selector不匹配kubectl get pods --show-labels
kubectl get svc nginx-service -o yaml \| grep -A5 selector
kubectl label pod <pod-name> app=nginx --overwrite动态修正标签
kubectl logs返回Unable to retrieve container logs容器已退出且未配置restartPolicy: Alwayskubectl describe pod <pod-name>(看Events段)修改Pod YAML,添加restartPolicy: Always,重新apply

5.2 “看不见”的环境陷阱与规避方案

5.2.1 时间同步陷阱

K8s集群对节点时间差极其敏感。若Master与Worker节点时间相差超过1分钟,可能导致证书校验失败、etcd通信中断。

检测命令

# 在所有节点执行 timedatectl status | grep "System clock synchronized" # 若为no,执行: sudo timedatectl set-ntp on sudo systemctl restart systemd-timesyncd

实操心得:我们在三台测试机中,故意将一台Worker节点时间拨快5分钟,结果kubectl get nodes持续显示NotReadyjournalctl -u kubelet中大量x509: certificate has expired or is not yet valid错误。修复时间后10秒内节点状态恢复正常。

5.2.2 DNS解析缓存陷阱

本地开发环境常使用/etc/hosts映射域名,但K8s内部DNS(CoreDNS)会缓存解析结果,导致kubectl execcurl http://my-service失败。

清除缓存命令

# 重启CoreDNS Pod(触发缓存重建) kubectl delete pod -n kube-system -l k8s-app=kube-dns # 或直接清理节点级DNS缓存(Ubuntu) sudo systemd-resolve --flush-caches
5.2.3 磁盘空间陷阱

/var/lib/containerd目录默认不清理,长期运行后可能占满磁盘,导致Pod无法创建。

清理命令

# 查看磁盘使用 df -h /var/lib/containerd # 清理未使用镜像和容器 sudo crictl rmi --prune # 设置containerd自动清理(修改/etc/containerd/config.toml) # [plugins."io.containerd.grpc.v1.cri".registry.configs] # [plugins."io.containerd.grpc.v1.cri".registry.configs."*".tls] # insecure_skip_verify = true # [plugins."io.containerd.grpc.v1.cri".containerd] # snapshotter = "overlayfs" # default_runtime_name = "runc" # [plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc] # runtime_type = "io.containerd.runc.v2" # [plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc.options] # SystemdCgroup = true # [plugins."io.containerd.grpc.v1.cri".containerd.default_runtime] # runtime_type = "io.containerd.runc.v2" # [plugins."io.containerd.grpc.v1.cri".containerd.untrusted_workload_runtime] # runtime_type = "io.containerd.runc.v2" # [plugins."io.containerd.grpc.v1.cri".containerd.garbage_collection] # enabled = true # interval = "30m"

提示:crictl rmi --prune是安全清理命令,它只删除未被任何容器引用的镜像,不会误删正在运行的镜像。

5.3 我踩过的三个“反直觉”坑

坑1:kubectl port-forward的本地端口绑定

初学者常以为kubectl port-forward svc/nginx 8080:80后,就能在浏览器访问http://localhost:8080。但若本地8080端口被其他程序(如Apache)占用,命令会静默失败,且不报错。解决方案:始终加上--address 127.0.0.1显式绑定,或用lsof -i :8080检查端口占用。

坑2:kubectl exec的Shell选择

kubectl exec -it nginx-pod -- /bin/bash在Alpine镜像中会失败,因为Alpine默认只有/bin/sh解决方案:统一用/bin/sh,或在YAML中指定command: ["/bin/sh"]

坑3:kubectl get的默认命名空间陷阱

kubectl get pods默认查询default命名空间,但Metrics Server在kube-system。新手常因此以为“Metrics没装”,其实是查错了命名空间。解决方案:养成习惯,查系统组件必加-n kube-system,查业务Pod才用默认命名空间。

6. 最后一点个人体会:K8s不是学出来的,是“调”出来的

写完这份四天速成包,我翻出自己三年前的第一份K8s笔记——那上面密密麻麻记着kubectl get componentstatuseskubectl describe node的每个字段含义,但真正让我突破瓶颈的,是某天凌晨三点,为了一个CrashLoopBackOff状态,连续执行了27次kubectl describe pod,直到在Events段第19行发现failed to load KubeConfig这个被忽略的报错。那一刻我突然明白:K8s的精髓不在记住多少命令,而在建立一套高效的故障定位肌肉记忆——看到报错,本能地执行kubectl getkubectl describekubectl logs这个黄金三角,就像老司机听到异响,第一反应是摸变速箱油温。

所以这套资料里所有的YAML模板、所有讲义里的截图、所有XMind大纲里的分支,本质上都在训练这种肌肉记忆。它不承诺让你成为K8s专家,但保证你能在下次会议中,当老板问“我们的服务怎么对外访问”,你能打开终端,30秒内敲出kubectl get svc,指着EXTERNAL-IP那一列说:“就是这个IP加端口,我已经配好了”。这种确定性,比任何理论都珍贵。

如果你在实操中遇到讲义没覆盖的问题,欢迎随时反馈。毕竟,所有“标准答案”,都诞生于真实的报错日志里。

本文还有配套的精品资源,点击获取

简介:从第二天开始,连续四天带你动手搭建和管理Kubernetes集群,每天配套Markdown和PDF双格式讲义,图文资源齐全,适配kubeadm部署的本地实验环境。第二天聚焦Pod与Deployment基础操作;第三天详解Service暴露方式,包含NodePort配置模板(service-nodeport.yaml);第四天集成Metrics Server实现资源监控,并部署RBAC权限控制文件(mandatory.yaml);第五天落地常用推荐插件(recommended.yaml)。所有YAML文件开箱即用,稍作修改就能在真实集群中执行。导学大纲用XMind梳理知识路径,帮你快速理清K8s核心组件关系和服务暴露逻辑。适合零基础自学、讲师备课或团队内部技术拉练,内容不讲理论堆砌,只留关键命令、配置要点和排错提示。


本文还有配套的精品资源,点击获取

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/12 0:29:51

ASM232S在商业航天星载数据管理系统RS-232串行通信接口中的应用研究

摘要随着全球商业航天产业的快速发展&#xff0c;低轨卫星星座、高分辨率遥感卫星以及空间科学试验平台对星载电子系统的可靠性、抗辐射性能及接口兼容性提出了更为严苛的要求。RS-232作为一种经典的串行通信标准&#xff0c;尽管在商业领域已被更高速的接口标准部分替代&#…

作者头像 李华
网站建设 2026/6/12 0:28:52

MPC8535E接口电气特性实战:JTAG、SATA与I2C设计指南

1. MPC8535E接口电气特性&#xff1a;从规范到实战的设计指南在嵌入式硬件设计的江湖里&#xff0c;处理器数据手册中的“电气特性”章节&#xff0c;常常是新手工程师的“劝退区”&#xff0c;也是资深工程师的“藏宝图”。面对MPC8535E PowerQUICC III这类集成了复杂通信接口…

作者头像 李华
网站建设 2026/6/12 0:27:53

微信小程序实战:echarts-for-weixin中国地图数据可视化全流程解析

1. 环境准备与组件引入 要在微信小程序中使用echarts-for-weixin组件实现中国地图可视化&#xff0c;首先需要搭建基础开发环境。我建议使用微信开发者工具最新稳定版&#xff0c;这个工具提供了完整的调试和预览功能&#xff0c;对新手特别友好。记得在创建项目时选择JavaScri…

作者头像 李华
网站建设 2026/6/12 0:26:52

MSM030C-0300-NN-M0-CG0伺服电机

Bosch Rexroth MSM030C-0300-NN-M0-CG0 伺服电机产品特点开头&#xff1a; Bosch Rexroth MSM030C-0300-NN-M0-CG0 是德国博世力士乐集团推出的一款高性能三相永磁同步伺服电机&#xff0c;属于 MSM 系列&#xff0c;额定功率 400W&#xff0c;专为工业自动化领域的高精度运动控…

作者头像 李华
网站建设 2026/6/12 0:24:59

(十六)SV DPI实战:打通硬件验证与软件算法的桥梁

1. DPI技术&#xff1a;芯片验证的跨界桥梁 第一次接触DPI&#xff08;Direct Programming Interface&#xff09;是在五年前的一个视频处理芯片验证项目上。当时团队需要验证一个H.264编码器IP核&#xff0c;但用SystemVerilog重写整个算法需要三个月——而C语言参考代码早就躺…

作者头像 李华