Kubernetes 概论

kubectl 速查表

场景命令模板
帮助kubectl -h / <cmd> --help
创建资源kubectl apply -f xxx.yaml
查看所有 Podkubectl get pod -A
查看指定 nskubectl get pod -n <ns>
实时监听kubectl get pod -w
删 Pod(强删)kubectl delete pod <name> --grace-period=0 --force
进入容器kubectl exec -it <pod> -c <container> -- /bin/bash
查看日志kubectl logs -f <pod> -c <container>
端口转发kubectl port-forward pod/<pod> 8080:8080
节点打标签kubectl label node <node> k=v [--overwrite]
节点取消标签kubectl label node <node> k-
按标签筛选kubectl get pod -l app=nginx
查看 topkubectl top node / pod
查看 api-versionkubectl api-versions
解释字段kubectl explain <资源>.<字段>

核心对象与概念

对象一句话典型用法
Pod最小调度单元,1+ 容器共享网络/存储几乎不直接创建,由控制器托管
Deployment管理无状态副本集 + 滚动升级Web、API、微服务
StatefulSet带身份 + 顺序 + 持久化MySQL、Redis、ZooKeeper
DaemonSet每个节点跑一个副本日志收集、监控 Agent
Job一次性任务批处理、离线计算
CronJob定时任务备份、报表
Service稳定访问入口(ClusterIP/NodePort/LoadBalancer)服务发现、负载均衡
Ingress七层路由域名、TLS、灰度
ConfigMap非敏感配置应用参数、启动脚本
Secret敏感配置密码、证书、镜像拉取密钥
PV/PVC持久化存储数据库、文件服务
Namespace逻辑隔离环境/业务/租户隔离

资源管理套路

1. 命令式 vs 声明式

  • 命令式:kubectl run / expose / scale(临时调试)
  • 声明式:YAML + kubectl apply -f(可版本化、可回滚)

2. YAML 最小骨架

apiVersion: v1          # 查 api-versions
kind: Pod               # 资源类型
metadata:
  name: demo
  namespace: default
spec:                   # 期望状态
  containers:
  - name: app
    image: nginx:1.25
    ports:
    - containerPort: 80

3. 字段速查

字段含义
replicas副本数
selector.matchLabels必须 = template.labels
imagePullPolicyAlways / IfNotPresent / Never
resources.requests/limitsCPU/内存 申请与限制
restartPolicyAlways(默认)、OnFailure、Never
nodeSelector节点亲和(简单版)
env环境变量
volumeMounts / volumes挂载配置或存储

集群日常运维

1. Metrics-Server 安装(HPA 前提)

# 国内镜像加速
wget https://github.com/kubernetes-sigs/metrics-server/releases/latest/download/components.yaml
sed -i 's|registry.k8s.io/metrics-server|registry.cn-hangzhou.aliyuncs.com/google_containers|g' components.yaml
# 新增启动参数
vim components.yaml   # --kubelet-insecure-tls
kubectl apply -f components.yaml
kubectl top node

2. 节点维护三板斧

kubectl cordon  <node>   # 不可调度
kubectl drain   <node>   # 驱逐 Pod(会尊重 PDB)
kubectl uncordon <node>  # 恢复可调度

3. Dashboard(开发测试用)

kubectl apply -f https://raw.githubusercontent.com/kubernetes/dashboard/v2.7.0/aio/deploy/recommended.yaml)
# 修改 Service 为 NodePort 30001
kubectl -n kubernetes-dashboard edit svc kubernetes-dashboard
# 创建管理员 Token
kubectl apply -f rbac.yaml
kubectl create token dashboard-admin -n kube-system

访问:https://<任意节点IP>:30001


微服务视角下的 K8s

         ┌---------------┐
         │   Ingress     │  (7 层流量入口 + 域名)
         └-----┬---------┘
               │
    ┌----------┴-----------┐
    │     Service A       │  (稳定 VIP,负载均衡)
    │   (ClusterIP)       │
    └-----┬--------┬-------┘
          │        │
     Pod1│   Pod2 │ Pod3 (无状态副本,弹性伸缩)
          │        │
    ┌-----┴--------┴-------┐
    │   ConfigMap/Secret   │  (配置、证书与代码解耦)
    └----------------------┘
          │
    ┌-----┴----------------┐
    │   StatefulSet MySQL  │  (有状态 + PVC 持久化)
    └----------------------┘

核心关系

  • Controller 通过 Label 管理 Pod 生命周期
  • Service 通过 Label SelectorPod 做负载均衡
  • DNS<svc>.<ns>.svc.cluster.local 解析到 ClusterIP
  • Ingress 把域名流量再转发到 Service

常见坑与技巧

快速定位/解决
Pod 一直 Pendingkubectl describe pod → 看 Events(资源不足、镜像拉失败、nodeSelector 打歪)
镜像拉取失败1. 确认镜像名/Tag 2. 私有仓 Secret 3. 国内网络加 imagePullPolicy: IfNotPresent
节点上 kubectl 报错 “localhost:8080 refused”把 master 的 /etc/kubernetes/admin.conf 拷到节点 $HOME/.kube/config
Dashboard 登录后权限不足绑定 cluster-adminClusterRoleBinding + ServiceAccount
强制删 Pod 卡在 Terminating--grace-period=0 --force 仍不行→ kubectl patch pod <name> -p '{"metadata":{"finalizers":null}}'
HPA 无法获取指标先确认 metrics-server Pod 正常,再检查 --kubelet-insecure-tls 是否开启

更多推荐