16.1.1 Kubernetes整体架构与组件职责

Kubernetes整体架构由控制平面(Control Plane)与工作节点(Node)组成,通过统一API驱动声明式管理,实现应用的自动化部署、扩缩容与自愈。其核心设计目标是将集群资源抽象为可编排对象,借助控制循环持续达成期望状态。

文章图片

总体组件职责:
- 控制平面:API入口与状态管理(apiserver/etcd/controller/scheduler)。
- 工作节点:容器运行与网络/存储接入(kubelet/runtime/CNI/CSI)。
- 可观测与扩展:监控、日志与插件化扩展(CNI/CSI/CRI/指标采集)。

关键交互闭环示例:部署一个Nginx应用

# 1) 提交期望状态(Deployment)
cat > /tmp/nginx-deploy.yaml <<'EOF'
apiVersion: apps/v1
kind: Deployment
metadata:
  name: web-nginx
spec:
  replicas: 2
  selector:
    matchLabels:
      app: web-nginx
  template:
    metadata:
      labels:
        app: web-nginx
    spec:
      containers:
      - name: nginx
        image: nginx:1.25
        ports:
        - containerPort: 80
EOF

kubectl apply -f /tmp/nginx-deploy.yaml
# 预期:deployment.apps/web-nginx created

# 2) 查看调度与运行状态
kubectl get deploy,pod -o wide
# 预期:2个Pod分布到可用节点,STATUS为Running

# 3) 查看控制面与节点交互日志(关键线索)
kubectl describe pod -l app=web-nginx
# 观察:Scheduled、Pulling、Created、Started等事件

安装与基础验证(以kubeadm为例,便于理解组件)

# 控制平面初始化(示例参数)
kubeadm init --kubernetes-version=v1.28.0 \
  --pod-network-cidr=10.244.0.0/16 \
  --apiserver-advertise-address=192.168.10.10

# 设置kubectl访问
mkdir -p $HOME/.kube
cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
chown $(id -u):$(id -g) $HOME/.kube/config

# 安装网络插件(示例:Flannel)
kubectl apply -f https://raw.githubusercontent.com/flannel-io/flannel/master/Documentation/kube-flannel.yml

# 预期:kube-system命名空间下CNI相关Pod为Running
kubectl get pod -n kube-system

关键命令与作用说明

# 查看控制平面组件状态(示例)
kubectl get pods -n kube-system -o wide | egrep 'kube-apiserver|kube-scheduler|kube-controller-manager|etcd'

# 查看节点与Kubelet健康
kubectl get node -o wide
kubectl describe node <node-name> | egrep 'Ready|Kubelet'

# 查看API Server健康端点(本地执行)
curl -k https://127.0.0.1:6443/healthz
# 预期:ok

常见排错(架构视角)

# 1) Pod一直Pending:调度失败
kubectl describe pod <pod-name> | egrep -A3 'FailedScheduling|Insufficient'
# 常见原因:资源不足、节点不可用、污点未容忍

# 2) Pod拉不到镜像:节点侧问题
kubectl describe pod <pod-name> | egrep -A3 'Failed|Pull'
# 常见原因:镜像地址错误、私有仓库未配置、网络不通

# 3) 集群网络不通:CNI异常
kubectl get pod -n kube-system | egrep 'flannel|calico|cilium'
kubectl logs -n kube-system <cni-pod>
# 常见原因:CNI未安装、Pod网段不匹配

# 4) 控制平面异常:API不可用
kubectl get --raw='/readyz?verbose'
# 预期:各项检查通过,若失败查看kube-apiserver日志

练习
1. 使用上面的Deployment示例,将副本数改为3,观察调度分布差异。
2. 故意写错镜像名(如nginx:1.25x),验证事件与排错流程。
3. 删除CNI Pod(测试环境),观察新Pod网络失败的表现并恢复。
4. 用kubectl get --raw='/api/v1/nodes'查看API返回结构,理解声明式对象存储在etcd的表现。