跳转至

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. 典型学习路径(配实验清单)

阶段一:基础

  1. 部署 Deployment 并扩缩容:kubectl scale deploy web --replicas=5
  2. 滚动更新与回退:kubectl set image deploy/web nginx=nginx:1.25 → kubectl rollout undo deploy/web
  3. Service 三种类型实验:ClusterIP(内部)→ NodePort(外部)→ 理解 LoadBalancer(kind 无内置 LB 实现,EXTERNAL-IP 会一直 pending,需装 cloud-provider-kind)
  4. ConfigMap/Secret 注入 Pod(env 与 volume 两种方式)

阶段二:进阶

  1. Ingress + Ingress Controller(kind 自装 ingress-nginx)做域名路由
  2. PVC + StorageClass(kind 默认不带 StorageClass,需自行装 local-path-provisioner 或 CSI;k3s 自带 local-path);StatefulSet 部署 MySQL/Redis
  3. 探针:liveness / readiness / startupProbe 实验
  4. 资源限制:requests/limits + LimitRange;观察 OOMKill
  5. HPA 自动扩缩容(kind 默认没有 metrics-server,需自行 kubectl apply 安装;1.37 起 HPA 缩容到零为 Beta 且默认开启)
  6. Job/CronJob:定时备份类任务

阶段三:高级

  1. RBAC:ServiceAccount / Role / RoleBinding;最小权限实验
  2. NetworkPolicy:Pod 间网络隔离(kind 需换 CNI,如 Calico)
  3. Helm:helm install/upgrade/rollback,部署 TTS 应用为 Chart
  4. 排障全流程(见第 7 节)
  5. 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 是生成学习模板的最佳工具,优先使用。