掌握Kubernetes:从架构解析到集群部署实战
在云原生时代,Kubernetes(简称K8S)已成为容器编排的事实标准。无论是初创公司还是大型企业,掌握K8S都是现代运维和开发工程师的必备技能。本文将带你深入理解K8S的核心架构,并通过实战演示如何使用kubeadm快速搭建生产可用的K8S集群。
一、Kubernetes核心架构解析
什么是Kubernetes?
Kubernetes是一款开源的容器编排平台,用于自动化部署、扩展和管理容器化应用。它支持单机与集群模式,提供强大的服务发现、负载均衡、自我修复和滚动更新等功能。
架构组成
K8S集群采用主从架构,分为控制平面(Master)和工作节点(Worker Node):
控制平面组件:
- etcd:分布式键值存储,保存整个集群的状态数据
- API Server:集群管理的统一入口,提供RESTful API
- Controller Manager:维护集群状态,确保实际状态与期望状态一致
- Scheduler:负责将Pod调度到合适的节点上
工作节点组件:
- Kubelet:管理节点上容器的生命周期,与API Server通信
- Kube-proxy:实现服务发现和负载均衡,维护节点网络规则
CNI网络插件:
- Flannel、Calico、Cilium等,负责Pod间的网络通信
K8S的三种网络类型
- 节点网络:物理主机IP网络
- Pod网络:容器间的虚拟网络
- Service网络:服务的虚拟IP,提供负载均衡和服务发现
二、Kubernetes部署方案对比
官方部署方式
-
二进制部署:
- 优势:高度可定制化
- 劣势:配置复杂,证书管理繁琐
- 适合:对K8S有深入了解的团队
-
kubeadm部署:
- 优势:快速简单,官方推荐
- 劣势:灵活性相对较低
- 适合:快速搭建测试或生产环境
第三方部署方案
- 国内方案:KubeSphere、Kuboard、kubeasz
- 国外方案:Rancher(含轻量级K3S)
- 云厂商服务:阿里云ACK、腾讯云TKE、华为云CCE等
- 开发工具:minikube、kind(适合本地开发测试)
生产环境版本选择建议
- K8S 1.24+版本已移除对Docker的原生支持
- 建议使用Containerd作为容器运行时,性能更优
- 长期支持版本(LTS)更适合生产环境
三、实战:使用kubeadm部署K8S集群
环境准备
- 操作系统:Ubuntu 22.04 LTS
- 节点规划:
- Master: 10.0.0.231
- Worker1: 10.0.0.232
- Worker2: 10.0.0.233
- 硬件要求:至少2核CPU、4GB内存
关键配置步骤
1. 系统优化配置
# 关闭swap分区
swapoff -a
sed -i '/swap/s/^/#/' /etc/fstab
# 启用内核模块
cat > /etc/modules-load.d/k8s.conf <<EOF
br_netfilter
EOF
# 配置网络参数
cat > /etc/sysctl.d/k8s.conf <<EOF
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1
EOF
sysctl --system
2. 安装运行时和K8S组件
# 安装Docker(或Containerd)
# 配置阿里云K8S源
apt-get update && apt-get install -y apt-transport-https
curl https://mirrors.aliyun.com/kubernetes/apt/doc/apt-key.gpg | apt-key add -
# 安装指定版本(以1.23.17为例)
apt-get install -y kubelet=1.23.17-00 kubeadm=1.23.17-00 kubectl=1.23.17-00
3. 初始化Master节点
# 提前拉取镜像(国内加速)
kubeadm init \
--kubernetes-version=v1.23.17 \
--image-repository=registry.aliyuncs.com/google_containers \
--pod-network-cidr=10.100.0.0/16 \
--service-cidr=10.200.0.0/16
# 配置kubectl
mkdir -p $HOME/.kube
cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
4. 加入Worker节点
使用Master初始化后生成的join命令:
kubeadm join <master-ip>:6443 --token <token> --discovery-token-ca-cert-hash <hash>
网络插件部署(以Flannel为例)
# 修改网段匹配Pod CIDR
wget https://raw.githubusercontent.com/flannel-io/flannel/master/Documentation/kube-flannel.yml
sed -i 's|"Network": "10.244.0.0/16"|"Network": "10.100.0.0/16"|' kube-flannel.yml
# 部署Flannel
kubectl apply -f kube-flannel.yml
验证集群状态
# 查看节点状态
kubectl get nodes -o wide
# 查看所有Pod状态
kubectl get pods --all-namespaces -o wide
# 测试网络连通性
kubectl run test --image=nginx --port=80
四、集群优化与维护建议
生产环境优化
- 证书管理:kubeadm自动生成的证书有效期为1年,需定期更新
- 高可用部署:通过多Master节点实现控制平面高可用
- 监控告警:集成Prometheus + Grafana监控体系
- 日志收集:使用EFK或Loki堆栈
故障排查技巧
- 使用
kubectl describe查看资源详情 - 使用
kubectl logs查看容器日志 - 检查各组件日志:
journalctl -u kubelet - 验证网络插件:使用
busybox进行Pod间连通性测试
五、总结
通过本文的实践,我们完成了从K8S架构理解到实际集群部署的全过程。掌握K8S不仅需要理解其核心组件和工作原理,更需要通过实践积累部署和维护经验。随着云原生技术的不断发展,K8S生态系统也在快速演进,建议持续关注CNCF技术蓝图,了解最新技术动态。
学习建议:
- 从单节点集群开始,逐步扩展到多节点
- 尝试不同的网络插件(Calico、Cilium)
- 实践常用资源类型:Deployment、Service、ConfigMap、Secret等
- 学习Helm进行应用打包和部署
- 参与开源社区,阅读官方文档和最佳实践
掌握Kubernetes是现代云计算领域的核心竞争力之一,希望本文能为你的云原生之旅提供有价值的参考。
本文基于Kubernetes 1.23.17版本编写,部分配置可能随版本更新有所变化,请以官方文档为准。文中涉及的技术方案已在实际生产环境验证,可根据具体需求进行调整优化。