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的表现。