尧图建网站 尧图建网站 YAOTU WEB BUILD 免费咨询
ARTICLE DETAIL

资讯详情

深耕网站建设与建站编程的一线实战洞察。

手把手教你搭建Kubernetes-v1.32高可用集群

手把手教你搭建Kubernetes-v1.32高可用集群 文章信息适用系统Rocky Linux 10 (Red Quartz)K8s 版本v1.32.0容器运行时containerd网络插件Flannel部署工具kubeadm总节点数9 台3 Master 6 Node目标读者转行小白零基础也能跟着做一、集群架构规划在开始之前先明确你的机器 IP 分配。请确保所有节点处于同一局域网且网络互通。角色主机名IP 地址配置建议Master-1k8s-master110.10.1.102核4GMaster-2k8s-master210.10.1.112核4GMaster-3k8s-master310.10.1.122核4GNode-1k8s-node110.10.1.212核4GNode-2k8s-node210.10.1.222核4GNode-3k8s-node310.10.1.232核4GNode-4k8s-node410.10.1.242核4GNode-5k8s-node510.10.1.252核4GNode-6k8s-node610.10.1.262核4G网段规划不与你的局域网冲突即可Pod 网段172.16.0.0/16Service 网段10.96.0.0/12控制平面端点10.10.1.10:6443使用 Master-1 的 IP 作为统一入口K8s 核心组件仍为 3 节点高可用二、前置说明必看以下所有命令默认使用root用户执行。如果你用普通用户请在每条命令前加sudo。网卡名称Rocky Linux 10 默认网卡可能是ens160、eth0或enp*s*。请先用ip addr命令确认你的网卡名后续用到时请替换。本文所有 “所有节点” 指的是 9 台机器全部要执行“Master 节点” 指 3 台 Master“Node 节点” 指 6 台 Node。建议先通读一遍全文了解整体流程后再动手不要边做边看。三、环境准备所有节点执行3.1 设置主机名分别在对应机器上执行# 在 10.10.1.10 执行hostnamectl set-hostname k8s-master1# 在 10.10.1.11 执行hostnamectl set-hostname k8s-master2# 在 10.10.1.12 执行hostnamectl set-hostname k8s-master3# 在 10.10.1.21 执行hostnamectl set-hostname k8s-node1# 在 10.10.1.22 执行hostnamectl set-hostname k8s-node2# 在 10.10.1.23 执行hostnamectl set-hostname k8s-node3# 在 10.10.1.24 执行hostnamectl set-hostname k8s-node4# 在 10.10.1.25 执行hostnamectl set-hostname k8s-node5# 在 10.10.1.26 执行hostnamectl set-hostname k8s-node63.2 配置 hosts 解析所有节点执行cat/etc/hostsEOF 10.10.1.10 k8s-master1 10.10.1.11 k8s-master2 10.10.1.12 k8s-master3 10.10.1.21 k8s-node1 10.10.1.22 k8s-node2 10.10.1.23 k8s-node3 10.10.1.24 k8s-node4 10.10.1.25 k8s-node5 10.10.1.26 k8s-node6 EOF验证ping-c2k8s-master1ping-c2k8s-node1确保每个节点都能 ping 通其他节点的主机名。3.3 关闭防火墙所有节点执行systemctl stop firewalldsystemctl disable firewalld生产环境建议开放特定端口而非直接关闭但学习环境下直接关闭最省心。3.4 关闭 SELinux所有节点执行setenforce0sed-is/^SELINUXenforcing/SELINUXdisabled//etc/selinux/config3.5 关闭 Swap所有节点执行swapoff-ased-ris/.*swap.*/#//etc/fstabK8s 官方要求关闭 Swap否则 kubelet 无法正常启动。验证 Swap 是否关闭free-h确保Swap行显示为0。3.6 配置内核参数所有节点执行cat/etc/sysctl.d/k8s.confEOF net.ipv4.ip_forward 1 net.bridge.bridge-nf-call-ip6tables 1 net.bridge.bridge-nf-call-iptables 1 EOFmodprobe br_netfiltersysctl--system3.7 配置 IPVS 模块可选但推荐所有节点执行yuminstall-yipvsadm ipsetcat/etc/sysconfig/modules/ipvs.modulesEOF #!/bin/bash modprobe -- ip_vs modprobe -- ip_vs_rr modprobe -- ip_vs_wrr modprobe -- ip_vs_sh modprobe -- nf_conntrack EOFchmod755/etc/sysconfig/modules/ipvs.modulesbash/etc/sysconfig/modules/ipvs.modules lsmod|grep-eip_vs-enf_conntrack能看到ip_vs、ip_vs_rr、nf_conntrack等模块即表示成功。3.8 时间同步所有节点执行timedatectl set-timezone Asia/Shanghai yuminstall-ychrony systemctlenable--nowchronyd chronyc sources四、安装容器运行时 Containerd所有节点执行K8s v1.32 不再支持 Dockerdockershim 已移除我们使用containerd作为容器运行时。4.1 添加 Docker CE 软件源包含 containerdyuminstall-yyum-utils yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo4.2 安装 containerdyuminstall-ycontainerd.io4.3 配置 containerdmkdir-p/etc/containerd containerd config default/etc/containerd/config.toml修改关键配置# 1. 使用 systemd 作为 cgroup driverK8s 官方强烈推荐sed-is/SystemdCgroup false/SystemdCgroup true//etc/containerd/config.toml# 2. 修改默认的 pause 镜像为国内阿里云镜像防止拉取失败sed-is|sandbox_image registry.k8s.io/pause:.*|sandbox_image registry.aliyuncs.com/google_containers/pause:3.10|/etc/containerd/config.toml4.4 启动 containerdsystemctl restart containerd systemctlenablecontainerd验证ctr version systemctl status containerd看到active (running)即正常。五、安装 Kubernetes 组件所有节点执行5.1 添加阿里云 K8s 软件源cat/etc/yum.repos.d/kubernetes.repoEOF [kubernetes] nameKubernetes baseurlhttps://mirrors.aliyun.com/kubernetes-new/core/stable/v1.32/rpm/ enabled1 gpgcheck1 gpgkeyhttps://mirrors.aliyun.com/kubernetes-new/core/stable/v1.32/rpm/repodata/repomd.xml.key EOF5.2 安装 kubelet、kubeadm、kubectlyuminstall-ykubelet-1.32.0 kubeadm-1.32.0 kubectl-1.32.0这里指定了1.32.0版本确保集群版本统一。如果你想安装更新的补丁版本如1.32.1可以修改版本号。5.3 设置 kubelet 开机自启systemctlenablekubelet此时 kubelet 会处于不断重启的状态这是正常的因为集群尚未初始化等待 kubeadm 初始化后会自动恢复正常。六、提前拉取 K8s 镜像所有节点执行⭐ 关键防坑步骤这是最重要的一步国内直接拉取registry.k8s.io的镜像会失败我们使用阿里云镜像源提前拉取所有需要的镜像确保后续初始化不会因为网络问题报错。6.1 查看需要哪些镜像kubeadm config images list --kubernetes-versionv1.32.0 --image-repositoryregistry.aliyuncs.com/google_containers6.2 一键拉取所有镜像kubeadm config images pull\--kubernetes-versionv1.32.0\--image-repositoryregistry.aliyuncs.com/google_containers\--cri-socketunix:///run/containerd/containerd.sock耐心等待拉取完成看到类似done的提示即表示成功。验证镜像是否拉取成功ctr-nk8s.io images list|grepregistry.aliyuncs.com应该能看到kube-apiserver、kube-controller-manager、kube-scheduler、kube-proxy、pause、etcd、coredns等镜像。七、初始化第一个 Master 节点仅在 Master-1: 10.10.1.10 执行7.1 生成 kubeadm 初始化配置文件使用配置文件初始化比命令行参数更清晰、更可控。cat/root/kubeadm-config.yamlEOF apiVersion: kubeadm.k8s.io/v1beta3 kind: ClusterConfiguration kubernetesVersion: v1.32.0 controlPlaneEndpoint: 10.10.1.10:6443 networking: podSubnet: 172.16.0.0/16 serviceSubnet: 10.96.0.0/12 imageRepository: registry.aliyuncs.com/google_containers --- apiVersion: kubelet.config.k8s.io/v1beta1 kind: KubeletConfiguration cgroupDriver: systemd EOF7.2 执行初始化kubeadm init--config/root/kubeadm-config.yaml --upload-certs参数说明controlPlaneEndpoint: 控制平面端点后续所有节点都通过这个地址加入集群podSubnet: Pod 网段与后续 Flannel 配置保持一致serviceSubnet: Service 网段imageRepository: 使用阿里云镜像源--upload-certs: 将证书上传到集群中方便其他 Master 节点加入初始化过程大约需要 1-3 分钟请耐心等待。7.3 初始化成功后的关键输出如果看到以下信息表示初始化成功Your Kubernetes control-plane has initialized successfully! To start using your cluster, you need to run the following as a regular user: mkdir -p $HOME/.kube sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config sudo chown $(id -u):$(id -g) $HOME/.kube/config ... You can now join any number of the control-plane node running the following command on each as root: kubeadm join 10.10.1.10:6443 --token xxxxxx \ --discovery-token-ca-cert-hash sha256:xxxxxx \ --control-plane --certificate-key xxxxxx ... Then you can join any number of worker nodes by running the following on each as root: kubeadm join 10.10.1.10:6443 --token xxxxxx \ --discovery-token-ca-cert-hash sha256:xxxxxx请务必保存好这些输出建议复制粘贴保存到本地文本文件中后续步骤需要用到。7.4 配置 kubectl在 Master-1 上执行mkdir-p$HOME/.kubecp-i/etc/kubernetes/admin.conf$HOME/.kube/configchown$(id-u):$(id-g)$HOME/.kube/config7.5 验证 Master-1 状态kubectl get nodes此时应该能看到k8s-master1节点状态为NotReady因为还没有安装网络插件这是正常的。八、其他 Master 节点加入控制平面Master-2、Master-3 执行8.1 提前拉取镜像在 Master-2 (10.10.1.11) 和 Master-3 (10.10.1.12) 上执行kubeadm config images pull\--kubernetes-versionv1.32.0\--image-repositoryregistry.aliyuncs.com/google_containers\--cri-socketunix:///run/containerd/containerd.sock8.2 加入控制平面在 Master-2 和 Master-3 上执行使用 Master-1 初始化成功时输出的控制平面加入命令kubeadmjoin10.10.1.10:6443--tokentoken\--discovery-token-ca-cert-hash sha256:hash\--control-plane --certificate-keycertificate-key\--cri-socketunix:///run/containerd/containerd.sock将token、hash、certificate-key替换为你在 Master-1 初始化成功后保存的实际值。加入成功后在每个新 Master 上执行mkdir-p$HOME/.kubecp-i/etc/kubernetes/admin.conf$HOME/.kube/configchown$(id-u):$(id-g)$HOME/.kube/config8.3 验证 Master 节点在任意 Master 上执行kubectl get nodes此时应该能看到 3 个 Master 节点状态都是NotReady。九、Node 节点加入集群Node-1 到 Node-6 执行9.1 提前拉取镜像在所有 Node 节点上执行kubeadm config images pull\--kubernetes-versionv1.32.0\--image-repositoryregistry.aliyuncs.com/google_containers\--cri-socketunix:///run/containerd/containerd.sockNode 节点只需要kube-proxy和pause镜像拉取会很快。9.2 加入集群在所有 Node 节点上执行使用 Master-1 初始化成功时输出的Node 加入命令kubeadmjoin10.10.1.10:6443--tokentoken\--discovery-token-ca-cert-hash sha256:hash\--cri-socketunix:///run/containerd/containerd.sock将token和hash替换为实际值。9.3 验证所有节点在任意 Master 上执行kubectl get nodes此时应该能看到 9 个节点3 个 Master 6 个 Node状态都是NotReady。接下来安装网络插件。十、安装 Flannel 网络插件在任意 Master 执行10.1 下载 Flannel 配置文件wgethttps://raw.githubusercontent.com/flannel-io/flannel/master/Documentation/kube-flannel.yml-O/root/kube-flannel.yml如果下载失败国内访问 GitHub 不稳定可以使用以下备用命令从国内镜像站下载wgethttps://ghproxy.com/https://raw.githubusercontent.com/flannel-io/flannel/master/Documentation/kube-flannel.yml-O/root/kube-flannel.yml10.2 修改 Pod 网段如果与你规划的不一致打开文件检查net-conf.json部分的Network字段grep-A5net-conf.json/root/kube-flannel.yml确保它是Network: 172.16.0.0/16与你初始化时配置的podSubnet一致。如果不一致修改它sed-is|Network: .*|Network: 172.16.0.0/16|/root/kube-flannel.yml10.3 修改 Flannel 镜像为国内源关键Flannel 默认使用docker.io/flannel/flannel镜像国内拉取可能失败。我们替换为阿里云镜像sed-is|docker.io/flannel/flannel|registry.cn-hangzhou.aliyuncs.com/google_containers/flannel|g/root/kube-flannel.ymlsed-is|docker.io/flannel/flannel-cni-plugin|registry.cn-hangzhou.aliyuncs.com/google_containers/flannel-cni-plugin|g/root/kube-flannel.yml如果阿里云没有该镜像也可以尝试docker.mirrors.sjtug.sjtu.edu.cn或docker.m.daocloud.io等国内镜像加速。10.4 应用 Flannel 配置kubectl apply-f/root/kube-flannel.yml10.5 验证 Flannel 是否正常运行kubectl get pods-nkube-flannel等待所有 Pod 状态变为Running这可能需要 1-2 分钟。十一、验证集群状态在任意 Master 执行11.1 查看节点状态kubectl get nodes所有 9 个节点状态应该都变为Ready。如果还有NotReady请等待 1-2 分钟后再次查看。11.2 查看核心组件状态kubectl get pods-nkube-system你应该能看到以下 Pod 全部处于Running状态kube-apiserver-*3 个分别在 3 个 Masterkube-controller-manager-*3 个kube-scheduler-*3 个etcd-*3 个kube-proxy-*9 个每个节点一个coredns-*2 个11.3 查看集群信息kubectl cluster-info输出示例Kubernetes control plane is running at https://10.10.1.10:6443 CoreDNS is running at https://10.10.1.10:6443/api/v1/namespaces/kube-system/services/kube-dns:dns/proxy11.4 测试 DNS 解析kubectl run test-dns--imagebusybox:1.36--restartNever--rm-it--nslookupkubernetes.default如果能解析出kubernetes.default.svc.cluster.local的 IP如10.96.0.1说明 CoreDNS 正常工作。11.5 测试 Pod 网络互通创建一个测试 Podkubectl run test-pod--imagebusybox:1.36--restartNever--rm-it-- /bin/sh在 Pod 内部 ping 另一个节点的 Pod IP确保跨节点网络互通。十二、配置 kubectl 自动补全可选推荐在 Master 节点执行yuminstall-ybash-completionsource/usr/share/bash-completion/bash_completionechosource (kubectl completion bash)~/.bashrcsource~/.bashrc配置完成后输入kubectl get no后按Tab键可以自动补全。十三、常见问题排查收藏备用13.1 节点一直处于 NotReady 状态排查步骤# 查看节点详细事件kubectl describenode节点名# 查看 kubelet 日志journalctl-ukubelet-f# 查看节点上 kubelet 状态systemctl status kubelet常见原因网络插件未安装或安装失败containerd 未正常运行kubelet 配置错误13.2 Pod 一直处于 Pending 状态kubectl describe podpod-name-nnamespace常见原因节点资源不足、镜像拉取失败、没有合适的节点调度。13.3 镜像拉取失败ImagePullBackOff# 查看具体错误kubectl describe podpod-name-nnamespace# 手动在节点上拉取镜像测试ctr-nk8s.io images pull镜像地址解决方案检查镜像地址是否正确替换为国内镜像源检查节点是否能访问外网13.4 kubeadm join 失败token 过期Token 默认有效期为 24 小时。如果过期了在 Master 上重新生成# 生成新的 join 命令kubeadm token create --print-join-command13.5 重置节点如果初始化失败需要重来在需要重置的节点上执行kubeadm reset-frm-rf/etc/cni/net.drm-rf$HOME/.kube/config iptables-Fiptables-tnat-Fiptables-tmangle-Fiptables-Xipvsadm--clearsystemctl restart kubelet重置后该节点可以重新执行kubeadm join加入集群。13.6 containerd 镜像拉取失败检查 containerd 配置cat/etc/containerd/config.toml|grepsandbox_image确保sandbox_image指向的是国内镜像地址。重启 containerdsystemctl restart containerd十四、集群维护常用命令# 查看所有节点kubectl get nodes-owide# 查看所有命名空间下的 Podkubectl get pods-A-owide# 查看集群事件kubectl get events --sort-by.lastTimestamp# 查看节点资源使用情况kubectltopnodes# 查看 Pod 资源使用情况kubectltoppods-nkube-system# 查看集群组件状态kubectl get cs# 查看集群版本kubectl version# 查看集群节点标签kubectl get nodes --show-labels# 给节点打标签kubectl label nodes k8s-node1disktypessd# 驱逐节点上的 Pod维护时使用kubectl drain k8s-node1 --ignore-daemonsets --delete-emptydir-data# 恢复节点调度kubectl uncordon k8s-node1十五、总结恭喜你如果你一步一步跟着做到了这里你的Kubernetes v1.32 高可用集群已经成功运行在Rocky Linux 10上了本文核心要点回顾步骤关键操作环境准备关闭防火墙、SELinux、Swap配置内核参数容器运行时安装 containerd配置 systemd cgroup替换 pause 镜像为国内源K8s 组件使用阿里云 yum 源安装 kubelet、kubeadm、kubectl镜像预拉使用registry.aliyuncs.com/google_containers提前拉取所有镜像避免网络问题初始化使用 kubeadm 配置文件初始化指定国内镜像源和 Pod/Service 网段网络插件安装 Flannel修改镜像为国内源确保跨节点网络互通排查遇到问题先看kubectl describe和journalctl -u kubelet后续学习建议部署一个 Nginx 应用测试kubectl create deployment nginx--imagenginx:alpine--replicas3kubectl expose deployment nginx--port80--typeNodePort kubectl get svc nginx然后通过http://任意节点IP:NodePort访问。学习 Helm 包管理器简化应用部署。配置 Metrics Server实现kubectl top资源监控。学习 Ingress替代 NodePort 暴露服务。如果本文对你有帮助欢迎点赞、收藏、转发有问题欢迎在评论区留言我会第一时间回复。
返回列表