ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

使用kubeadm从零搭建生产级Kubernetes集群指南

使用kubeadm从零搭建生产级Kubernetes集群指南

1. Kubernetes集群搭建概述

Kubernetes作为容器编排的事实标准,已经成为现代云原生应用的核心基础设施。对于刚接触Kubernetes的开发者来说,搭建一个可用的集群往往是第一个挑战。本指南将使用kubeadm工具,带你从零开始构建一个生产可用的Kubernetes集群。

kubeadm是Kubernetes官方推荐的集群引导工具,它遵循最佳实践,能够创建符合Kubernetes一致性测试的集群。相比其他部署方式,kubeadm具有以下优势:

  • 标准化:生成的集群结构与官方文档一致
  • 轻量化:只包含必要的核心组件
  • 可扩展:可作为更复杂部署方案的基础

2. 环境准备

2.1 硬件要求

搭建Kubernetes集群前,需要准备符合以下要求的机器:

  • 操作系统:兼容deb/rpm的Linux发行版(如Ubuntu 20.04+或CentOS 7+)
  • 控制平面节点:至少2核CPU、2GB内存、30GB磁盘
  • 工作节点:至少1核CPU、1GB内存、20GB磁盘
  • 网络:所有节点间需互通,建议千兆内网

生产环境建议控制平面节点配置4核CPU/8GB内存以上,并采用多节点高可用架构

2.2 系统配置

在所有节点上执行以下基础配置:

  1. 关闭swap:
sudo swapoff -a sudo sed -i '/ swap / s/^\(.*\)$/#\1/g' /etc/fstab
  1. 设置主机名:
sudo hostnamectl set-hostname <node-name> # 如master-node或worker-01
  1. 配置时间同步:
sudo timedatectl set-timezone Asia/Shanghai sudo systemctl enable --now chronyd
  1. 加载内核模块:
sudo modprobe br_netfilter sudo modprobe overlay echo "br_netfilter" | sudo tee /etc/modules-load.d/k8s.conf echo "overlay" | sudo tee -a /etc/modules-load.d/k8s.conf
  1. 配置内核参数:
cat <<EOF | sudo tee /etc/sysctl.d/k8s.conf net.bridge.bridge-nf-call-ip6tables = 1 net.bridge.bridge-nf-call-iptables = 1 net.ipv4.ip_forward = 1 EOF sudo sysctl --system

3. 容器运行时安装

Kubernetes支持多种容器运行时,我们以containerd为例:

3.1 安装containerd

  1. 安装依赖:
sudo yum install -y yum-utils device-mapper-persistent-data lvm2
  1. 添加Docker仓库:
sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
  1. 安装containerd:
sudo yum install -y containerd.io
  1. 配置containerd:
sudo mkdir -p /etc/containerd containerd config default | sudo tee /etc/containerd/config.toml sudo sed -i 's/SystemdCgroup = false/SystemdCgroup = true/' /etc/containerd/config.toml
  1. 启动服务:
sudo systemctl enable --now containerd

3.2 验证安装

检查containerd状态:

sudo systemctl status containerd ctr version

4. 安装kubeadm、kubelet和kubectl

在所有节点上执行:

  1. 添加Kubernetes仓库:
cat <<EOF | sudo tee /etc/yum.repos.d/kubernetes.repo [kubernetes] name=Kubernetes baseurl=https://packages.cloud.google.com/yum/repos/kubernetes-el7-x86_64 enabled=1 gpgcheck=1 repo_gpgcheck=1 gpgkey=https://packages.cloud.google.com/yum/doc/yum-key.gpg https://packages.cloud.google.com/yum/doc/rpm-package-key.gpg EOF
  1. 安装组件:
sudo yum install -y kubelet kubeadm kubectl --disableexcludes=kubernetes
  1. 启动kubelet:
sudo systemctl enable --now kubelet

5. 初始化控制平面

在主节点上执行:

5.1 初始化集群

sudo kubeadm init \ --apiserver-advertise-address=<主节点IP> \ --control-plane-endpoint=<负载均衡IP或域名> \ --pod-network-cidr=10.244.0.0/16 \ --upload-certs \ --kubernetes-version=stable

关键参数说明:

  • --apiserver-advertise-address:API服务器广播地址
  • --control-plane-endpoint:高可用集群端点
  • --pod-network-cidr:Pod网络CIDR,需与后续安装的CNI插件匹配

5.2 配置kubectl

mkdir -p $HOME/.kube sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config sudo chown $(id -u):$(id -g) $HOME/.kube/config

5.3 安装网络插件

以Flannel为例:

kubectl apply -f https://raw.githubusercontent.com/flannel-io/flannel/master/Documentation/kube-flannel.yml

其他可选CNI插件:

  • Calico:适合需要网络策略的场景
  • Cilium:基于eBPF的高性能网络方案
  • Weave Net:简单易用的网络方案

6. 加入工作节点

在每个工作节点上执行kubeadm join命令(初始化输出中会显示):

sudo kubeadm join <控制平面端点>:6443 \ --token <令牌> \ --discovery-token-ca-cert-hash sha256:<哈希值>

如果令牌过期,可在主节点生成新令牌:

kubeadm token create --print-join-command

7. 验证集群状态

在主节点执行以下命令验证集群状态:

  1. 查看节点状态:
kubectl get nodes -o wide
  1. 查看Pod状态:
kubectl get pods -A -o wide
  1. 检查集群健康状况:
kubectl get componentstatuses

8. 集群配置优化

8.1 移除主节点污点

默认情况下,工作负载不会调度到主节点。如需允许调度:

kubectl taint nodes --all node-role.kubernetes.io/control-plane-

8.2 配置自动补全

为bash添加kubectl自动补全:

echo 'source <(kubectl completion bash)' >> ~/.bashrc

8.3 安装Dashboard(可选)

kubectl apply -f https://raw.githubusercontent.com/kubernetes/dashboard/v2.7.0/aio/deploy/recommended.yaml

创建访问令牌:

kubectl create serviceaccount dashboard-admin -n kubernetes-dashboard kubectl create clusterrolebinding dashboard-admin --clusterrole=cluster-admin --serviceaccount=kubernetes-dashboard:dashboard-admin kubectl -n kubernetes-dashboard create token dashboard-admin

9. 常见问题排查

9.1 kubelet无法启动

检查错误日志:

journalctl -xeu kubelet

常见原因:

  • 容器运行时未正确安装
  • 内核参数未正确配置
  • 防火墙阻止通信

9.2 Pod网络异常

检查CNI插件日志:

kubectl logs -n kube-system <cni-pod-name>

常见解决方法:

  • 确认--pod-network-cidr与CNI配置匹配
  • 检查节点间网络连通性
  • 重启kubelet和容器运行时服务

9.3 证书过期问题

查看证书有效期:

kubeadm certs check-expiration

更新证书:

kubeadm certs renew all

10. 生产环境建议

对于生产环境,建议考虑以下增强措施:

  1. 高可用架构:

    • 部署多个控制平面节点
    • 使用外部etcd集群
    • 配置负载均衡器
  2. 安全加固:

    • 启用RBAC
    • 配置网络策略
    • 定期轮换证书
  3. 监控告警:

    • 部署Prometheus + Grafana
    • 配置节点和Pod资源监控
    • 设置关键事件告警
  4. 备份恢复:

    • 定期备份etcd数据
    • 测试集群恢复流程
    • 文档化运维手册
RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进