Kubernetes (K8s) 核心操作速查 — 从入门到进阶¶
用途:供 AI 助手快速查阅并指导/执行 K8s 操作。实验环境:Hyper-V VM 内用 kind/k3s 搭集群。 版本基线:Kubernetes 1.37 / kind v0.33.0 / k3s v1.37.2+k3s1(核对日期 2026-11-11,来源:官网) 更新日期:2026-11-11 支持范围:官方仅维护最近 3 个小版本(1.35/1.36/1.37);1.34 已于 2026-10-27 EOL,实验集群建议 1.35+。
1. 实验环境搭建(三选一)¶
# 方案 A:kind(单机多节点集群,实验首选,秒级重建)
curl -Lo kind https://kind.sigs.k8s.io/dl/v0.33.0/kind-linux-amd64
chmod +x kind && sudo mv kind /usr/local/bin/
# kind 自动探测 docker/podman/nerdctl 作为 provider;等待就绪可用 --wait 5m
cat > kind-config.yaml <<'EOF'
kind: Cluster
apiVersion: kind.x-k8s.io/v1alpha4
nodes:
- role: control-plane
- role: worker
- role: worker
EOF
kind create cluster --name lab --config kind-config.yaml
kind delete cluster --name lab # 重建:删了再来,实验做坏即重置
# 方案 B:k3s(轻量单二进制,贴近真实多节点)
curl -sfL https://get.k3s.io | sh - # 默认 stable 通道,当前为 v1.37.2+k3s1(对应 K8s 1.37.2)
sudo k3s kubectl get nodes # kubeconfig: /etc/rancher/k3s/k3s.yaml
# 方案 C:kubeadm(最接近生产,3 台 VM,学习成本最高)
# 用 Vagrant 起 3 台 VM 后,按官方文档 kubeadm init / join
2. kubectl 基础(最高频命令)¶
kubectl get nodes -o wide # 节点
kubectl get pods -A # 所有命名空间的 Pod
kubectl get pods -w # 持续观察
kubectl get all # 命名空间内全部资源
kubectl describe pod <名字> # 事件与详情(排障第一步)
kubectl logs -f <pod> [-c 容器名] # 日志(--previous 看崩溃前)
kubectl exec -it <pod> -- sh # 进入容器
kubectl apply -f app.yaml # 声明式部署(首选)
kubectl delete -f app.yaml
kubectl get events --sort-by=.lastTimestamp # 最近事件排序
kubectl events --for pod/<名字> # 单对象事件流,比 get events 过滤更好用
# 输出格式
kubectl get pods -o wide # 含节点和 IP
kubectl get pod <名字> -o yaml # 完整 YAML(学习资源结构)
kubectl get pod <名字> -o kyaml # 1.37 起 GA 的 KYAML(K8s 专用 YAML 子集输出)
# 快速生成 YAML 脚手架
kubectl run nginx --image=nginx:1.27 --dry-run=client -o yaml > pod.yaml
kubectl create deploy web --image=nginx:1.27 --replicas=3 --dry-run=client -o yaml > deploy.yaml
# 补全与别名(实验机一次配置)
echo 'source <(kubectl completion bash)' >> ~/.bashrc
echo 'alias k=kubectl && complete -o default -F __start_kubectl k' >> ~/.bashrc
# 旧习惯修正:kubectl convert 已拆成独立插件(kubectl-convert);
# drain 的 --delete-local-data 已改名 --delete-emptydir-data;--export 早已移除
3. 核心资源速览¶
| 资源 | 缩写 | 用途 |
|---|---|---|
| Pod | po | 最小调度单元 |
| Deployment | deploy | 无状态应用 + 副本数 + 滚动更新 |
| Service | svc | 稳定访问入口(ClusterIP/NodePort/LoadBalancer) |
| ConfigMap | cm | 配置文件/环境变量 |
| Secret | — | 密码/证书(base64,非加密) |
| Ingress | ing | 七层路由(需 Ingress Controller) |
| Gateway API | — | 新一代七层入口(gateway.networking.k8s.io/v1),Ingress 的演进方向 |
| StatefulSet | sts | 有状态应用(固定名字/存储) |
| DaemonSet | ds | 每节点一个 Pod(日志/监控 Agent) |
| Job / CronJob | — | 一次性 / 定时任务 |
| PVC / PV / StorageClass | pvc | 存储申请与供给 |
| Namespace | ns | 资源分组隔离 |
| HPA | — | 自动扩缩容 |
安全基线提醒:
PodSecurityPolicy(PSP) 已在 1.25 移除,改用内置 Pod Security Admission(PSA):kubectl label ns <ns> --overwrite pod-security.kubernetes.io/enforce=restricted(或 baseline)。
4. 典型学习路径(配实验清单)¶
阶段一:基础¶
- 部署 Deployment 并扩缩容:
kubectl scale deploy web --replicas=5 - 滚动更新与回退:
kubectl set image deploy/web nginx=nginx:1.25→kubectl rollout undo deploy/web - Service 三种类型实验:ClusterIP(内部)→ NodePort(外部)→ 理解 LoadBalancer(kind 无内置 LB 实现,EXTERNAL-IP 会一直 pending,需装 cloud-provider-kind)
- ConfigMap/Secret 注入 Pod(env 与 volume 两种方式)
阶段二:进阶¶
- Ingress + Ingress Controller(kind 自装 ingress-nginx)做域名路由
- PVC + StorageClass(kind 默认不带 StorageClass,需自行装 local-path-provisioner 或 CSI;k3s 自带 local-path);StatefulSet 部署 MySQL/Redis
- 探针:liveness / readiness / startupProbe 实验
- 资源限制:requests/limits + LimitRange;观察 OOMKill
- HPA 自动扩缩容(kind 默认没有 metrics-server,需自行
kubectl apply安装;1.37 起 HPA 缩容到零为 Beta 且默认开启) - Job/CronJob:定时备份类任务
阶段三:高级¶
- RBAC:ServiceAccount / Role / RoleBinding;最小权限实验
- NetworkPolicy:Pod 间网络隔离(kind 需换 CNI,如 Calico)
- Helm:
helm install/upgrade/rollback,部署 TTS 应用为 Chart - 排障全流程(见第 7 节)
- operator / CRD 概念;编写简单 CRD 并用 kubectl 操作
5. 常用 YAML 模板¶
# Deployment + Service 一体(TTS 服务示例)
# apiVersion 核对(2026-11):apps/v1、v1 均仍有效;kind 集群配置仍为 kind.x-k8s.io/v1alpha4
apiVersion: apps/v1
kind: Deployment
metadata:
name: tts
labels: { app: tts }
spec:
replicas: 2
selector: { matchLabels: { app: tts } }
template:
metadata: { labels: { app: tts } }
spec:
containers:
- name: tts
image: myrepo/tts:1.0
ports: [{ containerPort: 5000 }]
resources:
requests: { cpu: 250m, memory: 256Mi }
limits: { cpu: "1", memory: 1Gi }
readinessProbe:
httpGet: { path: /health, port: 5000 }
initialDelaySeconds: 5
livenessProbe:
httpGet: { path: /health, port: 5000 }
periodSeconds: 10
---
apiVersion: v1
kind: Service
metadata: { name: tts }
spec:
selector: { app: tts }
ports: [{ port: 80, targetPort: 5000 }]
type: ClusterIP
原生 sidecar(v1.33 起 Stable,无需 feature gate):放进 initContainers 并给 restartPolicy: Always 即可,
顺序启动、随主容器退出,适合日志/代理/边车同步:
initContainers:
- name: log-shipper
image: busybox
restartPolicy: Always # 关键:使其成为 sidecar 而非一次性 init
command: ["sh", "-c", "tail -F /var/log/app.log"]
6. 常用排障命令¶
kubectl get pod <名> -o jsonpath='{.status.phase}{"\n"}'
kubectl describe pod <名> # Events 是关键(FailedScheduling/CrashLoopBackOff 原因)
kubectl logs <名> --previous # 上一次崩溃日志
kubectl rollout status deploy/web # 发布进度
kubectl rollout history deploy/web # 发布历史
kubectl port-forward svc/tts 8080:80 # 本地临时调试端口
kubectl run debug --rm -it --image=busybox -- sh # 临时调试 Pod
kubectl debug pod/<名> -it --image=busybox --share-processes # 注入临时容器(ephemeral,不重启原 Pod)
kubectl debug node/<节点> -it --image=busybox # 节点调试(v1.25+,默认 sysadmin profile = 特权 Pod)
kubectl top pods / nodes # 资源用量(需 metrics-server)
kubectl auth can-i create pods --as=system:serviceaccount:ns:sa # 权限验证
kubectl drain <节点> --ignore-daemonsets # 节点维护前驱散
kubectl uncordon <节点>
常见故障关键词:ImagePullBackOff(镜像名/tag 错/仓库不可达)、CrashLoopBackOff(应用启动即崩,看日志)、Pending(资源不足/无可用节点/PVC 未绑定)、OOMKilled(limits 太小)。
7. 排障标准流程¶
Pod 异常 → kubectl describe(看 Events)
→ kubectl logs --previous(看崩溃日志)
→ 资源够不够?kubectl top / describe 里 QoS
→ 镜像能不能拉?docker pull 同镜像验证 / 配置 imagePullSecrets
→ 网络通不通?busybox 调试 Pod 内 curl svc 域名
→ 存储绑定了没?kubectl get pvc
全集群异常 → kubectl get nodes(NotReady?)
→ kubectl get pods -A | grep -v Running(找系统组件异常)
→ kubectl get events -A --sort-by=.lastTimestamp
8. AI 助手操作守则¶
- 一切变更用 YAML +
kubectl apply(声明式),不要用run/create的命令式直接改动线上对象;临时实验除外。 - 每个实验的 YAML 保存到实验目录(如
F:\EricLiu\Docs\K8s\labs\),便于复现和回顾。 delete、drain、删除 PV 等破坏性操作先向用户确认。- kind 集群做坏了直接
kind delete cluster重建,比重修内部状态更快。 - 涉及真实节点(k3s/kubeadm)操作前先
vagrant snapshot save(配合 Vagrant 文档)。 kubectl --dry-run=client -o yaml是生成学习模板的最佳工具,优先使用。