跳转至

Kubernetes 架构与 kubectl

Kubernetes 集群由控制平面和工作节点组成。控制平面保存期望状态并作出调度与控制决策;工作节点真正运行 Pod。

控制平面组件

组件 作用 故障影响与检查方向
kube-apiserver Kubernetes API 入口,负责认证、鉴权、准入与资源操作 kubectl/控制器无法访问集群;查 API 健康、证书、负载均衡
etcd 保存所有 Kubernetes API 数据的高可用键值数据库 集群状态无法可靠读写;必须做快照、监控空间和磁盘延迟
kube-scheduler 为尚未绑定节点的 Pod 选择 Node Pod 长期 Pending;查资源、污点、亲和性、PVC 与调度事件
kube-controller-manager 运行 Deployment、Node、Job 等控制器 实际状态无法向期望状态收敛
cloud-controller-manager 对接云负载均衡、路由、节点等 API,可选 LoadBalancer、云盘或节点集成异常

控制平面不直接运行你的业务容器。它保存和协调状态;Pod 最终由工作节点上的组件执行。

Node 组件

组件 作用 常见排障点
kubelet 监听分配到本节点的 Pod,调用容器运行时并执行 Probe Pod 创建失败、Volume 挂载、Probe、Node NotReady
Container Runtime 拉取镜像并运行容器,如 containerd ImagePull、容器退出、镜像空间
kube-proxy 维护 Service 转发规则,部分方案可能使用其他实现 Service 网络、规则同步
CNI 插件 为 Pod 分配网络并实现连通/策略 Pod 无 IP、跨节点不通、NetworkPolicy
CSI 插件 提供卷创建、挂载和卸载 PVC Pending、Attach/Mount 失败

kubectl 怎样工作

kubectl
  → 读取 kubeconfig 中的 current-context
  → 得到 API Server、用户凭据和默认 Namespace
  → 调用 kube-apiserver
  → API Server 完成认证、RBAC 鉴权和准入检查
  → 查询或修改资源

操作生产前先确认身份和目标:

kubectl config current-context
kubectl config get-contexts
kubectl config view --minify
kubectl auth whoami
kubectl auth can-i get pods -n app
kubectl auth can-i delete deployment -n app

不要只根据终端目录判断当前集群;kubectl 的目标由 kubeconfig context 决定。

Namespace

Namespace 用于对大部分资源进行逻辑分组,便于配置 RBAC、ResourceQuota 和 NetworkPolicy。Node、PV、StorageClass、Namespace 本身等是集群级资源,不属于某个 Namespace。

kubectl get namespaces
kubectl create namespace app
kubectl config set-context --current --namespace=app
kubectl get pods -n app

业务不要长期堆在 default。Namespace 也不是完整的安全隔离,仍需权限、网络策略和资源配额配合。

核心查看命令

# 集群和节点
kubectl cluster-info
kubectl get nodes -o wide
kubectl describe node <node-name>

# 常见业务对象
kubectl get deploy,rs,pod,svc,ingress -n app
kubectl get pods -n app -o wide
kubectl get pods -n app --show-labels
kubectl get pod <pod-name> -n app -o yaml

# 按标签筛选
kubectl get pods -n app -l app=order-service

# 持续观察变化
kubectl get pods -n app -w

# 最近事件
kubectl get events -n app --sort-by=.lastTimestamp

kubectl get all 并不真的包含所有资源,例如 ConfigMap、Secret、Ingress、PVC 通常需要单独查看。

get、describe、logs 和 events 的区别

命令 回答什么问题
get 对象现在处于什么概要状态
describe 对象配置、Condition 和相关 Event 是什么
logs 容器内应用输出了什么
events 调度、拉镜像、挂载、Probe 等平台动作发生了什么
kubectl describe pod <pod-name> -n app
kubectl logs <pod-name> -n app --all-containers --tail=200
kubectl logs <pod-name> -n app -c <container> --previous

容器 CrashLoop 时,--previous 用来查看上一次已经退出的容器日志,经常比当前空日志更有价值。

进入容器与临时调试

kubectl exec -it <pod-name> -n app -c <container> -- sh
kubectl port-forward -n app service/order-service 18080:8080
kubectl cp app/<pod-name>:/tmp/report.txt ./report.txt -c <container>

生产镜像可能没有 shell、curl 和诊断工具。不要为了方便把大量工具永久塞进业务镜像;可使用经过授权的临时调试容器或专用诊断方案。exec 只用于取证,不应在容器内手工修改长期配置,因为 Pod 重建后修改会消失。

创建、修改和删除

kubectl diff -f deployment.yaml
kubectl apply --server-side -f deployment.yaml
kubectl rollout status deployment/order-service -n app

kubectl edit deployment/order-service -n app
kubectl patch deployment/order-service -n app --type merge -p '{"spec":{"replicas":4}}'
kubectl scale deployment/order-service -n app --replicas=4

长期配置应回写 Git/Helm Values,由 Argo CD 或受控流水线发布。editpatchscale 适合确认问题或应急操作,但可能被 GitOps self-heal 恢复。

删除前先确认对象、Namespace、控制器和持久化影响:

kubectl delete pod <pod-name> -n app

删除 Deployment 管理的 Pod 后,控制器会再创建一个;这只是重建实例,不等于修复根因。删除 PVC、StatefulSet、Namespace 或 CRD 具有更大数据影响,必须先确认备份和级联删除范围。

输出格式与 JSONPath

kubectl get pods -n app -o name
kubectl get pods -n app -o json
kubectl get pods -n app \
  -o custom-columns='NAME:.metadata.name,NODE:.spec.nodeName,PHASE:.status.phase'
kubectl get pod <pod-name> -n app \
  -o jsonpath='{.status.containerStatuses[*].restartCount}'

脚本中优先使用 JSON/JSONPath/custom-columns,不要依赖默认表格的空格位置进行文本截取。

一套排障顺序

确认 context / namespace / 权限
  → get 查看对象和副本状态
  → describe 查看 Condition 与 Event
  → events 判断调度、镜像、网络和存储问题
  → logs / --previous 查看应用和退出原因
  → 检查 Service、EndpointSlice、ConfigMap、Secret、PVC
  → 对照发布版本、资源指标和最近变更

官方参考:Kubernetes Componentskubectl Introduction