如何在裸机环境中使用kubeadm安装Kubernetes(k8s)集群?

问题浏览数Icon
37
问题创建时间Icon
2025-03-21 06:32:00
回答 | 共 5 个
作者头像
chengxin88

在裸机环境中使用kubeadm部署Kubernetes集群,需重点关注以下实践经验:

  1. 前置条件:所有节点需禁用swap、同步时间、配置防火墙(6443/2379等端口)及安装容器运行时(containerd/docker)。建议使用CentOS 7/8或Ubuntu 20.04+等已验证OS版本。
  2. 镜像加速:通过imageRepository参数指定私有镜像仓库(如阿里云镜像源),避免gcr.io访问问题。可预先执行kubeadm config images pull拉取镜像。
  3. 网络方案:裸机环境优先选择Calico或Cilium作为CNI插件,需提前规划Pod CIDR并验证网络互通性,避免与物理网络冲突。
  4. 存储集成:部署Rook/Ceph或OpenEBS实现裸机持久化存储,需单独规划磁盘分区并验证底层存储性能。
  5. 高可用控制平面:若需HA,需部署至少3个控制节点,配合HAProxy或Keepalived实现API Server负载均衡。
  6. 证书管理:通过kubeadm init时指定cert-dir和自定义证书有效期,建议使用x509v3扩展配置SAN(Subject Alternative Name)。
  7. 灾备验证:部署后需测试节点断电、网络分区等异常场景,验证etcd集群健康状态和workload迁移能力。

关键陷阱:未关闭SELinux导致权限错误、CNI插件未及时安装造成CoreDNS pending、未配置kube-proxy的ipvs模式影响性能。建议结合kubeadm reset进行环境清理和重试。

作者头像
yezi01
  1. 环境准备

    • 所有节点:禁用swap (swapoff -a),关闭SELinux/防火墙,同步时间,设置唯一hostname,配置/etc/hosts解析。
    • 控制节点≥2核2GB,工作节点按负载配置。
  2. 安装容器运行时

    # 安装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
  3. 安装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
  4. 初始化控制平面

    # 仅在主节点执行
    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
  5. 部署网络插件

    kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
  6. 加入工作节点

    # 工作节点执行kubeadm join命令(从init输出获取)
    kubeadm join <主节点IP>:6443 --token <token> --discovery-token-ca-cert-hash sha256:<hash>
  7. 验证集群

    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等端口未被占用
作者头像
snowlion77
  1. 系统准备:

    • 所有节点禁用swap:swapoff -a,注释/etc/fstab中的swap行
    • 设置hostname解析:vim /etc/hosts添加所有节点IP和主机名
    • 启用内核模块:modprobe br_netfilter
    • 配置sysctl:echo 'net.ipv4.ip_forward=1' >> /etc/sysctl.confsysctl -p
  2. 安装容器运行时:

    apt-get install -y containerd
    mkdir -p /etc/containerd
    containerd config default > /etc/containerd/config.toml
    systemctl restart containerd
  3. 安装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
  4. 初始化控制平面:

    kubeadm init --pod-network-cidr=10.244.0.0/16
    mkdir -p $HOME/.kube
    cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
  5. 部署网络插件(Calico示例):

    kubectl apply -f https://raw.githubusercontent.com/projectcalico/calico/v3.26.1/manifests/calico.yaml
  6. 加入工作节点: 在控制平面执行kubeadm token create --print-join-command获取加入命令 工作节点执行生成的kubeadm join命令

作者头像
dreamwolf77

在裸机环境中使用kubeadm部署Kubernetes集群需遵循以下核心步骤及注意事项:

一、环境准备

  1. 系统要求:禁用Swap并设置sysctl参数(如net.ipv4.ip_forward=1net.bridge.bridge-nf-call-iptables=1),CentOS需加载br_netfilter模块
  2. 容器运行时:推荐containerd,需配置cgroupdriver=systemd并与kubelet一致,避免Docker因CRI兼容性问题导致初始化失败
  3. 软件包预装:通过阿里云镜像源安装kubeadm/kubelet/kubectl,注意锁定版本防止自动升级冲突

二、集群初始化

  1. 配置生成:使用kubeadm config print init-defaults生成YAML模板,需调整项包括:
    • imageRepository: registry.aliyuncs.com/google_containers
    • networking.podSubnet需与CNI插件匹配(如Calico默认192.168.0.0/16)
    • controllerManager.extraArgs.node-cidr-mask-size: 24
  2. 证书优化:通过apiServer.certSANs添加所有节点及负载均衡器IP,为后续高可用扩展预留
  3. 预拉镜像:执行kubeadm config images pull --config init.yaml避免网络超时中断流程

三、网络方案实施

  1. CNI选型:生产环境优先Calico(支持BGP网络策略),需修改ippool配置适配物理网络MTU值
  2. 多网卡处理:通过IP_AUTODETECTION_METHOD指定绑定接口,避免自动选择错误NIC导致跨节点不通
  3. MetalLB集成:为LoadBalancer类型服务分配物理IP段,需与网络部门协调保留IP地址池

四、存储架构设计

  1. 本地存储:使用OpenEBS创建LocalPV,需预置RAID卡策略并配置磁盘调度规则
  2. 分布式存储:Rook Ceph部署需规划OSD磁盘分区,避免/journal与Wal分区同盘引发性能瓶颈
  3. 存储类优化:设置ReclaimPolicy为Retain防止误删生产数据,启用VolumeBindingMode延迟绑定

五、高可用实现

  1. 负载均衡器:通过Keepalived+HAProxy实现VIP漂移,注意配置TCP健康检查而非HTTP模式
  2. ETCD集群:独立部署三节点etcd集群,定期快照备份并监控etcd_server_has_leader指标
  3. 控制平面:使用kubeadm join --control-plane扩展Master节点,需预配共享密钥同步证书

典型故障案例

  1. coredns CrashLoopBackOff:检查Calico是否分配IP,kubelet -v=3查看CNI插件调用日志
  2. NodeNotReady:确认kubelet进程存活,journalctl -u kubelet排查cgroup驱动配置冲突
  3. 证书过期:提前使用kubeadm certs renew更新,通过openssl x509 -in apiserver.crt -noout -text验证有效期

实践建议:使用Ansible批量配置节点参数,通过Cluster API实现声明式集群生命周期管理,在物理机BIOS层启用SR-IOV提升网络性能。

作者头像
ptleaf99

在裸机环境中使用kubeadm部署Kubernetes集群需遵循以下步骤:

  1. 系统准备

    • 所有节点禁用swap,同步时间(chrony/ntpd)
    • 配置唯一主机名并设置/etc/hosts解析
    • 启用br_netfilter内核模块,设置sysctl参数(net.ipv4.ip_forward=1等)
    • 开放防火墙端口(6443,2379-2380,10250-10255等)
  2. 容器运行时安装

    • 选择containerd或Docker CE,配置cgroup驱动为systemd
    • 验证运行时与kubelet兼容性(推荐containerd v1.6+)
  3. 安装kubeadm组件

    • 配置Kubernetes官方yum/apt源
    • 安装kubelet/kubeadm/kubectl,锁定版本避免自动升级
    • 启动并设置kubelet开机自启
  4. 初始化控制平面

    • kubeadm init --pod-network-cidr= --apiserver-advertise-address=
    • 记录join命令,配置kubectl上下文
    • 部署网络插件(Calico/Flannel需匹配pod CIDR)
  5. 加入工作节点

    • 在工作节点执行kubeadm join命令
    • 验证节点状态为Ready
  6. 扩展配置

    • 部署MetalLB实现LoadBalancer
    • 配置Local Persistent Volume或CSI存储方案
    • 启用Metrics Server/Dashboard等插件

关键注意事项:

  • 需确保容器镜像仓库可访问(可预先拉取镜像)
  • 生产环境建议分离etcd集群与控制平面
  • 使用kubeadm config生成定制化部署配置文件
  • 通过kubeadm upgrade plan管理集群版本升级