Kubernetes 概论
·
文章目录
Kubernetes 概论
kubectl 速查表
| 场景 | 命令模板 |
|---|---|
| 帮助 | kubectl -h / <cmd> --help |
| 创建资源 | kubectl apply -f xxx.yaml |
| 查看所有 Pod | kubectl get pod -A |
| 查看指定 ns | kubectl 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 |
| 查看 top | kubectl top node / pod |
| 查看 api-version | kubectl 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 |
imagePullPolicy | Always / IfNotPresent / Never |
resources.requests/limits | CPU/内存 申请与限制 |
restartPolicy | Always(默认)、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 Selector 对 Pod 做负载均衡
- DNS 把
<svc>.<ns>.svc.cluster.local解析到 ClusterIP - Ingress 把域名流量再转发到 Service
常见坑与技巧
| 坑 | 快速定位/解决 |
|---|---|
| Pod 一直 Pending | kubectl 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-admin:ClusterRoleBinding + ServiceAccount |
| 强制删 Pod 卡在 Terminating | --grace-period=0 --force 仍不行→ kubectl patch pod <name> -p '{"metadata":{"finalizers":null}}' |
| HPA 无法获取指标 | 先确认 metrics-server Pod 正常,再检查 --kubelet-insecure-tls 是否开启 |
更多推荐
所有评论(0)