一、整体思路与部署原理说明                                                                                                             

在开始动手之前,先梳理一下Kubernetes集群部署的整体思路。K8s集群本质上是由一组节点组成的分布式系统,其中master节点负责集群的调度、控制和管理,worker节点负责实际运行业务容器。整个部署过程可以拆解为四个关键环节:镜像仓库准备、基础环境配置、集群初始化、网络插件 安装。

为什么需要先搭建Harbor镜像仓库?因为 Kubernetes 集群中的各个组件(如 kube-apiserver、kube-controller-manager、kube-scheduler 等)都是以容器镜像的形式运行的。在国内网络环境下,直接从官方源拉取 镜像往往不稳定,因此我们先把所需镜像同步到本地 Harbor 仓库,后续所有节点都从内网仓库拉取,既保证了速度,也保证了版本的一致性。

部署方式上,这里采用 kubeadm工具进行集群初始化。kubeadm是Kubernetes官方提供的集群部署工具,它把复杂的证书生成、组件配置、节点注册等过程封装成了标准化的命令,大大降低了部署门槛。整个部署链路可以概括为:Harbor仓库提供镜像 → 各节点安装容器运行时(Docker + cri-dockerd)→ kubeadm 初始化 master → 工作节点加入集群 → 安装网络插件打通 Pod 通信。

二、三大主流K8s集群部署方法原理+实操解析


目前行业内K8s集群部署主要分为三种方式:kubeadm部署、二进制部署、容器化部署(k3s/microk8s),三种方式的底层组件完全一致,区别仅在于自动化程度、部署形态、适用场景。下面逐一拆解原理和优缺点。

1. kubeadm部署(企业主流标准方式)
(1)部署原理
kubeadm是K8s官方推出的集群快速部署工具,核心原理是:自动化拉取官方组件镜像,以容器的方式运行控制面和数据面核心组件,自动完成证书生成、etcd初始化 、组件注册、节点加入等核心操作,屏蔽了复杂的底层配置。

简单来说:kubeadm把原本需要手动配置的组件、证书、服务,全部封装成容器,一条命令即可完成集群初始化,极大降低部署门槛。

(2)核心部署流程
基于实操简化的核心流程,也是生产环境通用流程:所有节点统一系统环境配置(关闭swap、防火墙策略放行、开启ip转发);所有节点安装containerd运行时,配置国内镜像源;所有节点安装kubeadm、kubelet、kubectl工具,锁定版本保证集群统一;Master节点执行kubeadm init,初始化控制面,生成集群join令牌和证书;所有Node节点通过kubeadm join命令加入集群;部署Calico/Flannel CNI网络插件,打通Pod网络校验集群状态,部署核心插件完成集群初始化。

(3)个人实操总结优缺点
优点:官方原生工具、兼容性最强、版本升级平滑、生产环境稳定性高、部署速度快、配置标准化,几乎是企业生产环境的首选;

缺点:自动化程度适中,部分个性化配置(高可用负载均衡、自定义证书时效)需要手动修改;组件以容器形式运行,不方便直接修改组件启动参数。

适用场景:企业生产集群、测试集群、标准K8s环境搭建(90%企业的选择)。

2. 二进制部署(原生手动部署,吃透底层必备)
(1)部署原理
二进制部署是最原始、最底层的K8s部署方式,核心原理:不依赖任何自动化工具,手动下载K8s、etcd所有组件的二进制可执行文件,手动生成CA证书、手动配置组件启动参数、手动注册系统服务,一步步搭建完整集群。

这种方式完全暴露K8s集群的所有底层细节,没有任何封装,集群的每一个组件、每一份配置、每一个证书都由手动控制。

(2)核心部署逻辑
整体流程最繁琐,但逻辑最清晰:系统环境初始化(同kubeadm);手动部署etcd集群(二进制方式搭建分布式数据库)手动制作CA根证书、各组件通信证书(apiserver、kubelet、proxy等);依次部署控制面组件(apiserver、scheduler、controller-manager),配置系统守护进程;依次部署数据面组件(kubelet、kube-proxy);手动配置组件认证、授权、网络参数;部署CNI网络插件,完成集群组网。

(3)个人实操总结优缺点
优点:自由度100%,可自定义所有组件参数、证书配置、集群架构,无任何工具封装,能彻底吃透K8s底层原理,适合深度调优、定制化集群场景;

缺点:部署极其繁琐、步骤多、极易出错,对运维技术要求极高,版本升级、故障排查成本高,不适合快速搭建;

适用场景:技术深度学习、集群深度定制、特殊私有化部署场景,不建议生产常规使用。

3. 轻量容器化部署(k3s /microk8s,轻量化场景首选)
(1)部署原理
以k3s为代表的轻量化K8s部署方案,核心原理是组件精简+单二进制封装+内置依赖。官方对标准K8s组件进行精简,剔除冗余功能,将控制面、数据面组件、etcd、网络插件 、DNS插件全部封装为一个独立二进制文件,同时默认集成容器运行时,实现单命令秒级部署。

本质上它是简化版、轻量化的标准K8s,完全兼容K8s原生API,只是去除了企业级高可用的冗余配置,适配轻量化场景。

(2)核心部署逻辑
部署极简,无需复杂环境配置:执行官方一键安装脚本,自动下载k3s核心程序;Master节点一键启动server模式,自动初始化集群、证书、网络;Node节点通过token一键加入集群;集群自动集成CoreDNS、本地存储、网络插件,无需额外配置。

(3)个人实操总结优缺点
优点:部署极速、资源占用极低、配置极简、兼容原生K8s、适合低配服务器/虚拟机;

缺点:精简了部分高级功能,高可用扩展性不如标准kubeadm集群,不适合大规模生产集群;

适用场景:个人学习测试、边缘计算、小型私有化项目、低配环境部署、CI/CD测试环境。

三,构建Harbor镜像仓库
1. 部署Docker本地仓库


Harbor本身以容器方式运行,因此需要先准备Docker环境。这里先在Harbor节点上搭建一个内网 Yum 仓库,用于后续向集群各节点分发Docker安装包,避免每台机器都从外网下载。

[root@harbor ~]# cat > /etc/yum.repos.d/docker.repo <<EOF
[docker]
name = docker
baseurl = https://mirrors.aliyun.com/docker-ce/linux/rhel/9.6/x86_64/stable/
gpgcheck = 0
EOF
[root@harbor ~]# dnf install httpd createrepo-y
[root@harbor ~]# mkdir  /var/www/html/docker/ -p
[root@harbor ~]# vim /etc/httpd/conf/httpd.conf
Listen 4444
[root@harbor ~]# systemctl enable --now httpd
[root@harbor ~]# dnf  install docker-ce -downloadonly  --destdir /mnt/ -y
[root@harbor ~]# mv /mnt/*.rpm /var/www/html/docker/
[root@harbor ~]# createrepo -v /var/www/html/docker/
[root@harbor ~]# cat > /etc/yum.repos.d/docker.repo <<EOF
[docker]
name = docker
baseurl = http://172.25.254.254:4444/docker
gpgcheck = 0
EOF
[root@harbor ~]# dnf install docker-ce -y
2. 安装Docker并配置内核参数
[root@harbor ~]# dnf install docker-ce -y
[root@harbor ~]# echo br_netfilter > /etc/modules-load.d/docker_mod.conf
[root@harbor ~]# modprobe -a br_netfilter
[root@harbor ~]# vim /etc/sysctl.d/docker.conf
net.bridge.bridge-nf-call-iptables = 1
net.bridge.bridge-nf-call-ip6tables = 1
net.ipv4.ip_forward = 1
[root@harbor ~]# systemctl restart  systemd-modules-load.service
[root@harbor ~]# sysctl  --system
[root@harbor ~]# vim /lib/systemd/system/docker.service
ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock --iptables=true
[root@harbor ~]# systemctl daemon-reload
[root@harbor ~]# systemctl enable --now docker
3. 生成HTTPS证书
[root@harbor ~]# mkdir /data/certs -p
[root@harbor ~]# openssl req -newkey  rsa:4096 \
-nodes -sha256 -keyout /data/certs/timinglee.org.key \
-addext "subjectAltName = DNS:reg.timinglee.org" \
-x509 -days 365 -out /data/certs/timinglee.org.crt
4. 编辑Harbor配置文件并启动
[root@harbor ~]# tar zxf  harbor-offline-installer-v2.5.4.tgz -C /opt/
[root@harbor ~]# cd /opt/harbor/
[root@harbor harbor]# cp harbor.yml.tmpl harbor.yml
[root@harbor harbor]# vim harbor.yml
hostname: reg.timinglee.org
  certificate: /data/certs/timinglee.org.crt
  private_key: /data/certs/timinglee.org.key
harbor_admin_password: lee
[root@harbor harbor]# ./install.sh --with-chartmuseum
5. 验证Harbor仓库可用性
[root@harbor harbor]# mkdir  /etc/docker/certs.d/reg.timinglee.org/ -p
[root@harbor harbor]# cp /data/certs/timinglee.org.crt  /etc/docker/certs.d/reg.timinglee.org/ca.crt
[root@harbor harbor]# vim /etc/hosts
172.25.254.200     harbor reg.timinglee.org
[root@harbor harbor]# systemctl restart docker
[root@harbor harbor]# docker compose up -d
[root@harbor harbor]# docker login  reg.timinglee.org -u admin
Password:
Login Succeeded
四、Kubernetes集群部署
1. 安装cri-dockerd(所有主机)
# 方式一:RPM包部署
[root@master ~]# rpm -ivh cri-dockerd-0.3.14-3.el8.x86_64.rpm libcgroup-0.41-19.el8.x86_64.rpm
vim /lib/systemd/system/cri-docker.service
ExecStart=/usr/bin/cri-dockerd --container-runtime-endpoint fd:// --network-plugin=cni --pod-infra-container-image=reg.timinglee.org/k8s/pause:3.10.1
方式二:二进制包部署
[root@docker-node1 ~]# wget https://github.com/Mirantis/cri-dockerd/releases/download/v0.4.4/cri-dockerd-0.4.4.amd64.tgz
[root@docker-node1 ~]# tar zxf cri-dockerd-0.4.4.amd64.tgz
[root@docker-node1 cri-dockerd]# install -o root -g root -m 0755 cri-dockerd  /usr/local/bin/cri-dockerd
[root@docker-node1 cri-dockerd]# cp cri-docker.s* /lib/systemd/system
[root@docker-node1 cri-dockerd]# vim /lib/systemd/system/cri-docker.service
[Service]
Type=notify
ExecStart=/usr/local/bin/cri-dockerd --network-plugin=cni --pod-infra-container-image=reg.timinglee.org/k8s/pause:3.10.1 --container-runtime-endpoint fd://
ExecReload=/bin/kill -s HUP $MAINPID
TimeoutSec=0
RestartSec=2
Restart=always
[root@docker-node1 cri-dockerd]# systemctl daemon-reload
[root@docker-node1 cri-dockerd]# systemctl enable --now cri-docker.service
2. 安装Kubernetes集群所需软件
# master节点
dnf install kubelet kubeadm kubectl -y
systemctl enable --now kubelet.service
node节点
dnf install kubelet kubeadm  -y
systemctl enable --now kubelet.service
master节点中 kubectl 和kubeadm 补齐
[root@master ~]# echo "source <(kubectl completion bash)" >> ~/.bashrc
[root@master ~]# echo "source <(kubeadm completion bash)" >> ~/.bashrc
[root@master ~]# source  ~/.bashrc
3. 下载Kubernetes集群所需镜像并上传到Harbor
# 查看所需镜像列表
[root@k8s-master ~]# kubeadm config images list
registry.k8s.io/kube-apiserver:v1.35.7
registry.k8s.io/kube-controller-manager:v1.35.7
registry.k8s.io/kube-scheduler:v1.35.7
registry.k8s.io/kube-proxy:v1.35.7
registry.k8s.io/coredns/coredns:v1.13.1
registry.k8s.io/pause:3.10.1
registry.k8s.io/etcd:3.6.6-0
从阿里云镜像源拉取
[root@master ~]# kubeadm config images pull 
--image-repository registry.aliyuncs.com/google_containers
--kubernetes-version v1.35.7
--cri-socket=unix:///var/run/cri-dockerd.sock
上传镜像到本地harbor
[root@master ~]# docker  login  reg.timinglee.org -u admin
[root@master ~]# docker images  --format  "{{.Repository}}:{{.Tag}}" | awk -F "/" '/google/{system("docker tag "$0" reg.timinglee.org/k8s/"$3)}'
[root@master ~]# docker images  --format  "{{.Repository}}:{{.Tag}}" | awk -F "/" '/timinglee/{system("docker push "$0)}'
4. 在Master中初始化Kubernetes集群
[root@master ~]# kubeadm init --pod-network-cidr=10.244.0.0/16 \
--image-repository reg.timinglee.org/k8s \
--kubernetes-version v1.35.7 \
--cri-socket=unix:///var/run/cri-dockerd.sock
初始化成功后,其他主机加入本集群的凭证
kubeadm join 172.25.254.100:6443 --token tdwjoc.8d1yw3wl4r4tm6c4 
--discovery-token-ca-cert-hash sha256:6b5950ef2cdba85d6dfdb564ee90d4187fa3d341767dc9852cbdd5c9dee4f927
如果忘记join命令
[root@master ~]#  kubeadm token create --print-join-command
如果初始化出问题,可以重置集群设定
[root@master ~]# kubeadm reset  --cri-socket=unix:///var/run/cri-dockerd.sock
添加kubernets环境变量到本机
[root@master ~]# echo "export KUBECONFIG=/etc/kubernetes/admin.conf" > ~/.bash_profile
[root@master ~]# source  ~/.bash_profile
[root@master ~]# kubectl get nodes
NAME     STATUS     ROLES           AGE    VERSION
master   NotReady   control-plane   102s   v1.35.3
5. 添加Node节点到集群
[root@node1 ~]#  kubeadm join 172.25.254.100:6443 --token jl4ztx.cax3iysvu7onsh5s --discovery-token-ca-cert-hash sha256:6b5950ef2cdba85d6dfdb564ee90d4187fa3d341767dc9852cbdd5c9dee4f927 --cri-socket=unix:///var/run/cri-dockerd.sock
测试
[root@master ~]# kubectl get nodes
NAME     STATUS     ROLES           AGE     VERSION
master   NotReady   control-plane   5m16s   v1.35.3
node1    NotReady   <none>          66s     v1.35.3
node2    NotReady   <none>          58s     v1.35.3
6. 安装Flannel网络插件
[root@k8s-master ~]# tar zxf kube-flannel-v0.28.9.tar.gz
[root@k8s-master ~]# cd flannel/
[root@k8s-master flannel]# docker load  -i kube-flannel-v0.28.9.tar
上传flannel镜像到本地harbor
[root@master ~]# docker tag ghcr.io/flannel-io/flannel-cni-plugin:v1.9.0-flannel1 reg.timinglee.org/flannel-io/flannel-cni-plugin:v1.9.0-flannel1
[root@master ~]# docker push  reg.timinglee.org/flannel-io/flannel-cni-plugin:v1.9.0-flannel1
[root@master ~]# docker tag ghcr.io/flannel-io/flannel:v0.28.1 reg.timinglee.org/flannel-io/flannel:v0.28.1
[root@master ~]# docker push reg.timinglee.org/flannel-io/flannel:v0.28.1
修改kube-flannel.yml中的镜像地址为本地harbor
[root@master ~]# vim kube-flannel.yml
image: flannel-io/flannel:v0.28.1
image: flannel-io/flannel-cni-plugin:v1.9.0-flannel1
[root@master ~]# kubectl apply -f kube-flannel.yml
测试
[root@master ~]# kubectl get  nodes
NAME     STATUS   ROLES           AGE     VERSION
master   Ready    control-plane   13m     v1.35.3
node1    Ready    <none>          9m44s   v1.35.3
node2    Ready    <none>          9m36s   v1.35.3
五、个人部署实战心得


1. 集群稳定的核心是环境统一:所有节点系统版本、内核版本、kube组件版本必须一致,否则极易出现节点离线、Pod调度异常问题;

2. 网络是K8s的重中之重:90%的集群故障都来自CNI网络插件异常、端口未放行、swap未关闭,部署前期一定要做好环境预检;

3. 生产环境优先kubeadm:不要为了追求底层原理用二进制部署生产集群,维护成本极高;学习阶段一定要手动搭一次二进制集群,彻底理解组件运行逻辑;

4. 证书和etcd是集群命脉:所有集群故障、集群迁移、版本升级,核心都围绕etcd数据和证书,生产环境必须定期备份etcd数据。

更多推荐