搭建K8s环境平台规划 架构设计对比
架构类型 优点 缺点 适用场景 单Master节点 部署简单,资源消耗低 存在单点故障风险,扩展性差 测试环境、小规模开发环境 多Master节点 高可用、无单点故障,支持大规模集群 部署复杂,资源消耗高 生产环境、中大型企业级应用
多Master节点核心组件高可用设计
API Server高可用 :通过负载均衡器(如Nginx、HAProxy)暴露VIP,流量分发到多个Master节点的API Server。etcd集群 :部署3/5节点etcd集群,确保数据一致性和高可用。Controller Manager与Scheduler :以 Leader Election
模式运行,同一时间只有一个实例生效服务器硬件配置要求 测试环境(非生产)
节点类型 CPU 内存 硬盘 数量 说明 Master节点 2核 4GB 20GB 1 可运行核心组件(API Server、etcd等) Worker节点 4核 8GB 40GB ≥2 运行业务容器
生产环境(最低要求)
节点类型 CPU 内存 硬盘 数量 说明 Master节点 4核 8GB 100GB ≥3(奇数) 需分离etcd与Master节点(若etcd独立部署) Worker节点 8核 16GB 100GB+ ≥3 根据业务负载动态扩展
搭建K8s集群部署方式-Kubeadm 前置知识点 目前生产部署Kubernetes集群主要有两种方式
Kubeadm vs 二进制部署对比
部署方式 优点 缺点 适用场景 Kubeadm 官方推荐,自动化程度高,适合快速搭建 屏蔽底层细节,定制化能力有限 中小规模集群、快速验证场景 二进制部署 灵活可控,适合深度定制和优化 部署复杂,需手动配置各组件和依赖 生产环境、大规模定制化需求
kubeadm是官方社区推出的一个用于快速部署kubernetes集群的工具,这个工具能通过两条指令完成一个kubernetes集群的部署
创建一个Master节点kubeadm inito
将Node 节点加入到当前集群中kubeadm join <Master节点的IP和端口>
核心特性
自动化生成证书、配置文件及服务单元(systemd)。 支持一键初始化Master节点和加入Worker节点。 默认集成CoreDNS、kube-proxy等核心插件。 环境规划与准备 角色 IP地址 主机名 资源配置 Master 192.168.56.101 k8smaster 4CPU/4GB/20GB+ Node1 192.168.56.102 k8snode1 4CPU/8GB/40GB+ Node2 192.168.56.103 k8snode2 4CPU/8GB/40GB+
系统环境要求
操作系统:CentOS 7.x x86_64 硬件配置:最小配置:2核CPU/2GB内存/30GB硬盘 生产推荐:4核CPU+/8GB内存+/100GB硬盘+ 网络要求:所有节点间网络互通 可访问外网(或已配置本地镜像仓库) 必须配置: 系统初始化配置(所有节点执行) 脚本内容包括:初始化配置、安装Docker、安装Kubernetes组件kubelet、kubeadm、kubectl
sudo ./setup_k8s.sh
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 #!/bin/bash run_cmd () { local cmd="$1 " local success_msg="$2 " local failure_msg="${3:-命令执行失败,请检查。} " echo "正在执行:$cmd " eval "$cmd " 2>/dev/null if [ $? -eq 0 ]; then echo -e "\e[32m成功: $success_msg \e[0m" else echo -e "\e[31m失败: $failure_msg \e[0m" exit 1 fi } run_cmd "systemctl stop firewalld && systemctl disable firewalld" \ "防火墙已成功关闭并禁用。" run_cmd "setenforce 0" "SELinux 已临时禁用。" "临时禁用 SELinux 失败,请检查权限。" run_cmd "sed -i 's/^SELINUX=enforcing$/SELINUX=disabled/' /etc/selinux/config" \ "SELinux 已永久禁用,重启后生效。" "永久禁用 SELinux 失败,请检查权限或配置文件。" run_cmd "swapoff -a" "Swap 已临时关闭。" "临时关闭 Swap 失败,请检查权限。" run_cmd "sed -ri '/swap/s/^/#/' /etc/fstab" \ "Swap 已永久关闭,重启后生效。" "永久关闭 Swap 失败,请检查权限或配置文件。" read -p "请输入当前主机的名称(例如 k8smaster/k8snode1/k8snode2): " hostnameif [ -n "$hostname " ]; then run_cmd "hostnamectl set-hostname $hostname " \ "主机名已设置为: $hostname 需重新建立连接" "设置主机名失败,请检查权限。" else echo -e "\e[33m⚠️ 主机名不能为空,跳过设置。\e[0m" fi cat >> /etc/hosts <<EOF 192.168.56.101 k8smaster 192.168.56.102 k8snode1 192.168.56.103 k8snode2 EOF echo -e "\e[32m成功: 主机解析已添加到 /etc/hosts 文件。\e[0m" run_cmd "cat > /etc/sysctl.d/k8s.conf <<EOF net.bridge.bridge-nf-call-ip6tables = 1 net.bridge.bridge-nf-call-iptables = 1 EOF" "内核模块配置文件已创建。" "创建内核模块配置文件失败,请检查权限。" run_cmd "sysctl --system" "内核参数已生效。" "应用内核参数失败,请检查配置。" run_cmd "curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo" \ "配置 阿里云 YUM源成功。" "配置 阿里云 YUM源失败。" run_cmd "yum install -y chrony" "Chrony安装成功。" "Chrony安装失败。" run_cmd "systemctl enable chronyd && systemctl start chronyd" "Chrony服务启动成功。" "Chrony服务启动失败。" run_cmd "chronyc sources" "时间同步状态验证成功。" "时间同步状态验证失败。" echo -e "\n\e[34m开始安装 Docker...\e[0m" run_cmd "yum install -y yum-utils wget" "已安装 yum-utils wget。" "安装 yum-utils wget失败。" run_cmd "yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo" \ "Docker 源已配置成功。" "配置 Docker 源失败。" run_cmd "yum remove -y docker* containerd.io" "旧版本Docker清理完成。" "旧版本Docker清理失败。" run_cmd "yum install -y docker-ce-20.10.23 docker-ce-cli-20.10.23 containerd.io" \ "Docker 已安装成功。" "安装 Docker 失败,请检查版本是否存在。" run_cmd "mkdir -p /etc/docker" "Docker 配置目录已创建。" "创建目录失败。" run_cmd "cat > /etc/docker/daemon.json <<EOF { \"log-driver\": \"json-file\", \"log-opts\": { \"max-size\": \"100m\", \"max-file\": \"1\" }, \"exec-opts\": [\"native.cgroupdriver=systemd\"], \"registry-mirrors\": [ \"https://x9r52uz5.mirror.aliyuncs.com\", \"https://dockerhub.icu\", \"https://docker.chenby.cn\", \"https://docker.1panel.live\", \"https://docker.awsl9527.cn\", \"https://docker.anyhub.us.kg\", \"https://dhub.kubesre.xyz\" ] } EOF" "Docker 镜像加速配置完成。" "配置镜像加速失败。" run_cmd "systemctl enable docker && systemctl start docker" \ "Docker 服务已启用并启动。" "Docker 服务启动失败。" echo -e "\n\e[34m开始安装 Kubernetes...\e[0m" run_cmd "cat > /etc/yum.repos.d/kubernetes.repo <<EOF [kubernetes] name=Kubernetes baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64 enabled=1 gpgcheck=0 repo_gpgcheck=0 gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg EOF" "Kubernetes 源已配置成功。" "配置 Kubernetes 源失败。" run_cmd "yum install -y kubelet-1.23.9 kubeadm-1.23.9 kubectl-1.23.9" \ "Kubernetes 组件已安装成功。" "安装 Kubernetes 组件失败。" run_cmd "systemctl enable kubelet" "kubelet 服务已启用。" "启用 kubelet 失败。" echo -e "\n\e[32m所有配置已完成,建议重启系统以确保更改生效!\e[0m"
Master节点初始化 初始化控制平面 1 2 3 4 5 6 kubeadm init \ --apiserver-advertise-address=192.168.56.101 \ --image-repository registry.aliyuncs.com/google_containers \ --kubernetes-version v1.23.9 \ --service-cidr=10.96.0.0/12 \ --pod-network-cidr=10.244.0.0/16
由于默认拉取镜像地址k8s.gcr.io国内无法访问,这里指定阿里云镜像仓库地址。
安装好以后会出现以下内容,中文为我手动翻译
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 您的Kubernetes控制平面已成功初始化! 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 或者,如果您是root用户,可以运行: Alternatively, if you are the root user, you can run: export KUBECONFIG=/etc/kubernetes/admin.conf 现在,您应该将pod网络部署到集群。 使用以下列出的选项之一运行“kubectl apply -f [podnetwork].yaml”:https://kubernetes.io/docs/concepts/cluster-administration/addons/ You should now deploy a pod network to the cluster. Run "kubectl apply -f [podnetwork].yaml" with one of the options listed at: https://kubernetes.io/docs/concepts/cluster-administration/addons/ 然后,您可以通过以root身份在每个工作节点上运行以下命令来加入任意数量的工作节点: Then you can join any number of worker nodes by running the following on each as root: kubeadm join 192.168.56.101:6443 --token y99zkx.bh0hvsssdwnexcef \ --discovery-token-ca-cert-hash sha256:2467b7096abe9fcac0b1b39b19ec2d7681e1317c04a0c69c19a7500db2cf4101
配置kubectl 1 2 3 4 5 6 mkdir -p $HOME /.kubesudo cp -i /etc/kubernetes/admin.conf $HOME /.kube/config sudo chown $(id -u):$(id -g) $HOME /.kube/config kubectl get nodes
Worker节点加入集群 获取加入命令 1 2 kubeadm token create --print-join-command
节点加入(Node节点执行) 1 2 kubeadm join 192.168.56.101:6443 --token <token> \ --discovery-token-ca-cert-hash sha256:<hash >
token有时效性,token失效记得重新获取加入命令
CNI网络插件部署 部署Flannel网络 1 2 3 4 5 6 7 8 9 10 11 kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml kubectl get pods -n kube-flannel NAME READY STATUS RESTARTS AGE kube-flannel-ds-bgc4g 1/1 Running 0 66m kube-flannel-ds-dp4z9 1/1 Running 0 66m kube-flannel-ds-mcgnh 1/1 Running 0 66m
如默认镜像地址无法访问,wget下载到本地sed命令修改kube-flannel.yml为docker hub镜像仓库,在应用配置kubectl apply -f kube-flannel.yml
集群功能验证 创建测试应用 1 2 3 4 5 6 7 8 9 10 kubectl create deployment nginx --image=nginx:alpine kubectl expose deployment nginx --port=80 --type =NodePort kubectl get pod,svc -o wide service/nginx NodePort 10.109.142.81 <none> 80:31061/TCP 3m17s app=nginx
访问验证 1 2 3 4 5 6 7 NODE_PORT=$(kubectl get svc nginx -o jsonpath='{.spec.ports[0].nodePort}' ) curl http://192.168.56.101:$NODE_PORT curl http://192.168.56.102:$NODE_PORT curl http://192.168.56.103:$NODE_PORT
关键注意事项 Token有效期管理
1 kubeadm token create --print-join-command
网络插件选择
生产环境建议根据需求选择Calico/Cilium等CNI插件 版本兼容性 确保Docker/Kubernetes/CNI插件版本兼容 节点通信 故障排查
1 2 3 4 journalctl -u kubelet -f kubectl get componentstatus
附录:常用维护命令 功能 命令 查看节点状态 kubectl get nodes -o wide
查看Pod详细信息 kubectl describe pod <pod-name>
查看服务端点 kubectl get endpoints
查看集群事件 kubectl get events --sort-by=.metadata.creationTimestamp
排错节点加入问题 journalctl -u kubelet -f