裸机装k8s集群用kubeadm挺简单,大概这么搞:1. 所有机器装好docker和kubeadm工具包,关掉swap,改好hostname;2. 主节点跑kubeadm init,记得加参数比如--pod-network-cidr,装完按提示配kubectl;3. 装个网络插件比如Calico或者Flannel,apply下配置文件;4. 从节点用kubeadm join带上主节点给的token加入集群;5. 最后kubectl get nodes确认下状态就完事了。注意防火墙和系统版本别踩坑!
如何在裸机环境中使用kubeadm安装Kubernetes(k8s)集群?
回答
| 共 7 个
在裸机环境中使用kubeadm安装Kubernetes集群的步骤如下:
- 在所有节点安装Docker、kubeadm、kubelet、kubectl;
- 主节点执行
kubeadm init初始化控制平面; - 工作节点通过
kubeadm join加入集群; - 安装网络插件(如Calico)。
延伸知识点:kubeadm init配置文件详解
执行kubeadm config print init-defaults可生成默认配置模板。核心配置项包括:
localAPIEndpoint.advertiseAddress: 主节点对外暴露的IP(需设为物理机实际IP);networking.podSubnet: Pod网段(须与CNI插件匹配,Calico默认使用192.168.0.0/16);kubernetesVersion: 指定K8s版本避免兼容问题;nodeRegistration.criSocket: 容器运行时接口地址(如containerd为unix:///run/containerd/containerd.sock)。 通过kubeadm init --config=config.yaml加载自定义配置,可精准控制集群参数,避免裸机环境中因默认值不匹配导致的网络初始化失败等问题。
在裸机环境中使用kubeadm部署Kubernetes集群,需重点关注以下实践经验:
- 前置条件:所有节点需禁用swap、同步时间、配置防火墙(6443/2379等端口)及安装容器运行时(containerd/docker)。建议使用CentOS 7/8或Ubuntu 20.04+等已验证OS版本。
- 镜像加速:通过
imageRepository参数指定私有镜像仓库(如阿里云镜像源),避免gcr.io访问问题。可预先执行kubeadm config images pull拉取镜像。 - 网络方案:裸机环境优先选择Calico或Cilium作为CNI插件,需提前规划Pod CIDR并验证网络互通性,避免与物理网络冲突。
- 存储集成:部署Rook/Ceph或OpenEBS实现裸机持久化存储,需单独规划磁盘分区并验证底层存储性能。
- 高可用控制平面:若需HA,需部署至少3个控制节点,配合HAProxy或Keepalived实现API Server负载均衡。
- 证书管理:通过
kubeadm init时指定cert-dir和自定义证书有效期,建议使用x509v3扩展配置SAN(Subject Alternative Name)。 - 灾备验证:部署后需测试节点断电、网络分区等异常场景,验证etcd集群健康状态和workload迁移能力。
关键陷阱:未关闭SELinux导致权限错误、CNI插件未及时安装造成CoreDNS pending、未配置kube-proxy的ipvs模式影响性能。建议结合kubeadm reset进行环境清理和重试。
-
环境准备
- 所有节点:禁用swap (
swapoff -a),关闭SELinux/防火墙,同步时间,设置唯一hostname,配置/etc/hosts解析。 - 控制节点≥2核2GB,工作节点按负载配置。
- 所有节点:禁用swap (
-
安装容器运行时
# 安装containerd(所有节点) apt-get install -y containerd cat > /etc/containerd/config.toml <<EOF [plugins."io.containerd.grpc.v1.cri"] sandbox_image = "registry.k8s.io/pause:3.6" EOF systemctl restart containerd -
安装kubeadm/kubelet/kubectl
# 所有节点 apt-get install -y apt-transport-https curl curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | apt-key add - echo "deb https://apt.kubernetes.io/ kubernetes-xenial main" > /etc/apt/sources.list.d/kubernetes.list apt-get update && apt-get install -y kubeadm=1.28.0-00 kubelet=1.28.0-00 kubectl=1.28.0-00 -
初始化控制平面
# 仅在主节点执行 kubeadm init --pod-network-cidr=10.244.0.0/16 --apiserver-advertise-address=<主节点IP> mkdir -p $HOME/.kube cp -i /etc/kubernetes/admin.conf $HOME/.kube/config -
部署网络插件
kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml -
加入工作节点
# 工作节点执行kubeadm join命令(从init输出获取) kubeadm join <主节点IP>:6443 --token <token> --discovery-token-ca-cert-hash sha256:<hash> -
验证集群
kubectl get nodes # 所有节点显示Ready kubectl get pods -A # 检查CoreDNS等系统Pod运行状态
排错要点:
- 镜像拉取失败:使用
kubeadm config images pull --image-repository=registry.aliyuncs.com/google_containers - 节点NotReady:检查网络插件日志
kubectl logs -n kube-system <flannel-pod> - 端口冲突:确认6443/10250等端口未被占用
-
系统准备:
- 所有节点禁用swap:
swapoff -a,注释/etc/fstab中的swap行 - 设置hostname解析:
vim /etc/hosts添加所有节点IP和主机名 - 启用内核模块:
modprobe br_netfilter - 配置sysctl:
echo 'net.ipv4.ip_forward=1' >> /etc/sysctl.conf并sysctl -p
- 所有节点禁用swap:
-
安装容器运行时:
apt-get install -y containerd mkdir -p /etc/containerd containerd config default > /etc/containerd/config.toml systemctl restart containerd -
安装kubeadm/kubelet/kubectl:
apt-get install -y apt-transport-https ca-certificates curl curl -fsSL https://pkgs.k8s.io/core:/stable:/v1.28/deb/Release.key | gpg --dearmor -o /etc/apt/keyrings/kubernetes-apt-keyring.gpg echo 'deb [signed-by=/etc/apt/keyrings/kubernetes-apt-keyring.gpg] https://pkgs.k8s.io/core:/stable:/v1.28/deb/ /' | tee /etc/apt/sources.list.d/kubernetes.list apt-get update && apt-get install -y kubelet kubeadm kubectl -
初始化控制平面:
kubeadm init --pod-network-cidr=10.244.0.0/16 mkdir -p $HOME/.kube cp -i /etc/kubernetes/admin.conf $HOME/.kube/config -
部署网络插件(Calico示例):
kubectl apply -f https://raw.githubusercontent.com/projectcalico/calico/v3.26.1/manifests/calico.yaml -
加入工作节点: 在控制平面执行
kubeadm token create --print-join-command获取加入命令 工作节点执行生成的kubeadm join命令
在裸机环境中使用kubeadm部署Kubernetes集群需遵循以下核心步骤及注意事项:
一、环境准备
- 系统要求:禁用Swap并设置
sysctl参数(如net.ipv4.ip_forward=1及net.bridge.bridge-nf-call-iptables=1),CentOS需加载br_netfilter模块 - 容器运行时:推荐containerd,需配置
cgroupdriver=systemd并与kubelet一致,避免Docker因CRI兼容性问题导致初始化失败 - 软件包预装:通过阿里云镜像源安装kubeadm/kubelet/kubectl,注意锁定版本防止自动升级冲突
二、集群初始化
- 配置生成:使用
kubeadm config print init-defaults生成YAML模板,需调整项包括:imageRepository: registry.aliyuncs.com/google_containersnetworking.podSubnet需与CNI插件匹配(如Calico默认192.168.0.0/16)controllerManager.extraArgs.node-cidr-mask-size: 24
- 证书优化:通过
apiServer.certSANs添加所有节点及负载均衡器IP,为后续高可用扩展预留 - 预拉镜像:执行
kubeadm config images pull --config init.yaml避免网络超时中断流程
三、网络方案实施
- CNI选型:生产环境优先Calico(支持BGP网络策略),需修改
ippool配置适配物理网络MTU值 - 多网卡处理:通过
IP_AUTODETECTION_METHOD指定绑定接口,避免自动选择错误NIC导致跨节点不通 - MetalLB集成:为LoadBalancer类型服务分配物理IP段,需与网络部门协调保留IP地址池
四、存储架构设计
- 本地存储:使用OpenEBS创建LocalPV,需预置RAID卡策略并配置磁盘调度规则
- 分布式存储:Rook Ceph部署需规划OSD磁盘分区,避免/journal与Wal分区同盘引发性能瓶颈
- 存储类优化:设置ReclaimPolicy为Retain防止误删生产数据,启用VolumeBindingMode延迟绑定
五、高可用实现
- 负载均衡器:通过Keepalived+HAProxy实现VIP漂移,注意配置TCP健康检查而非HTTP模式
- ETCD集群:独立部署三节点etcd集群,定期快照备份并监控
etcd_server_has_leader指标 - 控制平面:使用
kubeadm join --control-plane扩展Master节点,需预配共享密钥同步证书
典型故障案例
- coredns CrashLoopBackOff:检查Calico是否分配IP,
kubelet -v=3查看CNI插件调用日志 - NodeNotReady:确认kubelet进程存活,
journalctl -u kubelet排查cgroup驱动配置冲突 - 证书过期:提前使用
kubeadm certs renew更新,通过openssl x509 -in apiserver.crt -noout -text验证有效期
实践建议:使用Ansible批量配置节点参数,通过Cluster API实现声明式集群生命周期管理,在物理机BIOS层启用SR-IOV提升网络性能。
在裸机环境中使用kubeadm部署Kubernetes集群需遵循以下步骤:
-
系统准备
- 所有节点禁用swap,同步时间(chrony/ntpd)
- 配置唯一主机名并设置/etc/hosts解析
- 启用br_netfilter内核模块,设置sysctl参数(net.ipv4.ip_forward=1等)
- 开放防火墙端口(6443,2379-2380,10250-10255等)
-
容器运行时安装
- 选择containerd或Docker CE,配置cgroup驱动为systemd
- 验证运行时与kubelet兼容性(推荐containerd v1.6+)
-
安装kubeadm组件
- 配置Kubernetes官方yum/apt源
- 安装kubelet/kubeadm/kubectl,锁定版本避免自动升级
- 启动并设置kubelet开机自启
-
初始化控制平面
- kubeadm init --pod-network-cidr=
--apiserver-advertise-address= - 记录join命令,配置kubectl上下文
- 部署网络插件(Calico/Flannel需匹配pod CIDR)
- kubeadm init --pod-network-cidr=
-
加入工作节点
- 在工作节点执行kubeadm join命令
- 验证节点状态为Ready
-
扩展配置
- 部署MetalLB实现LoadBalancer
- 配置Local Persistent Volume或CSI存储方案
- 启用Metrics Server/Dashboard等插件
关键注意事项:
- 需确保容器镜像仓库可访问(可预先拉取镜像)
- 生产环境建议分离etcd集群与控制平面
- 使用kubeadm config生成定制化部署配置文件
- 通过kubeadm upgrade plan管理集群版本升级
推荐
热门问答
部分内容依据人工智能生成,仅供参考,可能有误请注意甄别