1. Kubernetes部署核心知识点解析
Kubernetes(简称K8s)作为容器编排领域的事实标准,其部署过程涉及众多关键概念和技术要点。对于刚接触K8s的开发者来说,理清这些核心知识点是成功部署集群的第一步。
1.1 基础架构组件认知
一个标准的Kubernetes集群由以下核心组件构成:
控制平面(Control Plane):
- kube-apiserver:集群的API入口,所有通信都通过它进行
- etcd:分布式键值存储,保存集群所有状态数据
- kube-scheduler:负责将Pod调度到合适的Node
- kube-controller-manager:运行各种控制器进程
工作节点(Worker Node):
- kubelet:与Control Plane通信的节点代理
- kube-proxy:维护节点网络规则
- 容器运行时:如Docker、containerd等
提示:生产环境建议将Control Plane组件部署在至少3个节点上以保证高可用,etcd应采用奇数节点部署(3、5、7等)
1.2 部署方式选型指南
根据不同的使用场景,Kubernetes部署主要有以下几种方式:
| 部署方式 | 适用场景 | 复杂度 | 代表工具 |
|---|---|---|---|
| 本地开发 | 个人学习测试 | 低 | Minikube, Kind |
| 托管服务 | 生产环境快速部署 | 中 | EKS, AKS, GKE |
| 裸机部署 | 自有基础设施 | 高 | kubeadm, kubespray |
| 边缘部署 | 资源受限环境 | 中 | K3s, MicroK8s |
对于初学者,建议从Minikube开始;有一定基础后可以尝试kubeadm;生产环境推荐使用托管服务或专业的部署工具如kubekey。
2. 典型部署流程详解
2.1 环境准备阶段
以Ubuntu 22.04为例,部署前的系统准备包括:
系统配置检查:
# 检查内核版本(需3.10+) uname -r # 检查swap状态(生产环境建议关闭) free -h # 检查防火墙设置 sudo ufw status安装依赖工具:
# 安装容器运行时(以containerd为例) sudo apt-get update sudo apt-get install -y containerd sudo systemctl enable containerd # 安装kubeadm、kubelet和kubectl sudo apt-get install -y apt-transport-https ca-certificates curl curl -fsSL https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo gpg --dearmor -o /etc/apt/keyrings/kubernetes-archive-keyring.gpg echo "deb [signed-by=/etc/apt/keyrings/kubernetes-archive-keyring.gpg] https://apt.kubernetes.io/ kubernetes-xenial main" | sudo tee /etc/apt/sources.list.d/kubernetes.list sudo apt-get update sudo apt-get install -y kubelet kubeadm kubectl sudo apt-mark hold kubelet kubeadm kubectl
2.2 集群初始化过程
使用kubeadm初始化控制平面:
sudo kubeadm init \ --pod-network-cidr=10.244.0.0/16 \ --apiserver-advertise-address=<your-ip> \ --control-plane-endpoint=<load-balancer-ip-or-dns>初始化完成后需要执行以下操作:
配置kubectl访问权限:
mkdir -p $HOME/.kube sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config sudo chown $(id -u):$(id -g) $HOME/.kube/config安装网络插件(以Flannel为例):
kubectl apply -f https://raw.githubusercontent.com/flannel-io/flannel/master/Documentation/kube-flannel.yml加入工作节点(在worker节点上执行):
kubeadm join <control-plane-ip>:6443 --token <token> --discovery-token-ca-cert-hash sha256:<hash>
2.3 集群验证与测试
部署完成后需要进行基本验证:
# 检查节点状态 kubectl get nodes -o wide # 检查核心组件状态 kubectl get pods -n kube-system # 部署测试应用 kubectl create deployment nginx --image=nginx kubectl expose deployment nginx --port=80 --type=NodePort kubectl get svc nginx3. 生产环境部署进阶要点
3.1 高可用架构设计
生产环境Kubernetes集群需要实现控制平面和工作节点的高可用:
控制平面高可用方案:
- 使用3个或更多master节点
- 配置负载均衡器(如HAProxy+Keepalived)
- etcd集群采用分布式部署
工作节点高可用策略:
- 跨可用区部署节点
- 配置Pod反亲和性规则
- 使用Cluster Autoscaler自动扩展节点
3.2 网络方案选型
Kubernetes网络模型需要考虑以下方面:
- Pod网络:Flannel、Calico、Cilium等CNI插件选择
- 服务发现:CoreDNS配置优化
- 网络策略:实现Pod间访问控制
- Ingress控制器:Nginx、Traefik等选择
以Calico为例的安装命令:
kubectl create -f https://raw.githubusercontent.com/projectcalico/calico/v3.26.1/manifests/tigera-operator.yaml kubectl create -f https://raw.githubusercontent.com/projectcalico/calico/v3.26.1/manifests/custom-resources.yaml3.3 存储方案配置
根据应用需求选择合适的存储方案:
- 临时存储:emptyDir
- 本地存储:hostPath、local volume
- 网络存储:
- 块存储:AWS EBS、GCE PD
- 文件存储:NFS、CephFS
- 对象存储:MinIO、S3兼容存储
示例PV/PVC配置:
apiVersion: v1 kind: PersistentVolume metadata: name: pv-nfs spec: capacity: storage: 10Gi accessModes: - ReadWriteMany nfs: server: nfs-server.example.com path: "/exports/data" --- apiVersion: v1 kind: PersistentVolumeClaim metadata: name: pvc-nfs spec: accessModes: - ReadWriteMany resources: requests: storage: 10Gi4. 常见问题排查手册
4.1 部署阶段典型问题
kubeadm init卡住:
- 检查网络连通性
- 确认镜像已正确拉取(可手动拉取)
- 查看kubelet日志:
journalctl -xeu kubelet
节点NotReady状态:
- 确认网络插件已正确安装
- 检查kubelet是否正常运行
- 验证容器运行时状态
Pod一直处于Pending状态:
- 检查资源配额:
kubectl describe pod <pod-name> - 查看调度事件:
kubectl get events - 确认节点是否有污点(Taints)
- 检查资源配额:
4.2 网络问题排查
Pod间无法通信:
# 检查网络插件Pod状态 kubectl get pods -n kube-system # 测试基础网络连通性 kubectl run -it --rm --image=alpine network-test -- sh ping <target-pod-ip>Service无法访问:
- 检查Endpoint:
kubectl get endpoints <service-name> - 验证kube-proxy日志
- 测试ClusterIP连通性
- 检查Endpoint:
4.3 性能优化建议
API Server优化:
- 启用审计日志轮转
- 配置适当的--max-requests-inflight
- 使用--etcd-compaction-interval定期压缩
kubelet配置调整:
- 设置合理的--image-gc-high-threshold
- 调整--kube-api-qps和--kube-api-burst
- 配置--serialize-image-pulls=true
etcd维护:
- 定期执行etcd备份
- 监控etcd存储大小
- 设置适当的--auto-compaction-retention
5. 部署后的关键操作
5.1 集群监控配置
完整的监控方案应包含:
指标收集:
- Prometheus:集群和应用指标
- Node Exporter:节点指标
- kube-state-metrics:K8s对象状态
日志收集:
- EFK栈(Elasticsearch+Fluentd+Kibana)
- Loki+Promtail+Grafana方案
告警通知:
- Alertmanager配置
- 与Slack、邮件等集成
5.2 安全加固措施
RBAC配置:
- 遵循最小权限原则
- 为不同角色创建适当的ClusterRole和Role
- 使用ServiceAccount进行Pod身份认证
网络策略:
- 默认拒绝所有Pod间通信
- 按需开放必要的通信规则
- 使用NetworkPolicy资源定义规则
镜像安全:
- 使用私有镜像仓库
- 扫描镜像中的漏洞
- 实施镜像签名验证
5.3 持续部署实践
GitOps工作流:
- 使用Argo CD或Flux实现声明式部署
- 将配置存储在Git仓库中
- 通过PR/MR流程管理变更
CI/CD集成:
- Jenkins Pipeline配置
- Tekton或GitHub Actions工作流
- 多环境部署策略(蓝绿、金丝雀等)
配置管理:
- 使用Kustomize或Helm管理配置
- 区分不同环境的配置
- 实现配置的版本控制
在实际部署Kubernetes集群时,我发现最常遇到的问题往往与网络配置和资源分配有关。特别是在混合云环境中,跨子网的网络连通性需要特别关注。建议在正式部署前,先在测试环境验证所有网络方案,并准备好详细的回滚计划。对于关键业务系统,可以采用渐进式部署策略,先在小范围节点上验证,确认稳定后再逐步扩大部署范围。