# Kubernetes快速部署 K8s 集群 **Repository Path**: li_ping__promise/master ## Basic Information - **Project Name**: Kubernetes快速部署 K8s 集群 - **Description**: Kubernetes快速部署 K8s 集群 - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 1 - **Created**: 2025-06-11 - **Last Updated**: 2025-06-11 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 一、前言 K8s 集群部署有多种方式,kubeadm 是 K8s 官方提供的集群部署工具,这种方法最为常用,简单快速,适合初学者。本文就使用 kubeadm 搭建集群演示。 # 二、主机准备 本次我们搭建一套 3 个节点的 K8s 集群,最小硬件配置:2 核 CPU、2G 内存、50G 硬盘,操作系统需要是 CentOS 7。 | 实例名 | 主机名 | 私网地址 | 主机配置 | 备注 | | ------ | ----------- | -------------- | ----------------------- | -------- | | s1 | k8s-master | 192.168.72.100 | 2核,4GiB,系统盘 50GiB | 控制节点 | | s2 | k8s-worker1 | 192.168.72.101 | 2核,2GiB,系统盘 40GiB | 工作节点 | | s3 | k8s-worker2 | 192.168.72.102 | 2核,2GiB,系统盘 40GiB | 工作节点 | 注意:这 3 台服务器需要在同一个内网环境,可以通过内网 IP 相互访问,在集群配置过程中会使用到内网 IP。如果要使用外网 IP 搭建集群,还需要单独配置虚拟网卡以及修改一些配置,可以参考网上相关文章。 # 三、系统配置 在所有 3 台主机上都完成以下准备工作,逐步执行以下命令。 ## 3.1. 关闭防火墙及相关配置 关闭 Linux 操作系统的防火墙、安全服务和 swap 分区,如果有提示执行命令权限不够,可以切换到 root 用户或者在命令前增加 “sudo” 来提升执行命令的权限。 ```bash # 关闭和禁用防火墙 systemctl stop firewalld systemctl disable firewalld # 关闭selinux,selinux 是 Linux 系统下的一个安全服务,需要关闭 setenforce 0 # 临时 sed -i 's/enforcing/disabled/' /etc/selinux/config # 永久 # 关闭 Linux 的 swap 分区,提升 k8s 的性能 swapoff -a # 临时 sed -ri 's/.*swap.*/#&/' /etc/fstab # 永久 ``` ## 3.2. 修改主机名 K8s 使用主机名进行节点的通信,所以需要按照表格中的主机名修改 3 台服务器的主机名。注意:K8s 要求主机名使用 “-” 或者 “.” 连接,不能使用下划线 “_”。 ```bash # 在 s1 这个机器上执行修改主机名命令 hostnamectl set-hostname k8s-master # 在s2 这个机器上执行修改主机名命令 hostnamectl set-hostname k8s-worker1 # 在s3这个机器上执行修改主机名命令 hostnamectl set-hostname k8s-worker2 ``` ## 3.3. 主机名DNS解析 在每个服务器上都增加主机名和 IP 的对应关系,执行以下命令快速编辑 “/etc/hosts” 文件,增加解析配置。 ```bash # 添加各个节点的解析,IP 地址需要替换为你自己服务器的内网 IP 地址。 cat >> /etc/hosts << EOF 192.168.72.100 k8s-master 192.168.72.101 k8s-worker1 192.168.72.102 k8s-worker2 EOF ``` ## 3.4. 时间同步 K8s 要求集群中的所有服务器时间一致,使用 ntpdate(Network Time Protocol)从网络同步时间,执行以下命令安装 ntpdate,之后再执行同步命令。 ```bash # 安装ntp服务 yum install ntpdate -y # 安装完成后使用阿里云的时间服务同步时间 ntpdate ntp1.aliyun.com ``` 如果提示没有匹配到 ntpdate,则可以使用 wlnmp 的软件源安装 wntp。 ```bash rpm -ivh http://mirrors.wlnmp.com/centos/wlnmp-release-centos.noarch.rpm yum install wntp -y ``` ## 3.5. 配置网络 为了让 K8s 能够转发网络流量,需要修改 iptables 的配置。执行以下命令快速编辑 “etc/sysctl.d/k8s.conf” 配置文件,增加 iptables 的配置。 ```bash # 修改 Linux 内核参数,添加网桥过滤和地址转发功能 cat > /etc/sysctl.d/k8s.conf << EOF net.bridge.bridge-nf-call-ip6tables = 1 net.bridge.bridge-nf-call-iptables = 1 EOF # 使配置生效 sudo sysctl --system ``` ## 3.6. 重启服务器 运行 “reboot” 命令,重启服务器,让以上配置生效。 ```bash reboot ``` # 四、安装软件 完成系统配置,我们继续在这 3 台主机上安装以下软件。 ## 4.1. 安装 Docker 使用 Docker 作为运行容器的运行时组件,需要先安装 Docker。通过 wget 命令来下载 Docker 的安装包仓库,然后通过 yum 命令进行安装,安装完成之后再执行开启 Docker 服务命令。 ```bash # 通过 wget 命令获取 docker 软件仓库信息 wget https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo -O /etc/yum.repos.d/docker-ce.repo # 安装 docker-ce yum -y install docker-ce # 开启 docker 服务 systemctl enable docker && systemctl start docker ``` Docker 安装完成之后,配置阿里云提供的镜像库来加速镜像下载。 ```bash # 配置镜像下载加速器,国内使用阿里云镜像库会更快 cat > /etc/docker/daemon.json < /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 https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg EOF ``` 注意:国内是无法访问 K8s 官方的镜像库,如果不增加YUM源配置,后续就无法安装相关工具。 ## 4.4. 安装 kubeadm、kubelet 和 kubectl 所有K8S服务器上都需要安装 kubeadm、kubelet 和 kubectl 这三个工具。 - kubeadm 用来初始化 K8s 集群; - kubelet 是每个节点的 K8s 管理员; - kubectl 是 K8s 的命令行交互工具。 由于版本更新比较快,这里指定安装的较新的版本`1.28.0`。 ```bash # 指定了安装的版本是 1.28.0 yum install -y kubelet-1.28.0 kubeadm-1.28.0 kubectl-1.28.0 # 开机启动 kubelet 服务 systemctl enable kubelet ``` # 五、Master 节点初始化 K8s 所有准备工作都完成了,于可以进行 K8s 的初始化了,只需要在 Master 节点上执行以下初始化命令。 ```bash kubeadm init \ --apiserver-advertise-address=192.168.72.100 \ --image-repository registry.aliyuncs.com/google_containers \ --kubernetes-version v1.28.0 \ --service-cidr=10.96.0.0/12 \ --pod-network-cidr=10.244.0.0/16 \ --cri-socket=unix:///var/run/cri-dockerd.sock \ --ignore-preflight-errors=all ``` 注意:“apiserver-advertise-address” 参数需要替换成你的 Master 节点服务器的内网 IP。 相关参加解释: - apiserver-advertise-address:集群广播地址,用 master 节点的内网 IP。 - image-repository:由于默认拉取镜像地址 k8s.gcr.io 国内无法访问,这里指定阿里云镜像仓库地址。 - kubernetes-version: K8s 版本,与上面安装的软件版本一致。 - service-cidr:集群 Service 网段。 - pod-network-cidr:集群 Pod 网段。 - cri-socket:指定 cri-socket 接口,我们这里使用 unix:///var/run/cri-dockerd.sock。 执行命令后耐心等待,直到安装完成,会出现以下内容。 ```bash [addons] Applied essential addon: kube-proxy 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 Alternatively, if you are the root user, you can run: export KUBECONFIG=/etc/kubernetes/admin.conf 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/ Then you can join any number of worker nodes by running the following on each as root: kubeadm join 192.168.72.100:6443 --token xxxxxx \ --discovery-token-ca-cert-hash sha256:xxxxxx ``` 其中,在以上返回结果中有 3 条命令需要立即执行,这是用来设置 kubectl 工具的管理员权限,执行之后就可以在 Master 节点上通过终端窗口使用 kubectl 命令。 ```bash # 在 Master 节点上执行以下命令 mkdir -p $HOME/.kube sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config sudo chown $(id -u):$(id -g) $HOME/.kube/config ``` 在返回结果最后有 1 条 “kubeadm join” 命令,这个是用来加入工作节点的,需要在工作节点上执行。 # 六、Worker 节点加入 K8s 集群 K8s 初始化之后,就可以在其他 2 个工作节点上执行 “kubeadm join” 命令,因为我们使用了 cri-dockerd ,需要在命令加上 “–cri-socket=unix:///var/run/cri-dockerd.sock” 参数。 ```bash # 在两个工作节点上执行 kubeadm join 192.168.72.100:6443 --token xxxxxx \ --discovery-token-ca-cert-hash sha256:xxxxxx \ --cri-socket=unix:///var/run/cri-dockerd.sock ``` 命令中 token 有效期为 24 小时,当 token 过期之后,执行 “kubeadm join” 命令就会报错。这时可以直接在 Master 节点上使用以下命令生成新的 token,然后再使用 “kubeadm join” 命令加入节点。 此时,我们的集群就部署成功了。你可以使用 “kubectl get node” 命令来查看集群节点状态。 ```bash [root@k8s-master ~]# kubectl get node NAME STATUS ROLES AGE VERSION k8s-master NotReady control-plane 84m v1.28.0 k8s-worker1 NotReady 82m v1.28.0 k8s-worker2 NotReady 47s v1.28.0 ``` 注意到所有节点的状态都是 “NotReady”,这是由于集群还缺少网络插件,集群的内部网络还没有正常运作。 # 七、安装 K8s 网络插件 K8s 网络插件,也称为容器网络接口(CNI)插件,是实现 K8s 集群中容器间通信和网络连接的关键组件,否则 Pod 之间无法通信。Kubernetes 支持多种网络方案,这里我们使用 calico。 Calico 是通过执行一个 YAML 文件部署到 K8s 集群里的,所以我们首先需要通过 “wget” 命令下载这个 YAML 文件。 ```bash # 下载 Calico 插件部署文件 wget https://docs.projectcalico.org/manifests/calico.yaml ``` 通过 vi 编辑器修改 “calico.yaml” 文件中的 “CALICO_IPV4POOL_CIDR” 参数,需要与前面 “kubeadm init” 命令中的 “–pod-network-cidr” 参数一样(10.244.0.0/16)。如果文件里的 “CALICO_IPV4POOL_CIDR” 参数前面有 “#”,表示被注释了,需要删除 “#”。 修改位置如下所示。(在 vi 中可以通过输入 “:set nu” 来查看行号,同时可以输入 “/CALICO_IPV4POOL_CIDR” 来快速定位到参数位置) ```bash # 修改文件时注意格式对齐 4598 # The default IPv4 pool to create on startup if none exists. Pod IPs will be 4599 # chosen from this range. Changing this value after installation will have 4600 # no effect. This should fall within `--cluster-cidr`. 4601 - name: CALICO_IPV4POOL_CIDR 4602 value: "10.244.0.0/16" 4603 # Disable file logging so `kubectl logs` works. 4604 - name: CALICO_DISABLE_FILE_LOGGING 4605 value: "true" ``` 最后,使用 “kubectl apply” 命令将 Calico 插件部署到集群里,部署 YAML 文件命令如下: ```bash kubectl apply -f calico.yaml ``` Calico 部署会比较慢,大概等个几分钟,等待 Calico 部署完成后,再次通过命令 “kubectl get node” 查看节点状态,就可以看到所有节点已经准备就绪,此时集群正式搭建成功。 ```bash [root@k8s-master ~]# kubectl get node NAME STATUS ROLES AGE VERSION k8s-master Ready control-plane 12h v1.28.0 k8s-worker1 Ready 12h v1.28.0 k8s-worker2 Ready 10h v1.28.0 ``` 注意:如果 Calico 无法安装成功,可能是由于 Calico 镜像无法拉取。本文提供了离线镜像包([下载地址](https://pan.baidu.com/s/1T0iO-SmsfxzerrtLI3ZC4w?pwd=u155)),可以下载两个压缩文件,然后传输到集群中的所有 3 个节点上。 “calico-image-3.25.1.zip” 中是离线镜像文件,解压后在每个节点上执行导入命令。 ```bash ls *.tar |xargs -i docker load -i {} ``` “calico-yaml.zip” 中是部署文件,在 Master 节点上依次部署两个 YAML 文件。 ```bash # 先删除之前部署不成功的 Calico kubectl delete -f calico.yaml # 依次部署两个 yaml 文件 kubectl apply -f tigera-operator.yaml --server-side kubectl apply -f custom-resources.yaml ``` 然后等待部署完成,就可以看到所有节点准备就绪。 # 八、小结 本文带你搭建了一套 3 台服务器的 K8s 集群。在搭建 K8s 集群的过程中,有几个方面主要注意: - 确保所有服务器的硬件和系统配置符合要求; - 在每个服务器安装了 Docker 和 cri-dockerd 作为容器引擎; - 安装 kubeadm、kubelet 和 kubectl 这三个工具。 - 在 Master 节点上执行集群初始化,初始化完成后就可以加入工作节点。 - 最后部署 Calico 网络插件,以确保集群内部的网络通信。 最后,你就成功搭建了一个 K8s 集群, # 使用说明 使用shell脚本自动执行更新yum源和安装docker 下载项目 ```bash git clone https://gitee.com/shi-hejun/master.git ``` 进入shell脚本目录 ```bash cd /docker/shell ``` 接着按照顺序运行脚本 ```bash bash updateyum.sh bash k8s-preposition.sh bash docker.sh bash cri-docker.sh bash kubeadm-kubelet-kubectl.sh ``` 运行完之后接着第五步开始master节点初始化即可