《梳理Kubernetes基础环境:通过kubeadm完成集群初始化》

📅 发布时间:2026/7/16 15:56:15
《梳理Kubernetes基础环境:通过kubeadm完成集群初始化》 前言很多人学Kubernetes时真正劝退自己的不是概念本身而是第一套环境迟迟跑不起来。防火墙没关、swap没处理、containerd配置不对、网络插件没装好任何一个小问题都可能让节点一直停在NotReady。K8s确实不适合只靠背概念入门。Pod、Deployment、Service、Node、Namespace这些词如果只看定义很容易越看越抽象。更有效的方式是先搭出一个能工作的集群再部署一个最简单的应用看到它能被访问后面的理解才会有落点。本文会从CentOS 7环境开始按Master节点和Worker节点两部分梳理Kubernetes基础环境。包括关闭防火墙和SELinux、关闭swap、加载内核模块、配置sysctl参数、安装containerd、安装kubeadm、kubelet和kubectl并通过kubeadm完成集群初始化。集群跑通以后再继续安装Flannel网络插件验证节点和系统Pod状态并让Worker节点通过kubeadm join加入集群。后面还会补充常用kubectl命令帮助你查看节点、Pod、Service、日志和容器状态。最后会部署一个简单的echoserver应用通过NodePort暴露服务并使用 cpolar 把本地K8s节点端口映射到公网。这样你不只是在终端里看到Running而是真的能在外部浏览器打开自己部署的K8s应用。1.什么是Kubernetes?Kubernetes常缩写为K8s读作 “kay-tayz” 或 “kube”是一个开源的容器编排平台用于自动化部署、扩展和管理容器化应用程序。想象你有一个用Docker打包的应用现在要把它运行在多台服务器上并且做到自动启动和停止容器某个容器挂了自动重启它流量暴增自动加机器扩容平滑更新版本不中断服务统一管理网络、存储、配置、密钥这些事手动做极其繁琐而Kubernetes就是干这个的——它把一群机器抽象成一个“超级计算机”你只需告诉它“我要运行什么”它就负责搞定一切细节。概念作用Pod最小调度单位一个或多个容器的组合通常一个 Pod 一个应用实例Deployment定义应用的期望状态比如“始终运行 3 个副本”K8s 自动维持Service为Pod提供稳定网络访问入口即使Pod重启IP变了也能访问Ingress管理外部HTTP/HTTPS流量如何进入集群类似反向代理Namespace集群内的“虚拟分区”用于隔离不同项目或团队kubectl官方命令行工具用来和Kubernetes集群交互谁在用Kubernetes几乎所有主流云厂商AWS EKS、Google GKE、Azure AKS大型企业Netflix、Spotify、华为、阿里、字节跳动开源项目Prometheus、Istio、Argo CD等都深度集成K8s为什么它如此重要标准化无论底层是物理机、虚拟机还是云K8s提供统一接口弹性伸缩秒级扩缩容应对流量高峰高可用自动故障恢复保障服务不中断生态强大CNCF云原生计算基金会旗下有上千个兼容工具如果你刚入门别被术语吓退——从一个Pod开始你也能驾驭这个强大的系统。2.前置知识与环境准备先掌握以下3个核心概念避免后续操作迷茫PodKubernetes的最小部署单元可包含一个或多个容器这些容器共享网络和存储资源Node运行Pod的服务器可以是物理机或虚拟机分为Master节点控制节点负责集群管理和Worker节点工作节点负责运行应用负载Controller控制器用于管理Pod的生命周期。例如Deployment是一种常见的Controller能确保指定数量的Pod副本始终处于运行状态。环境要求:角色配置建议系统要求Master节点2核2G以上1台CentOS764位Worker节点2核2G以上至少1台推荐2台同上网络所有节点互通禁用防火墙/SELinux–基础环境准备Master和Worker都操作:# 1. 关闭防火墙systemctl stop firewalldsystemctl disable firewalld# 2. 关闭SELinuxsetenforce0sed-is/^SELINUXenforcing$/SELINUXdisabled//etc/selinux/config# 3. 关闭swapK8s强制要求swapoff-ased-i/swap/s/^/#//etc/fstab# 4. 配置主机名Master节点示例Worker节点改名称hostnamectl set-hostname k8s-master# 5. 配置 hosts可选但推荐echo192.168.42.140 k8s-master/etc/hosts# 6. 加载内核模块cat/etc/modules-load.d/k8s.confEOF overlay br_netfilter EOFF modprobe overlaymodprobe br_netfilter# 7. 配置 sysctl 参数cat/etc/sysctl.d/k8s.confEOF net.bridge.bridge-nf-call-iptables1 net.bridge.bridge-nf-call-ip6tables1 net.ipv4.ip_forward1 EOFsysctl--system3.安装containerdMaster和Worker都操作安装依赖:yuminstall-yyum-utils device-mapper-persistent-data lvm2添加Docker/Containerd阿里云仓库:cat/etc/yum.repos.d/containerd.repoEOF [containerd] namecontainerd baseurlhttps://mirrors.aliyun.com/docker-ce/linux/centos/7/x86_64/stable/ enabled1 gpgcheck1 gpgkeyhttps://mirrors.aliyun.com/docker-ce/linux/centos/gpg EOF安装containerdyuminstall-ycontainerd.io生成默认配置并启用 systemd cgroupcontainerd config default/etc/containerd/config.tomlsed-is/SystemdCgroup false/SystemdCgroup true//etc/containerd/config.toml启动containerdsystemctlenable--nowcontainerd验证CRI接口:crictl --runtime-endpoint unix:///var/run/containerd/containerd.sock info4.Master安装Kubernetes组件kubeadm, kubelet, kubectl添加阿里云Kubernetes源catEOF|sudotee/etc/yum.repos.d/kubernetes.repo[kubernetes] nameKubernetes baseurlhttps://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/ enabled1 gpgcheck1 repo_gpgcheck1 gpgkeyhttps://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg EOF安装指定版本:yuminstall-ykubelet-1.27.1 kubeadm-1.27.1 kubectl-1.27.1--disableexcludeskubernetes启动kubelet此时会处于crash loop正常等join后才就绪:systemctlenable--nowkubelet你可以通过kubectl version --client确认版本是否匹配Master。5.Master配置kubectl初始化Master节点:# 忽略 CPU 检查仅限测试生产环境请用 ≥2 核kubeadm init\--image-repositoryregistry.aliyuncs.com/google_containers\--apiserver-advertise-address192.168.42.140\--kubernetes-versionv1.27.1\--pod-network-cidr10.244.0.0/16\--ignore-preflight-errorsNumCPU配置kubectl仅Master执行:mkdir-p$HOME/.kubesudocp-i/etc/kubernetes/admin.conf$HOME/.kube/configsudochown$(id-u):$(id-g)$HOME/.kube/config安装网络插件:kubectl apply-fhttps://github.com/flannel-io/flannel/releases/latest/download/kube-flannel.yml验证集群状态:kubectl get nodes# 应显示 Readykubectl get pods-A# 所有 Pod Running至此单节点Kubernetes集群部署完成6.Worker安装Kubernetes组件kubeadm, kubelet, kubectl以下是Worker节点手动安装Kubernetes并加入集群的详细步骤。安装kubelet、kubeadm、kubectl使用国内阿里云源添加Kubernetes阿里云镜像源catEOF|sudotee/etc/yum.repos.d/kubernetes.repo[kubernetes] nameKubernetes baseurlhttps://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/ enabled1 gpgcheck1 repo_gpgcheck1 gpgkeyhttps://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg EOF装指定版本建议与Master一致例如 v1.27.1yuminstall-ykubelet-1.27.1 kubeadm-1.27.1 kubectl-1.27.1--disableexcludeskubernetes启动kubelet此时会处于crash loop正常等join后才就绪systemctlenable--nowkubelet你可以通过kubectl version --client确认版本是否匹配Master。7.创建Kubernetes集群在Master节点上运行以下命令获取join命令如果还没记录kubeadm token create --print-join-command在Worker节点上执行你获得的完整命令例如kubeadmjoin192.168.42.140:6443\--tokenyjw92m.egds6xteaxmzrxdd\--discovery-token-ca-cert-hash sha256:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx再次查看kubelet的状态发现他已经是启动状态systemctl status kubelet8.验证在Master节点执行回到Master节点查看节点状态kubectl get nodes稍等10~30秒你应该看到新加入的Worker节点状态变为Ready如果状态是NotReady通常是因为 Flannel 还没在该节点启动完成请等待或检查kubectl get pods -n kube-flannel。9.一键安装脚本若有人喜欢一键脚本直接安装别急立刻安排一键脚本说明我们将创建两个脚本k8s-master-setup.sh在Master节点运行k8s-worker-setup.sh在Worker节点运行需传入join命令所有操作基于containerd kubeadm Flannel适配国内网络。Master节点脚本k8s-master-setup.sh#!/bin/bash# k8s-master-setup.sh# 适用于 CentOS 7 / RHEL 7set-eecho [1/6] 禁用 SELinux 和防火墙 setenforce0sed-is/^SELINUXenforcing$/SELINUXpermissive//etc/selinux/config systemctl stop firewalld systemctl disable firewalldecho [2/6] 配置 sysctl catEOF/etc/modules-load.d/k8s.confoverlay br_netfilter EOFmodprobe overlay modprobe br_netfiltercatEOF/etc/sysctl.d/k8s.confnet.bridge.bridge-nf-call-iptables 1 net.bridge.bridge-nf-call-ip6tables 1 net.ipv4.ip_forward 1 EOFsysctl--systemecho [3/6] 安装 containerd yuminstall-yyum-utils yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo yuminstall-ycontainerd.io containerd config default/etc/containerd/config.tomlsed-is/SystemdCgroup false/SystemdCgroup true/g/etc/containerd/config.toml systemctlenable--nowcontainerdecho [4/6] 安装 kubeadm、kubelet、kubectl catEOF/etc/yum.repos.d/kubernetes.repo[kubernetes] nameKubernetes baseurlhttps://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/ enabled1 gpgcheck1 repo_gpgcheck1 gpgkeyhttps://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg EOFyuminstall-ykubelet kubeadm kubectl--disableexcludeskubernetes systemctlenable--nowkubeletecho [5/6] 初始化 Kubernetes Master kubeadm init --pod-network-cidr10.244.0.0/16 --kubernetes-versionv1.27.1echo [6/6] 配置 kubectl 和安装 Flannel mkdir-p$HOME/.kubecp-i/etc/kubernetes/admin.conf$HOME/.kube/configchown$(id-u):$(id-g)$HOME/.kube/config# 使用国内镜像的 Flannelkubectl apply-fhttps://raw.githubusercontent.com/cookeem/k8s-install/master/kube-flannel.ymlecho✅ Master 节点部署完成echo请记录以下 join 命令用于 Worker 节点kubeadm token create --print-join-commandWorker节点脚本k8s-worker-setup.sh#!/bin/bash# k8s-worker-setup.sh# 用法: ./k8s-worker-setup.sh kubeadm join ...set-eif[$#-eq0];thenecho❌ 请提供 kubeadm join 命令echo用法:$0\kubeadm join 192.168.x.x:6443 --token ... --discovery-token-ca-cert-hash ...\exit1fiJOIN_CMD$1echo [1/5] 禁用 SELinux 和防火墙 setenforce0sed-is/^SELINUXenforcing$/SELINUXpermissive//etc/selinux/config systemctl stop firewalld systemctl disable firewalldecho [2/5] 配置 sysctl catEOF/etc/modules-load.d/k8s.confoverlay br_netfilter EOFmodprobe overlay modprobe br_netfiltercatEOF/etc/sysctl.d/k8s.confnet.bridge.bridge-nf-call-iptables 1 net.bridge.bridge-nf-call-ip6tables 1 net.ipv4.ip_forward 1 EOFsysctl--systemecho [3/5] 安装 containerd yuminstall-yyum-utils yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo yuminstall-ycontainerd.io containerd config default/etc/containerd/config.tomlsed-is/SystemdCgroup false/SystemdCgroup true/g/etc/containerd/config.toml systemctlenable--nowcontainerdecho [4/5] 安装 kubelet catEOF/etc/yum.repos.d/kubernetes.repo[kubernetes] nameKubernetes baseurlhttps://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/ enabled1 gpgcheck1 repo_gpgcheck1 gpgkeyhttps://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg EOFyuminstall-ykubelet kubeadm kubectl--disableexcludeskubernetes systemctlenable--nowkubeletecho [5/5] 加入 Kubernetes 集群 $JOIN_CMDecho✅ Worker 节点已成功加入集群10.Kubernetes的核心使用方法与常用操作基本概念概念说明Pod最小调度单位一个或多个容器的组合Deployment管理 Pod 副本数、滚动更新、回滚等Service为 Pod 提供稳定网络访问入口ClusterIP / NodePort / LoadBalancerNamespace资源隔离的逻辑分区如 dev / prodkubectl官方命令行工具用于与集群交互10.1 常用kubectl命令查看资源状态# 查看所有节点kubectl get nodes# 查看所有命名空间kubectl get namespaces# 查看 default 命名空间中的 Podskubectl get pods# 查看所有命名空间的 Podskubectl get pods-A# 查看 Serviceskubectl get svc# 查看 Deploymentskubectl get deployments查看详细信息# 查看某个 Pod 的详细信息含事件、IP、容器状态kubectl describe podpod-name# 查看某个节点详情kubectl describenodenode-name查看日志# 查看 Pod 日志kubectl logspod-name# 实时跟踪日志kubectl logs-fpod-name# 如果 Pod 有多个容器需指定容器名kubectl logspod-name-ccontainer-name进入容器调试用kubectlexec-itpod-name-- /bin/sh# 或kubectlexec-itpod-name-- /bin/bash10.2 部署一个应用目标部署一个简单HTTP应用echoserver通过NodePort从集群外部访问全程使用kubectl命令无需YAML文件也可提供YAML方法 1直接运行适合测试创建Deploymentkubectl create deployment echoserver\--imagek8s.gcr.io/echoserver:1.10暴露服务为NodePortkubectl expose deployment echoserver\--port8080\--target-port8080\--typeNodePort查看服务和Pod状态:# 查看 Pod 是否 Runningkubectl get pods-lappechoserver# 查看 Service 和分配的 NodePortkubectl getserviceechoserver然后通过任意节点IP 30298访问即可。成功你已部署并访问了K8s应用方法 2使用YAML文件推荐生产使用创建echoserver.yamlapiVersion: apps/v1 kind: Deployment metadata: name: echoserver spec: replicas:1selector: matchLabels: app: echoserver template: metadata: labels: app: echoserver spec: containers: - name: echoserver image: k8s.gcr.io/echoserver:1.10 ports: - containerPort:8080--- apiVersion: v1 kind: Service metadata: name: echoserver spec: type: NodePort ports: - port:8080targetPort:8080selector: app: echoserver部署kubectl apply-fechoserver.yaml删除kubectl delete-fechoserver.yaml在实际工作中很多团队的Kubernetes集群都部署在内网环境比如公司测试集群、本地开发机或家庭实验室没有公网IP外网根本访问不了里面跑的服务。这时候如果想让客户临时看个演示、调试微信回调或者从家里连公司的测试应用就很麻烦。用Cpolar就能轻松解决只要在任意一个K8s节点上运行一条命令把服务的NodePort端口比如30298映射出去它就会给你一个像 https://your-app.cpolar.io 的公网链接——手机、同事电脑、第三方平台都能直接访问。不用改防火墙、不用申请公网 IP、也不用搭复杂代理几分钟搞定特别适合临时、安全可控的外网访问需求。11.安装cpolar实现随时随地开发11.1 什么是cpolarcpolar是一款安全高效的内网穿透工具无需公网IP或复杂配置只需一条命令即可将本地服务器、Web服务或任意端口映射到公网让你随时随地远程访问内网应用特别适合开发调试、远程运维和应急部署等场景。11.2 部署cpolarcpolar 可以将你本地电脑中的服务如 SSH、Web、数据库映射到公网。即使你在家里或外出时也可以通过公网地址连接回本地运行的开发环境。❤️以下是安装cpolar步骤使用一键脚本安装命令sudocurlhttps://get.cpolar.sh|sh安装完成后执行下方命令查看cpolar服务状态如图所示即为正常启动sudosystemctl status cpolarCpolar安装和成功启动服务后在浏览器上输入虚拟机主机IP加9200端口即:【http://ip:9200】访问Cpolar管理界面使用Cpolar官网注册的账号登录,登录后即可看到cpolar web 配置界面,接下来在web 界面配置即可打开浏览器访问本地9200端口使用cpolar账户密码登录即可,登录后即可对隧道进行管理。12.配置公网地址登录cpolar web UI管理界面后,点击左侧仪表盘的隧道管理——创建隧道隧道名称可自定义本例使用了:k8s注意不要与已有的隧道名称重复协议http本地地址30298域名类型随机域名地区选择China Top创建成功后打开左侧在线隧道列表,可以看到刚刚通过创建隧道生成了公网地址接下来就可以在其他电脑或者移动端设备异地上使用地址访问。访问成功。13.保留固定公网地址使用cpolar为其配置二级子域名该地址为固定地址不会随机变化。点击左侧的预留选择保留二级子域名地区选择china Top然后设置一个二级子域名名称我使用的是k8s大家可以自定义。填写备注信息点击保留。登录cpolar web UI管理界面点击左侧仪表盘的隧道管理——隧道列表找到所要配置的隧道点击右侧的编辑。修改隧道信息将保留成功的二级子域名配置到隧道中域名类型选择二级子域名Sub Domain填写保留成功的二级子域名地区: China Top点击更新更新完成后打开在线隧道列表此时可以看到随机的公网地址已经发生变化地址名称也变成了保留和固定的二级子域名名称。最后我们使用固定的公网地址在任意设备的浏览器中访问可以看到成功访问的页面这样一个永久不会变化的二级子域名公网网址即设置好了。总结完成这套流程后Kubernetes就不再只是文档里的抽象概念。你已经经历了从系统准备、容器运行时安装、Master初始化、Worker加入到部署应用和暴露服务的完整路径。这套教程的价值在于先帮你把“能跑起来”这件事完成。很多K8s学习卡住不是因为不理解架构而是集群状态、网络插件、镜像拉取、NodePort访问这些基础问题没有跑通。只要第一个应用能访问后续再理解Deployment、Service和Ingress就会轻松很多。配置 cpolar 后内网K8s中的NodePort服务可以被公网访问。随机域名适合临时演示和测试固定二级子域名更适合长期调试尤其是需要给同事、客户或第三方平台临时访问时会方便很多。需要注意的是K8s集群管理权限很高公网访问时不要直接暴露API Server、Dashboard或敏感后台。本文中的穿透更适合演示业务服务或测试接口正式环境仍应配合认证、Ingress、TLS、访问控制和最小权限策略。Kubernetes负责应用编排containerd负责运行容器kubectl负责管理资源cpolar负责补上临时公网访问入口。当这些环节连起来以后K8s就不再只是“看过教程”而是你真正亲手跑通过的一套发布平台。