1. 环境准备打造Kubernetes的温床第一次接触Kubernetes集群搭建时我对着文档折腾了整整三天。现在回想起来很多问题其实出在环境准备阶段。就像盖房子要打地基搭建K8s集群也需要先准备好合适的土壤。建议选择CentOS 7或Ubuntu 18.04/20.04这类主流Linux发行版它们对Kubernetes的兼容性最好。我实测过在CentOS 8上会遇到各种依赖问题对新手不太友好。虚拟机配置方面master节点至少需要2核CPU、2GB内存worker节点可以稍低些但不要低于1核1G。记得关闭swap分区否则kubelet会不断报错。网络配置是第一个大坑。我强烈建议使用NAT模式配合静态IP这样既能保证虚拟机上网又能固定节点IP。曾经因为DHCP自动分配IP导致节点失联排查了半天才发现是IP变了。配置静态IP时注意网关和DNS要填写正确可以用ping www.baidu.com测试网络连通性。2. 组件安装搭建K8s的基石安装Docker时最容易踩的坑是版本问题。Kubernetes对Docker版本有严格限制太新或太旧都会出问题。推荐使用Docker CE 18.06或19.03版本这两个版本经过大量生产环境验证。安装后记得配置阿里云镜像加速否则拉取镜像时会慢到怀疑人生。kubeadm、kubelet和kubectl这三件套的安装要注意版本一致。我习惯用yum指定版本号安装比如yum install -y kubelet-1.20.0 kubeadm-1.20.0 kubectl-1.20.0。曾经因为没指定版本导致组件版本不一致集群死活起不来。配置软件源时国内用户一定要换成阿里云镜像源。原始Google源基本连不上会导致安装失败。配置好repo文件后记得yum makecache刷新缓存。这个步骤看似简单但很多新手会忽略结果就是安装时找不到包。3. 集群初始化见证奇迹的时刻执行kubeadm init时这几个参数最关键--apiserver-advertise-address填写master节点的IP--image-repository换成国内镜像源--pod-network-cidr要与后续安装的网络插件匹配我第一次部署时没指定镜像仓库结果卡在拉取镜像这步两小时。后来发现加上registry.aliyuncs.com/google_containers这个参数后镜像下载飞快。初始化成功后一定要按照提示执行那三条命令把admin.conf复制到.kube目录。很多新手会漏掉这步导致kubectl命令报错无法连接。我当时就栽在这里还以为是防火墙问题。worker节点加入集群时token默认24小时有效。如果超时了也不用慌在master节点执行kubeadm token create --print-join-command就能生成新命令。我曾经因为隔天才加worker节点不得不重新初始化整个集群。4. 网络插件集群的神经系统Flannel是最容易上手的CNI插件但直接使用官方yaml会卡在拉取镜像。我的解决方案是提前修改yaml文件中的镜像地址为国内源。Calico性能更好但配置复杂新手建议先用Flannel练手。部署完网络插件后用kubectl get nodes查看节点状态应该都是Ready。如果显示NotReady通常是镜像没拉取成功。可以用kubectl describe pod -n kube-system查看具体错误。测试网络是否通畅有个小技巧部署一个nginx服务并暴露NodePort然后在各个节点上curl这个服务。如果都能访问说明网络配置正确。我第一次测试时只在master节点验证结果worker节点其实无法通信。5. 常见问题排查指南遇到节点NotReady时按这个顺序排查检查kubelet状态systemctl status kubelet查看容器运行时docker ps或crictl ps检查网络插件日志kubectl logs -n kube-system pod-name镜像拉取失败是最常见的问题。可以手动docker pull镜像然后docker tag改回原名。比如docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/pause:3.2 docker tag registry.cn-hangzhou.aliyuncs.com/google_containers/pause:3.2 k8s.gcr.io/pause:3.2如果kubectl命令报错connection refused检查以下几点master节点的6443端口是否开放/etc/kubernetes/admin.conf是否复制到~/.kube/config防火墙是否关闭6. 生产环境优化建议虽然这是个实验集群但有些优化可以提前了解使用containerd代替Docker资源占用更少配置kubelet的--max-pods参数防止节点过载为kube-apiserver配置--audit-log参数记录审计日志定期备份etcd数据记得给节点打标签比如kubectl label node node1 disktypessd。这样部署应用时可以用nodeSelector选择特定节点。我刚开始不知道这个功能所有pod都随机调度导致SSD节点的优势没发挥出来。最后分享一个实用技巧在master节点安装kubectl自动补全工具。执行echo source (kubectl completion bash) ~/.bashrc后输入命令时按Tab就能自动补全效率提升不止一倍。
从零搭建Kubernetes集群:基于kubeadm的实战部署指南
1. 环境准备打造Kubernetes的温床第一次接触Kubernetes集群搭建时我对着文档折腾了整整三天。现在回想起来很多问题其实出在环境准备阶段。就像盖房子要打地基搭建K8s集群也需要先准备好合适的土壤。建议选择CentOS 7或Ubuntu 18.04/20.04这类主流Linux发行版它们对Kubernetes的兼容性最好。我实测过在CentOS 8上会遇到各种依赖问题对新手不太友好。虚拟机配置方面master节点至少需要2核CPU、2GB内存worker节点可以稍低些但不要低于1核1G。记得关闭swap分区否则kubelet会不断报错。网络配置是第一个大坑。我强烈建议使用NAT模式配合静态IP这样既能保证虚拟机上网又能固定节点IP。曾经因为DHCP自动分配IP导致节点失联排查了半天才发现是IP变了。配置静态IP时注意网关和DNS要填写正确可以用ping www.baidu.com测试网络连通性。2. 组件安装搭建K8s的基石安装Docker时最容易踩的坑是版本问题。Kubernetes对Docker版本有严格限制太新或太旧都会出问题。推荐使用Docker CE 18.06或19.03版本这两个版本经过大量生产环境验证。安装后记得配置阿里云镜像加速否则拉取镜像时会慢到怀疑人生。kubeadm、kubelet和kubectl这三件套的安装要注意版本一致。我习惯用yum指定版本号安装比如yum install -y kubelet-1.20.0 kubeadm-1.20.0 kubectl-1.20.0。曾经因为没指定版本导致组件版本不一致集群死活起不来。配置软件源时国内用户一定要换成阿里云镜像源。原始Google源基本连不上会导致安装失败。配置好repo文件后记得yum makecache刷新缓存。这个步骤看似简单但很多新手会忽略结果就是安装时找不到包。3. 集群初始化见证奇迹的时刻执行kubeadm init时这几个参数最关键--apiserver-advertise-address填写master节点的IP--image-repository换成国内镜像源--pod-network-cidr要与后续安装的网络插件匹配我第一次部署时没指定镜像仓库结果卡在拉取镜像这步两小时。后来发现加上registry.aliyuncs.com/google_containers这个参数后镜像下载飞快。初始化成功后一定要按照提示执行那三条命令把admin.conf复制到.kube目录。很多新手会漏掉这步导致kubectl命令报错无法连接。我当时就栽在这里还以为是防火墙问题。worker节点加入集群时token默认24小时有效。如果超时了也不用慌在master节点执行kubeadm token create --print-join-command就能生成新命令。我曾经因为隔天才加worker节点不得不重新初始化整个集群。4. 网络插件集群的神经系统Flannel是最容易上手的CNI插件但直接使用官方yaml会卡在拉取镜像。我的解决方案是提前修改yaml文件中的镜像地址为国内源。Calico性能更好但配置复杂新手建议先用Flannel练手。部署完网络插件后用kubectl get nodes查看节点状态应该都是Ready。如果显示NotReady通常是镜像没拉取成功。可以用kubectl describe pod -n kube-system查看具体错误。测试网络是否通畅有个小技巧部署一个nginx服务并暴露NodePort然后在各个节点上curl这个服务。如果都能访问说明网络配置正确。我第一次测试时只在master节点验证结果worker节点其实无法通信。5. 常见问题排查指南遇到节点NotReady时按这个顺序排查检查kubelet状态systemctl status kubelet查看容器运行时docker ps或crictl ps检查网络插件日志kubectl logs -n kube-system pod-name镜像拉取失败是最常见的问题。可以手动docker pull镜像然后docker tag改回原名。比如docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/pause:3.2 docker tag registry.cn-hangzhou.aliyuncs.com/google_containers/pause:3.2 k8s.gcr.io/pause:3.2如果kubectl命令报错connection refused检查以下几点master节点的6443端口是否开放/etc/kubernetes/admin.conf是否复制到~/.kube/config防火墙是否关闭6. 生产环境优化建议虽然这是个实验集群但有些优化可以提前了解使用containerd代替Docker资源占用更少配置kubelet的--max-pods参数防止节点过载为kube-apiserver配置--audit-log参数记录审计日志定期备份etcd数据记得给节点打标签比如kubectl label node node1 disktypessd。这样部署应用时可以用nodeSelector选择特定节点。我刚开始不知道这个功能所有pod都随机调度导致SSD节点的优势没发挥出来。最后分享一个实用技巧在master节点安装kubectl自动补全工具。执行echo source (kubectl completion bash) ~/.bashrc后输入命令时按Tab就能自动补全效率提升不止一倍。