Kubernetes 系列【3】使用 kubeadm 创建 K8s 集群

发布时间:2026/7/5 14:35:30
Kubernetes 系列【3】使用 kubeadm 创建 K8s 集群 文章目录1. 前言2. 基于 Kubeadm 部署2.1 环境准备2.1.1 基础要求2.1.2 配置主机名2.1.3 关闭 swap2.1.4 加载内核模块2.1.5 配置内核参数2.1.6 安装基础工具2.1.7 关闭防火墙或开放端口2.2 安装 Docker2.2.1 添加 Docker 官方源2.2.2 安装 Docker CE2.2.3 配置 Docker2.2.4 安装 cri-dockerd2.3 安装 kubeadm/kubelet/kubectl2.3.1 添加 Kubernetes apt 源2.3.2 安装 Kubernetes 组件2.4 初始化 Master2.4.1 预拉取 Kubernetes 镜像2.4.2 初始化集群2.4.3 配置 kubectl2.4.4 安装 Calico 网络插件2.5 Worker 加入集群2.6 验证集群2.6.1 查看节点状态2.6.2 查看系统组件2.6.3 创建测试应用2.6.4 常用排查命令3. 安装 Kuboard 可选3.1 部署说明3.2 单机 Docker 部署3.2.1 启动 Kuboard 容器3.2.2 查看 Kuboard 状态3.2.3 访问 Kuboard3.3 添加集群3.3.1 使用 Kuboard-Agent 添加集群4. 总结部署目标在3台Ubuntu Server 24.04服务器上使用kubeadm部署1个Master节点和2个Worker节点的Kubernetes集群并使用Docker单机模式部署Kuboard管理界面。1. 前言Kubernetes集群常见部署方式主要有两类kubeadm部署和二进制部署。kubeadm是Kubernetes官方提供的集群初始化工具可以帮助我们完成控制平面初始化、证书生成、核心组件配置、Worker节点加入集群等操作。它的优点是部署流程标准、维护成本低、社区资料丰富适合测试环境、学习环境以及中小规模生产环境。二进制部署是指手动下载并配置kube-apiserver、kube-controller-manager、kube-scheduler、kubelet、kube-proxy、etcd等组件。二进制部署的优点是可控性强适合对证书、参数、高可用架构有深度定制需求的场景缺点是步骤复杂、排障成本高对Kubernetes组件原理要求更高。核心特性对比表对比维度kubeadm部署二进制部署部署难度低自动化流程极高全手动配置自定义能力有限仅少量参数可修改完全自由所有组件可深度调优组件运行形态容器静态Pod宿主机系统进程证书管理自动生成默认1年有效期自主生成、自定义有效期、加密算法集群升级官方工具一键升级手动逐个更新组件学习成本低屏蔽底层细节高吃透全部控制平面组件原理典型使用场景测试环境、中小规模标准生产集群大型集群、金融合规、边缘定制、底层原理学习本文选择使用kubeadm部署Kubernetes集群整体架构如下节点示例主机名示例内网 IP角色Masterk8s-master172.17.172.87控制平面节点Worker 1k8s-worker1172.17.172.89工作节点Worker 2k8s-worker2172.17.172.90工作节点本文使用组件版本组件版本 / 说明操作系统Ubuntu Server 24.04Kubernetesv1.32.x容器运行时Docker CE cri-dockerd网络插件CalicoPod 网段100.64.0.0/10Service 网段10.96.0.0/12管理面板Kuboard v3注意文中的IP只是示例请根据自己的服务器实际内网IP修改。2. 基于 Kubeadm 部署kubeadm是CNCF官方原生集群引导工具用来快速搭建符合标准的纯净版Kubernetes集群替代二进制手动部署只负责集群初始化、节点接入、版本升级、证书管理不管理操作系统、不安装网络插件、监控等附加组件。2.1 环境准备以下操作除特别说明外三台服务器都需要执行。2.1.1 基础要求项目要求CPU至少 2 核内存至少 2 GB建议 4 GB 以上磁盘至少 20 GB网络三台服务器内网互通用户root 用户或具备 sudo 权限的用户如果使用云服务器需要确保三台机器在同一个内网环境或者内网IP之间可以互相访问。2.1.2 配置主机名Master节点执行hostnamectl set-hostname k8s-masterWorker 1节点执行hostnamectl set-hostname k8s-worker1Worker 2节点执行hostnamectl set-hostname k8s-worker2三台服务器都配置 hostscat/etc/hostsEOF 172.17.172.87 k8s-master 172.17.172.89 k8s-worker1 172.17.172.90 k8s-worker2 EOF验证ping-c2k8s-masterping-c2k8s-worker1ping-c2k8s-worker22.1.3 关闭 swapKubernetes要求关闭swap。swapoff-ased-i/ swap / s/^/#//etc/fstab验证free-h如果Swap一行显示为0B说明swap已关闭。2.1.4 加载内核模块cat/etc/modules-load.d/k8s.confEOF overlay br_netfilter EOFmodprobe overlay modprobe br_netfilter验证lsmod|grepoverlay lsmod|grepbr_netfilter2.1.5 配置内核参数cat/etc/sysctl.d/k8s.confEOF net.bridge.bridge-nf-call-iptables 1 net.bridge.bridge-nf-call-ip6tables 1 net.ipv4.ip_forward 1 EOFsysctl--system验证sysctlnet.ipv4.ip_forwardsysctlnet.bridge.bridge-nf-call-iptables预期输出net.ipv4.ip_forward 1 net.bridge.bridge-nf-call-iptables 12.1.6 安装基础工具apt-getupdateapt-getinstall-yapt-transport-https ca-certificatescurlgpg lsb-releasewgetvim2.1.7 关闭防火墙或开放端口如果是测试环境可以直接关闭Ubuntu默认防火墙systemctl stop ufw systemctl disable ufw如果是生产环境建议按端口精确放行。Master节点需要放行端口协议用途6443TCPKubernetes API Server2379-2380TCPetcd10250TCPkubelet10257TCPkube-controller-manager10259TCPkube-scheduler30000-32767TCPNodePort 服务Worker节点需要放行端口协议用途10250TCPkubelet30000-32767TCPNodePort 服务Calico网络插件可能需要端口协议用途179TCPCalico BGP 模式4789UDPCalico VXLAN 模式2.2 安装 Docker以下操作三台服务器都执行。2.2.1 添加 Docker 官方源install-m0755-d/etc/apt/keyringscurl-fsSLhttps://download.docker.com/linux/ubuntu/gpg-o/etc/apt/keyrings/docker.ascchmodar /etc/apt/keyrings/docker.asccat/etc/apt/sources.list.d/docker.listEOF deb [arch$(dpkg --print-architecture)signed-by/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/ubuntu noble stable EOFapt-getupdate如果服务器访问Docker官方源较慢可以替换为可用的国内Docker apt镜像源。2.2.2 安装 Docker CEapt-getinstall-ydocker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin2.2.3 配置 DockerKubernetes推荐Docker使用systemd作为cgroup driver。mkdir-p/etc/dockercat/etc/docker/daemon.jsonEOF { exec-opts: [native.cgroupdriversystemd], registry-mirrors: [https://docker.m.daocloud.io], log-driver: json-file, log-opts: { max-size: 100m } } EOFsystemctl daemon-reload systemctlenabledocker--nowsystemctl restartdocker验证Dockerdockerversiondockerinfo|grep-iCgroup Driver预期输出包含Cgroup Driver: systemd2.2.4 安装 cri-dockerdKubernetes从1.24开始移除了内置的dockershim。如果继续使用Docker作为容器运行时需要额外安装cri-dockerd。查看服务器架构uname-m常见架构对应关系uname -m 输出cri-dockerd 包架构x86_64amd64aarch64arm64以cri-dockerd 0.3.16为例x86_64服务器执行cd/tmpwgethttps://github.com/Mirantis/cri-dockerd/releases/download/v0.3.16/cri-dockerd-0.3.16.amd64.tgztar-xzfcri-dockerd-0.3.16.amd64.tgzinstall-m0755 cri-dockerd/cri-dockerd /usr/local/bin/cri-dockerdARM64服务器执行cd/tmpwgethttps://github.com/Mirantis/cri-dockerd/releases/download/v0.3.16/cri-dockerd-0.3.16.arm64.tgztar-xzfcri-dockerd-0.3.16.arm64.tgzinstall-m0755 cri-dockerd/cri-dockerd /usr/local/bin/cri-dockerd创建systemd服务cat/etc/systemd/system/cri-docker.serviceEOF [Unit] DescriptionCRI Interface for Docker Application Container Engine Documentationhttps://docs.mirantis.com Afternetwork-online.target docker.service Wantsnetwork-online.target Requirescri-docker.socket [Service] Typenotify ExecStart/usr/local/bin/cri-dockerd --container-runtime-endpoint fd:// --pod-infra-container-imageregistry.aliyuncs.com/google_containers/pause:3.10 ExecReload/bin/kill -s HUP $MAINPID TimeoutSec0 RestartSec2 Restartalways LimitNOFILEinfinity LimitNPROCinfinity LimitCOREinfinity TasksMaxinfinity Delegateyes KillModeprocess [Install] WantedBymulti-user.target EOFcat/etc/systemd/system/cri-docker.socketEOF [Unit] DescriptionCRI Docker Socket for the API PartOfcri-docker.service [Socket] ListenStream/var/run/cri-dockerd.sock SocketMode0660 SocketUserroot SocketGroupdocker [Install] WantedBysockets.target EOFsystemctl daemon-reload systemctlenable--nowcri-docker.socket systemctlenable--nowcri-docker.service验证cri-dockerdsystemctl status cri-docker.service --no-pager cri-dockerd--version2.3 安装 kubeadm/kubelet/kubectl以下操作三台服务器都执行。kubeadm仅仅是集群初始化工具它生成静态Pod清单后必须依靠本机常驻进程kubelet来启动控制平面容器而kubectl是客户端工具用来操作和管理集。2.3.1 添加 Kubernetes apt 源本文使用Kubernetes v1.32。mkdir-p/etc/apt/keyringscurl-fsSLhttps://pkgs.k8s.io/core:/stable:/v1.32/deb/Release.key\|gpg--dearmor-o/etc/apt/keyrings/kubernetes-apt-keyring.gpgcat/etc/apt/sources.list.d/kubernetes.listEOF deb [signed-by/etc/apt/keyrings/kubernetes-apt-keyring.gpg] https://pkgs.k8s.io/core:/stable:/v1.32/deb/ / EOFapt-getupdate2.3.2 安装 Kubernetes 组件apt-getinstall-ykubelet kubeadm kubectl apt-mark hold kubelet kubeadm kubectl systemctlenablekubelet验证版本kubeadm version kubelet--versionkubectl version--client此时kubelet可能不是Running状态这是正常的。等Master初始化或Worker加入集群后kubelet会正常工作。2.4 初始化 Master以下操作只在Master节点执行。2.4.1 预拉取 Kubernetes 镜像kubeadm config images pull\--kubernetes-versionv1.32.0\--image-repositoryregistry.aliyuncs.com/google_containers\--cri-socketunix:///var/run/cri-dockerd.sock2.4.2 初始化集群将172.17.172.87替换为你的Master内网IP。kubeadm init\--apiserver-advertise-address172.17.172.87\--pod-network-cidr100.64.0.0/10\--kubernetes-versionv1.32.0\--image-repositoryregistry.aliyuncs.com/google_containers\--cri-socketunix:///var/run/cri-dockerd.sock初始化成功后会看到类似输出kubeadmjoin172.17.172.87:6443--tokentoken\--discovery-token-ca-cert-hash sha256:hash请保存这段kubeadm join命令后面Worker节点加入集群需要使用。2.4.3 配置 kubectlroot用户执行mkdir-p$HOME/.kubecp-i/etc/kubernetes/admin.conf$HOME/.kube/configchown$(id-u):$(id-g)$HOME/.kube/config验证kubectl get nodes此时Master可能显示NotReady这是因为还没有安装网络插件。2.4.4 安装 Calico 网络插件下载Calico manifestcurl-Ohttps://raw.githubusercontent.com/projectcalico/calico/v3.29.1/manifests/calico.yaml由于本文初始化集群时使用的Pod网段是100.64.0.0/10需要确认Calico的CALICO_IPV4POOL_CIDR与该网段一致。如果calico.yaml中存在CALICO_IPV4POOL_CIDR可以这样替换sed-is#192.168.0.0/16#100.64.0.0/10#gcalico.yaml应用Calicokubectl apply-fcalico.yaml查看系统Pod状态kubectl get pods-nkube-system-w等calico-node、calico-kube-controllers等组件变为Running后再查看节点状态kubectl get nodes-owide2.5 Worker 加入集群以下操作在两台Worker节点分别执行。使用Master初始化时输出的kubeadm join命令并追加--cri-socket参数kubeadmjoin172.17.172.87:6443--tokentoken\--discovery-token-ca-cert-hash sha256:hash\--cri-socketunix:///var/run/cri-dockerd.sock如果忘记保存join命令可以在Master节点重新生成kubeadm token create --print-join-command然后把输出命令复制到Worker节点执行并追加--cri-socketunix:///var/run/cri-dockerd.sockWorker加入成功后在Master节点查看kubectl get nodes-owide2.6 验证集群以下操作在Master节点执行。2.6.1 查看节点状态kubectl get nodes-owide预期结果NAME STATUS ROLES AGE VERSION k8s-master Ready control-plane 10m v1.32.x k8s-worker1 Ready none 5m v1.32.x k8s-worker2 Ready none 5m v1.32.x2.6.2 查看系统组件kubectl get pods-A重点确认以下组件为Runningkube-apiserverkube-controller-managerkube-scheduleretcdkube-proxycalico-nodecalico-kube-controllers2.6.3 创建测试应用创建nginx Deploymentkubectl create deployment nginx--imagenginx:1.25暴露NodePort服务kubectl expose deployment nginx--port80--typeNodePort查看Pod和Servicekubectl get pod-owide kubectl get svc nginx输出示例NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) nginx NodePort 10.96.xxx.xxx none 80:30xxx/TCP浏览器或命令行访问任意节点的NodePortcurlhttp://172.17.172.87:30xxxcurlhttp://172.17.172.89:30xxxcurlhttp://172.17.172.90:30xxx测试完成后清理kubectl delete svc nginx kubectl delete deployment nginx2.6.4 常用排查命令kubectl get nodes kubectl get pods-Akubectl describenodenode-namekubectl describe podpod-name-nnamespacejournalctl-ukubelet-fjournalctl-udocker-fjournalctl-ucri-docker-f如果需要重置节点kubeadm reset-f--cri-socketunix:///var/run/cri-dockerd.sockrm-rf/etc/cni/net.d /var/lib/kubelet /var/lib/etcd$HOME/.kube3. 安装 Kuboard 可选3.1 部署说明Kuboard是Kubernetes的图形化管理工具可以通过Web页面查看和管理集群资源包括Namespace、Deployment、Service、Pod、ConfigMap、Secret、日志、终端等。Kuboard常见部署方式如下部署方式说明适用场景Docker 单机部署Kuboard 运行在某台服务器的 Docker 容器中集群内通过 Agent 接入简单、稳定、适合学习和中小环境Kubernetes 内部署Kuboard 作为工作负载运行在 Kubernetes 集群中希望所有组件都由 Kubernetes 管理Kuboard-Spray通过图形化方式安装和维护 Kubernetes 集群希望使用 Web 页面管理集群生命周期本文使用Docker单机部署方式Kuboard容器运行在Master宿主机上。Kuboard不部署到Kubernetes集群内部。Kubernetes集群通过Kuboard-Agent接入Kuboard。Agent通过Master内网IP访问Kuboard。本文端口规划端口用途38000Kuboard Web 页面访问端口38001Kuboard-Agent 回连端口如果使用云服务器需要在安全组中放行38000。38001建议仅允许集群内网访问。3.2 单机 Docker 部署以下操作在Master节点执行。3.2.1 启动 Kuboard 容器将172.17.172.87替换为Master内网IP。dockerpull swr.cn-east-2.myhuaweicloud.com/kuboard/kuboard:v3mkdir-p/root/kuboard-datadockerrun-d\--restartunless-stopped\--privileged\--namekuboard\-p38000:80/tcp\-p38001:10081/tcp\-eKUBOARD_ENDPOINThttp://172.17.172.87:58094\-eKUBOARD_AGENT_SERVER_TCP_PORT58099\-v/root/kuboard-data:/data\swr.cn-east-2.myhuaweicloud.com/kuboard/kuboard:v3参数说明参数说明-p 38000:80浏览器访问 Kuboard Web 页面-p 38001:10081Kuboard-Agent 回连 KuboardKUBOARD_ENDPOINTAgent 访问 Kuboard 的地址必须使用集群内可达 IPKUBOARD_AGENT_SERVER_TCP_PORTAgent 回连端口需要与宿主机映射端口一致/root/kuboard-data:/dataKuboard 数据持久化目录注意KUBOARD_ENDPOINT不要写成127.0.0.1或localhost否则集群内的Agent无法访问Kuboard。3.2.2 查看 Kuboard 状态dockerps--filternamekuboarddockerlogs-fkuboard容器状态为Up即表示启动成功。3.2.3 访问 Kuboard浏览器访问http://Master公网IP:38000默认账号密码项目值用户名admin密码Kuboard123首次登录后建议立即修改默认密码。3.3 添加集群Kuboard启动后需要将Kubernetes集群添加到Kuboard。3.3.1 使用 Kuboard-Agent 添加集群操作步骤登录Kuboard。点击「添加集群」。选择「Kuboard-Agent」方式。填写集群名称例如ubuntu24-k8s。Kuboard页面会生成一段kubectl apply命令。复制该命令在Master节点执行。执行完成后查看Agent Podkubectl get pods-nkuboard等待Agent相关Pod变为Running后Kuboard页面中的集群状态会变为正常。4. 总结本文完成了Ubuntu Server 24.04环境下一主两从Kubernetes集群的部署主要步骤包括初始化三台服务器环境。安装Docker和cri-dockerd。安装kubeadm、kubelet、kubectl。使用kubeadm初始化Master。安装Calico网络插件。将两个Worker节点加入集群。验证Kubernetes集群状态。使用Docker单机模式部署Kuboard。通过Kuboard-Agent添加Kubernetes集群。对于学习、测试和中小规模集群来说kubeadm Docker cri-dockerd Calico Kuboard是一套比较容易理解和维护的部署方案。生产环境中还需要进一步考虑高可用Master、etcd备份、镜像仓库、监控告警、日志采集、证书轮换和安全加固等内容。