kubectl
Kubectl 使用指南
📖 核心概念
💡 一句话解释
kubectl 是 Kubernetes 集群的“万能遥控器”,它通过命令行与集群的控制面(API Server)进行交互,从而管理整个集群的资源调度与运行。
如果把 Kubernetes 集群比作一个繁忙的集装箱码头:
- Master Node (Control Plane) 是塔台指挥中心。
- Worker Node 是停靠船只的码头泊位。
- Pod 是集装箱。
- kubectl 就是操作员手中的对讲机/控制台,你发出的每一个指令(部署、扩容、销毁)都通过它传达给指挥中心。
⚙️ 原理与配置
Kubeconfig 配置管理
kubeconfig 文件存储了集群的访问凭证(User)、集群地址(Cluster)和上下文(Context)。
🛠️ 多集群管理技巧
如果需要同时管理多个集群,可以将多个配置文件放在 ~/.kube/ 目录下,利用环境变量 KUBECONFIG 进行聚合。
# 环境变量聚合配置
export KUBECONFIG=~/.kube/config:~/.kube/config-prod:~/.kube/config-test
# 查看合并后的配置
kubectl config view
# 切换当前操作的上下文(集群/Namespace)
kubectl config use-context <context_name>
# 查看所有上下文列表
kubectl config get-contexts
# 合并多个 kubeconfig 文件为一个(物理合并)
KUBECONFIG=config1:config2 kubectl config view --merge --flatten > merged_config.yaml💻 常用指令清单
1. 资源查看 (Observability)
用于快速了解集群状态、节点健康度和应用运行情况。
# === 基础列表 ===
# 查看所有节点(-o wide 查看 IP 等详情)
kubectl get nodes -o wide
# 查看当前命令空间下的 Pod
kubectl get pods
# 查看所有命名空间(Namespace)下的 Pod
kubectl get pods -A
# 查看其他资源类型
kubectl get svc -A # Service
kubectl get job -A # Job
kubectl get ingress -A # Ingress
kubectl get deployment -A # Deployment
kubectl get statefulset -A # StatefulSet
kubectl get daemonset -A # DaemonSet
# === 筛选查询 ===
# 使用 Label Selector 筛选
kubectl get pods -l app=nginx,env=prod
kubectl get nodes --selector=gpu=true
# 使用 Field Selector(更高效的字段过滤)
kubectl get pod -n default --field-selector=status.phase=Running,spec.nodeName=Node-012. 深入排查 (Debugging)
当服务出现异常时,需要查看日志、配置细节或直接进入容器排查。
# === 查看细节 ===
# 查看资源的详细配置和事件(Event),排错神器
kubectl describe <resource_type> <resource_name> -n <namespace>
# 示例:
kubectl describe pod my-pod -n default
kubectl describe node worker-01 | grep Taints
# === 导出配置 ===
# 查看资源的 YAML 定义(常用于备份或查看隐藏字段)
kubectl get pod my-pod -o yaml
# === 容器内部操作 ===
# 进入 Pod 内部(打开交互式终端)
kubectl exec -it <pod_name> -n <namespace> -- /bin/bash
# 日志查看(实时追踪)
kubectl logs -f <pod_name> -n <namespace>
# === 网络调试 ===
# 端口转发:将集群内部端口映射到本地 localhost(用于调试 Prometheus、WebUI 等)
kubectl --namespace monitoring port-forward svc/prometheus-k8s 9090:9090 --address 0.0.0.03. 数据传输 (Data Transfer)
在本地与 Pod 之间互相拷贝文件。
# 将本地文件拷贝到 Pod
kubectl cp /tmp/local_file <namespace>/<pod_name>:/tmp/remote_file -c <container_name>
# 将 Pod 文件拷贝到本地
kubectl cp <namespace>/<pod_name>:/tmp/remote_file /tmp/local_file -c <container_name>4. 资源生命周期管理 (Lifecycle)
创建、删除、修改、修补资源。
# === 创建/删除 ===
# 创建命名空间
kubectl create namespace <namespace_name>
# 删除资源(Pod/Service/Deployment等)
kubectl delete pod <pod_name> -n <namespace>
# 应用/更新配置文件(最常用)
kubectl apply -f deployment.yaml
# === 修改配置 ===
# 在线编辑资源配置(使用默认编辑器打开 YAML,保存即生效)
kubectl edit svc my-service -n default
# 修改 Metallb IP 池示例
kubectl edit IPAddressPool -n metallb-system pool-0
# === 导出/导入 ConfigMap ===
kubectl get configmap my-config -n default -o yaml > config.yaml
# (修改 config.yaml 后)
kubectl apply -f config.yaml🛠️ 高级运维操作
节点维护与调度 (Node & Taints)
当需要对物理机进行维护或进行复杂的调度隔离时使用。
# === 污点 (Taint) 管理 ===
# 给节点打污点,阻止普通 Pod 调度上来
# effect 包含: NoSchedule (不调度), PreferNoSchedule (尽量不调度), NoExecute (驱逐已有)
kubectl taint nodes node-01 key=value:NoSchedule
# 允许 Master 节点参与调度(移除 Master 的污点)
kubectl taint nodes --all node-role.kubernetes.io/control-plane-
# 移除污点
kubectl taint nodes node-01 key:NoSchedule-
# === 节点维护流程 (缩容/下线) ===
# 1. 封锁节点,设为不可调度
kubectl cordon <node_name>
# 2. 驱逐节点上的 Pod(安全排空)
# --ignore-daemonsets: 忽略守护进程集
# --delete-emptydir-data: 允许删除临时数据卷
kubectl drain <node_name> --ignore-daemonsets --delete-emptydir-data
# 3. 物理维护或下线后,删除节点记录
kubectl delete node <node_name>
# (维护结束后恢复)
kubectl uncordon <node_name>Patch 操作 (热更新)
无需编辑完整 YAML,直接修补部分字段。
# === Patch Pod ===
# 动态添加 Label 或 Annotation
kubectl patch pod <pod-name> -n <namespace> --type merge -p '{"metadata":{"annotations":{"debug":"true"}}}'
# === Patch Node 资源容量 (Hack) ===
# 手动修改 Node 的 Status(例如模拟 GPU 资源)
# 注意:直接修改 status 需要使用 --subresource='status'
# op: replace表示修改,add表示添加,remove表示删除
kubectl patch node <node-name> --type='json' -p='[{"op": "add", "path": "/status/capacity/faceunity.com~1gpu", "value": "100"}]' --subresource='status'Secret 与 StorageClass 实战
1. 创建 Docker Registry Secret
用于拉取私有仓库镜像。
kubectl create secret docker-registry harbor \
--docker-server=harbor.example.com \
--docker-username=<user> \
--docker-password=<pwd> \
--docker-email=<email> \
-n <namespace>2. 配置 S3 StorageClass (Based on MinIO)
场景:使用对象存储作为 K8s 的持久化卷。
- 前提:安装
k8s-csi-s3插件 (参考: yandex-cloud/k8s-csi-s3)。 - 创建 Secret:存储 MinIO/S3 认证信息。
apiVersion: v1
kind: Secret
metadata:
name: csi-s3-secret
namespace: kube-system # 需与 StorageClass 配置一致
stringData:
accessKeyID: xxxxxxx
secretAccessKey: xxxxxxx
endpoint: xxxxxxx
# region: "" # AWS环境需指定