Kubernetes 常用操作与概念总结
本文总结 K8s 日常运维中的常见概念、命令和排错思路,适合快速查阅。
📑 目录
- [一、核心概念:Pod 与 Container](#一、核心概念:Pod 与 Container)
- 二、资源命名规则
- [三、修改 Pod 资源配置](#三、修改 Pod 资源配置)
- 四、命名空间(Namespace)
- 五、编辑资源后的保存与生效
- [六、MongoDB 数据导出(mongodump)](#六、MongoDB 数据导出(mongodump))
- [七、从 Pod 中拷贝数据到本地](#七、从 Pod 中拷贝数据到本地)
- 八、网络连通性检查
- 九、常见错误与排错
一、核心概念:Pod 与 Container
| 概念 | 说明 |
|---|---|
| Pod(容器组) | K8s 最小调度单位,包含一个或多个容器 |
| Container(容器) | 实际运行进程的单元,定义在 Pod 内 |
- Pod 名:如
my-app-abc123-xyz99 - 一个 Pod 可以有多个容器(如
1/2 READY表示 2 个容器中有 1 个就绪) resources(CPU、内存)配置在容器上,而不是 Pod 上
二、资源命名规则
Pod 命名格式
<Deployment名>-<ReplicaSet哈希>-<Pod后缀>
示例 :my-app-abc123-xyz99
| 部分 | 含义 |
|---|---|
my-app |
Deployment 名称 |
abc123 |
ReplicaSet 的哈希值 |
xyz99 |
该 Pod 的唯一后缀 |
易错点
- 编辑 Deployment 时用:
kubectl edit deployment <Deployment名> - 不要 用 Pod 全名:
kubectl edit deployment my-app-abc123-xyz99❌(会报 NotFound)
三、修改 Pod 资源配置
1. 编辑 Deployment(推荐)
资源配置写在 Deployment 的 Pod 模板中,修改 Deployment 才能持久生效:
bash
kubectl edit deployment <Deployment名> -n <命名空间>
示例:
bash
kubectl edit deployment my-app -n default
2. 资源配置结构
yaml
resources:
limits: # 最大可使用资源
cpu: 100m
memory: 100Mi
requests: # 调度时申请的保证资源
cpu: 20m
memory: 40Mi
3. 常用单位
| 单位 | 含义 |
|---|---|
m |
毫核,1000m = 1 核 CPU |
Mi |
Mebibytes(1024 进制) |
Gi |
Gibibytes |
4. 资源翻倍示例
| 配置项 | 原值 | 翻倍后 |
|---|---|---|
| limits.cpu | 50m | 100m |
| limits.memory | 50Mi | 100Mi |
| requests.cpu | 10m | 20m |
| requests.memory | 20Mi | 40Mi |
四、命名空间(Namespace)
kubectl默认操作default命名空间- 其他命名空间需用
-n <namespace>指定 - 跨命名空间时,不加
-n会报NotFound
示例:
bash
# 指定命名空间
kubectl get pod -n default
# 查看所有命名空间
kubectl get pod -A
五、编辑资源后的保存与生效
1. 使用 vim/vi 编辑时
kubectl edit 会打开 vim/vi:
| 操作 | 命令 |
|---|---|
| 保存并退出 | Esc → :wq → 回车 |
| 不保存强制退出 | Esc → :q! → 回车 |
| 只保存不退出 | Esc → :w → 回车 |
2. 使修改生效
修改 Deployment 后,需要触发 Pod 重建:
bash
# 方式一:滚动重启(推荐)
kubectl rollout restart deployment/my-app -n default
# 方式二:删除 Pod,由 Deployment 自动重建
kubectl delete pod my-app-abc123-xyz99 -n default
六、MongoDB 数据导出(mongodump)
1. 导出指定数据库
bash
mongodump --uri 'mongodb://user:password@<host>:<port>/<数据库名>?authSource=admin' \
--out /tmp/backup/<数据库名>_backup \
--forceTableScan
2. 导出所有数据库
bash
mongodump --uri 'mongodb://user:password@<host>:<port>/?authSource=admin' \
--out /tmp/backup/mongo_full_backup \
--forceTableScan
3. 参数说明
| 参数 | 含义 |
|---|---|
--uri |
MongoDB 连接字符串(用户名、密码、主机、端口、认证库) |
--out |
导出文件保存目录 |
--forceTableScan |
强制使用表扫描(当索引不可用时使用) |
4. 副本集连接示例
bash
mongodump --uri 'mongodb://user:password@<host1>:<port>,<host2>:<port>/<数据库名>?authSource=admin&replicaSet=<副本集名>' \
--out /tmp/backup/mongo_backup \
--forceTableScan
5. 注意事项
- 若导出过程中出现
Killed,多为内存不足,可调大 Pod 资源或按库分别导出 - 导出数据位于容器内的指定路径,需通过
kubectl exec或kubectl cp拷贝到本地(见下一节)
七、从 Pod 中拷贝数据到本地
重要概念
- Pod 内的
/tmp等路径属于容器内部文件系统 - 在宿主机或跳板机上直接浏览,看不到容器内的这些目录
- 必须通过
kubectl exec或kubectl cp访问
完整操作流程示例
在能执行 kubectl 的环境(本地或跳板机)依次执行:
bash
# 1. 查看 Pod 名
kubectl get pod -n default -l app=<app名>
# 2. 从 Pod 里打包并保存到本机(把 <Pod名> 换成上一步得到的名字)
kubectl exec -n default <Pod名> -- tar czf - -C /tmp/backup data > /root/backup.tar.gz
# 3. 检查文件
ls -lh /root/backup.tar.gz
方法一:流式打包并下载(推荐)
在能执行 kubectl 的终端运行:
bash
kubectl exec -n default <Pod名> -- tar czf - -C /tmp/backup data > ./backup.tar.gz
tar czf -:在 Pod 内打包并输出到 stdout> ./backup.tar.gz:在本地接收并保存
方法二:分步拷贝
bash
# 1. 在 Pod 内打包
kubectl exec -n default <Pod名> -- tar czf /tmp/backup.tar.gz -C /tmp/backup data
# 2. 拷贝到本地
kubectl cp default/<Pod名>:/tmp/backup.tar.gz ./backup.tar.gz
# 3. 解压
tar xzf backup.tar.gz
通过跳板机
若本地(沙箱)无法直接访问集群,需先 SSH 到跳板机:
bash
# 1. SSH 到跳板机
ssh root@192.168.1.100
# 2. 在跳板机上执行 kubectl 打包并保存
kubectl exec -n default <Pod名> -- tar czf - -C /tmp/backup data > /root/backup.tar.gz
# 3. 在本地从跳板机拉取
scp root@192.168.1.100:/root/backup.tar.gz ./
八、网络连通性检查
1. ping(ICMP)
bash
ping -c 4 192.168.1.100
- 能收到回复:网络可达
- 无响应:可能被防火墙禁止或网络不通(ping 常被企业网络禁用)
2. 端口连通性(nc)
bash
nc -zv 192.168.1.100 22
succeeded/open:端口可达Connection refused:主机可达,端口未开放Connection timed out:网络不通或防火墙拦截
3. kubectl 连通性
bash
# 测试能否访问 K8s API(替换为实际 API 地址)
nc -zv 192.168.1.10 6443
若 kubectl 报 Unable to connect to the server,说明当前环境无法访问集群 API,需通过 VPN 或跳板机。
九、常见错误与排错
1. deployments.apps "xxx" not found
| 原因 | 处理 |
|---|---|
| 用了 Pod 名而不是 Deployment 名 | 使用 kubectl edit deployment <Deployment名> |
| 命名空间不对 | 加上 -n <namespace> |
2. Unable to connect to the server: dial tcp xxx:6443: connect: invalid argument
- 当前环境无法访问 K8s API 服务器
- 处理:检查 VPN、网络,或通过跳板机执行 kubectl
3. 修改资源配置后不生效
- 直接编辑 Pod 的修改可能在 Pod 重建时被覆盖
- 处理:编辑 Deployment ,然后执行
kubectl rollout restart deployment/xxx
4. 在宿主机/跳板机找不到 Pod 内的文件
- 容器有独立文件系统,宿主机上无法直接浏览
- 处理:使用
kubectl exec或kubectl cp从 Pod 拷贝数据
总结
| 场景 | 常用命令 |
|---|---|
| 修改 Pod 资源 | kubectl edit deployment <名> -n <ns> → :wq → kubectl rollout restart |
| 查看 Pod | kubectl get pod -n <ns> -l app=<app名> |
| MongoDB 导出 | mongodump --uri '...' --out /tmp/backup --forceTableScan |
| 从 Pod 拷数据 | kubectl exec ... tar ... > 本地文件 或 kubectl cp |
| 检查网络 | ping、nc -zv |
标签:Kubernetes、kubectl、Pod、Deployment、MongoDB、mongodump、资源配置、运维