1. Kubernetes 1.20 集群部署实战指南
作为一名长期从事容器化部署的运维工程师,我深知搭建生产级Kubernetes集群的痛点。今天我将分享一套经过实战检验的Kubernetes 1.20集群部署方案,特别适合国内网络环境下的企业内网部署。这个方案采用本地镜像预加载的方式,完美解决了因网络问题导致的镜像拉取失败难题。
1.1 为什么选择这个方案?
在多次为客户部署Kubernetes集群的过程中,我发现官方文档的部署方式存在几个典型问题:
- 对网络依赖严重,特别是gcr.io镜像仓库在国内几乎无法访问
- 默认配置不适合生产环境,需要大量手动调优
- 缺乏完整的网络插件和监控组件集成
本方案通过以下创新点解决这些问题:
- 所有组件镜像本地化加载,不依赖外网
- 集成Flannel网络插件和Dashboard可视化界面
- 包含内核参数调优等生产级配置
- 详细记录每个步骤的故障排查方法
2. 环境准备与规划
2.1 硬件配置建议
根据我的经验,即使是测试环境,也不建议使用配置过低的机器。以下是经过验证的配置方案:
| 节点角色 | CPU核心 | 内存 | 磁盘 | 网络带宽 |
|---|---|---|---|---|
| Master节点 | 4核 | 8GB | 100GB | 1Gbps |
| Worker节点 | 8核 | 16GB | 200GB | 1Gbps |
实际测试中发现,当Worker节点内存低于4GB时,经常会出现Pod被OOMKilled的情况。因此建议最小配置为2C4G。
2.2 操作系统优化
CentOS 7.x是最稳定的选择,但需要特别注意内核版本:
bash复制# 检查内核版本
uname -r
# 建议3.10.0-1160.el7.x86_64及以上
我强烈建议在安装前执行以下优化:
- 更新系统基础软件包
- 安装必备工具集(net-tools, telnet, lsof等)
- 配置NTP时间同步
- 调整文件描述符限制
3. 关键组件部署详解
3.1 Docker安装的隐藏坑点
虽然文档中给出了Docker安装步骤,但有几个关键点需要特别注意:
- 存储驱动选择:
bash复制# 检查当前存储驱动
docker info | grep "Storage Driver"
建议使用overlay2,需要在daemon.json中添加:
json复制{
"storage-driver": "overlay2",
"storage-opts": [
"overlay2.override_kernel_check=true"
]
}
- 日志轮转配置:
默认配置下,Docker日志会无限增长。我的生产环境配置:
json复制"log-opts": {
"max-size": "100m",
"max-file": "3",
"compress": "true"
}
3.2 kubeadm初始化背后的原理
当执行kubeadm init时,实际上发生了这些关键操作:
- 生成PKI证书(默认有效期1年)
- 创建静态Pod清单(/etc/kubernetes/manifests)
- 部署核心组件(kube-apiserver, etcd等)
- 生成kubeconfig文件
我建议使用--upload-certs参数,这样能自动处理证书分发问题:
bash复制kubeadm init --upload-certs
4. 网络方案深度解析
4.1 Flannel网络模型剖析
Flannel之所以成为最受欢迎的CNI插件,主要因为它的简单可靠。其核心原理是:
- 为每个节点分配子网(/24)
- 使用VXLAN封装跨节点流量
- 通过etcd或Kubernetes API存储网络状态
但实际部署时需要注意:
yaml复制# kube-flannel.yml关键配置
net-conf.json: |
{
"Network": "10.244.0.0/16",
"Backend": {
"Type": "vxlan",
"DirectRouting": true # 同网段节点间直接路由
}
}
4.2 网络问题排查指南
当遇到Pod间网络不通时,按以下步骤排查:
- 检查Flannel Pod状态
- 验证节点路由表
- 测试VXLAN隧道
- 检查iptables规则
我常用的诊断命令:
bash复制# 查看节点路由
ip route show
# 检查VXLAN设备
ip -d link show flannel.1
# 测试跨节点通信
kubectl run testpod --image=busybox -- ping 10.244.1.2
5. Dashboard安全加固方案
5.1 生产级访问控制
默认的Dashboard配置存在安全隐患,建议进行以下加固:
- 启用HTTPS(使用真实证书而非自签名)
- 配置认证白名单
- 限制管理员Token有效期
我的安全配置示例:
yaml复制# recommended.yaml修改点
args:
- --auto-generate-certificates
- --enable-skip-login # 禁用跳过登录
- --enable-insecure-login=false # 禁用HTTP登录
- --token-ttl=3600 # Token有效期1小时
5.2 审计日志集成
为监控Dashboard操作,建议启用审计日志:
yaml复制# kube-apiserver配置添加
--audit-log-path=/var/log/kubernetes/audit.log
--audit-log-maxage=30
--audit-log-maxbackup=10
6. 生产环境调优经验
6.1 内核参数黄金配置
经过数十次集群部署验证,这些内核参数最能提升稳定性:
bash复制# /etc/sysctl.d/99-kubernetes.conf
vm.swappiness=0
vm.overcommit_memory=1
vm.overcommit_ratio=50
kernel.panic=10
kernel.panic_on_oops=1
6.2 Kubelet内存管理
防止系统OOM的关键配置:
yaml复制# /var/lib/kubelet/config.yaml
evictionHard:
memory.available: "500Mi"
nodefs.available: "10%"
kubeReserved:
cpu: "500m"
memory: "1Gi"
systemReserved:
cpu: "500m"
memory: "1Gi"
7. 故障排查实战案例
7.1 典型问题1:节点NotReady
现象:节点状态显示NotReady
排查步骤:
- 检查kubelet日志
- 验证容器运行时状态
- 排查网络插件问题
解决方案:
bash复制journalctl -u kubelet -n 100 # 查看最近100条日志
systemctl restart docker kubelet # 重启关键服务
7.2 典型问题2:Pod一直Pending
常见原因:
- 资源不足
- 节点选择器不匹配
- PV绑定问题
诊断命令:
bash复制kubectl describe pod <pod-name> # 查看事件
kubectl get events --sort-by=.metadata.creationTimestamp # 集群事件
8. 集群扩展与升级
8.1 节点扩容最佳实践
新增Worker节点时,建议:
- 先进行基础环境检查
- 小批量逐步添加
- 监控系统负载变化
我的扩容检查清单:
bash复制# 新节点预检查
kubeadm join --dry-run
kubectl get nodes -o wide
8.2 版本升级路线图
从1.20升级到1.21的注意事项:
- 先升级kubeadm
- 逐个节点升级
- 检查API兼容性
升级命令示例:
bash复制kubeadm upgrade plan
kubeadm upgrade apply v1.21.0
经过多次实战验证,这套Kubernetes 1.20部署方案在稳定性、易用性和安全性方面都表现出色。特别是在网络受限的环境下,本地镜像加载的方案大大提高了部署成功率。建议在生产环境部署前,先在测试环境完整演练一遍所有步骤,并做好关键组件的监控配置。