从零搭建 K8S 集群 + Jenkins+Harbor 完整实践指南
前言
Kubernetes(简称 K8S)作为容器编排领域的事实标准,已成为企业级容器化部署、微服务架构落地的核心基础设施。本文将从基础环境准备开始,一步步完成 K8S 集群搭建,并集成 Jenkins 实现 CI/CD 流水线、Harbor 作为私有镜像仓库,最终实现 SpringBoot 应用的自动化部署,全程基于 CentOS 7 系统,所有操作均经过实际验证,适合新手入门和企业级环境参考。
一、环境准备
1.1 服务器规划
本次搭建采用 1 主 2 从的集群架构,服务器配置如下(可根据实际资源调整):
| 节点名称 | IP 地址 | 配置要求 | 角色 |
|---|---|---|---|
| master | 192.168.100.100 | 4 核 6G 内存 / 40G 硬盘 | 主节点 |
| node1 | 192.168.100.101 | 2 核 2G 内存 / 20G 硬盘 | 从节点 |
| node2 | 192.168.100.102 | 2 核 2G 内存 / 20G 硬盘 | 从节点 |
1.2 系统基础要求
- 操作系统:CentOS 7.x(最小化安装)
- 关闭 SELINUX:setenforce 0 && sed -i ‘s/^SELINUX=enforcing/SELINUX=disabled/’ /etc/selinux/config
- 所有节点时间同步:确保集群节点时间偏差≤1 秒
二、集群环境初始化(所有节点执行)
2.1 配置主机名映射
cat >> /etc/hosts << EOF
192.168.100.100 master
192.168.100.101 node1
192.168.100.102 node2
EOF
2.2 配置 SSH 免密登录(master 节点执行)
# 生成密钥(一路回车)
ssh-keygen -t rsa
# 分发密钥到所有节点
ssh-copy-id master
ssh-copy-id node1
ssh-copy-id node2
# 验证连通性
ssh node1 "hostname"
2.3 关闭 Swap 分区
K8S 要求必须禁用 Swap,否则 kubelet 会无法正常工作:
# 临时关闭
swapoff -a
# 永久关闭(重启生效)
sed -i '/swap/s/^/#/' /etc/fstab
echo "vm.swappiness = 0" >> /etc/sysctl.conf
sysctl -p
2.4 关闭防火墙
systemctl stop firewalld && systemctl disable firewalld
2.5 配置内核参数
modprobe br_netfilter
echo "modprobe br_netfilter" >> /etc/profile
cat > /etc/sysctl.d/k8s.conf << EOF
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF
sysctl -p /etc/sysctl.d/k8s.conf
2.6 配置 K8S YUM 源
使用阿里云镜像源提升下载速度:
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
EOF
三、安装 Docker(所有节点执行)
3.1 卸载旧版本
yum remove -y docker docker-client docker-client-latest docker-common docker-latest docker-latest-logrotate docker-logrotate
3.2 配置 Docker YUM 源
yum install -y yum-utils device-mapper-persistent-data lvm2
yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
3.3 安装并配置 Docker
# 安装指定版本(兼容性更好)
yum install -y docker-ce-20.10.9 docker-ce-cli-20.10.9 containerd.io
# 启动并设置开机自启
systemctl start docker && systemctl enable docker
# 配置镜像加速
cat > /etc/docker/daemon.json << EOF
{
"registry-mirrors": ["https://xxxxxx.mirror.aliyuncs.com"] # 替换为自己的阿里云加速地址
}
EOF
# 重启生效
systemctl daemon-reload && systemctl restart docker
四、安装 K8S 集群
4.1 安装核心组件
# 安装指定版本(1.23.17稳定性佳)
yum install -y kubelet-1.23.17 kubeadm-1.23.17 kubectl-1.23.17
# 设置开机自启
systemctl enable kubelet
4.2 初始化 Master 节点
# 添加集群端点映射
echo "192.168.100.100 cluster-endpoint" >> /etc/hosts
# 初始化集群
kubeadm init \
--apiserver-advertise-address=192.168.100.100 \
--control-plane-endpoint=cluster-endpoint \
--image-repository registry.cn-hangzhou.aliyuncs.com/google_containers \
--kubernetes-version v1.23.17 \
--service-cidr=10.96.0.0/12 \
--pod-network-cidr=172.20.0.0/16
# 配置kubectl权限(master节点执行)
mkdir -p $HOME/.kube
cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
chown $(id -u):$(id -g) $HOME/.kube/config
4.3 节点加入集群
初始化成功后,会输出节点加入命令,在 node1、node2 节点执行:
kubeadm join cluster-endpoint:6443 --token xxxxx.xxxxxxxxxx \
--discovery-token-ca-cert-hash sha256:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
注:如果 token 过期,可在 master 节点执行kubeadm token create --print-join-command重新生成。
4.4 安装网络插件 Calico
# 下载配置文件
curl https://docs.projectcalico.org/v3.15/manifests/calico.yaml -O
# 修改Pod网段(与初始化时一致)
sed -i 's/192.168.0.0\/16/172.20.0.0\/16/g' calico.yaml
# 部署Calico
kubectl apply -f calico.yaml
# 验证状态
kubectl get pod -A | grep calico
4.5 安装 Kuboard 可视化工具(master 节点)
# 下载配置文件
curl https://addons.kuboard.cn/kuboard/kuboard-v3.yaml -O
# 部署Kuboard
kubectl apply -f kuboard-v3.yaml
# 验证部署
kubectl get pods -n kuboard
访问地址:http://master:30080,默认账号密码:admin/Kuboard123。
五、安装 Jenkins(master 节点)
5.1 准备工作
# 配置Docker权限
chown root:root /var/run/docker.sock
chmod o+rw /var/run/docker.sock
# 创建挂载目录
mkdir -p /data/jenkins/mount
chmod 777 /data/jenkins/mount
5.2 编写 docker-compose.yml
version: '3.1'
services:
jenkins:
image: jenkins/jenkins
privileged: true
user: root
ports:
- 8088:8080
- 50000:50000
container_name: jenkins-server
volumes:
- /data/jenkins/mount:/var/jenkins_home
- /etc/localtime:/etc/localtime
- /var/run/docker.sock:/var/run/docker.sock
- /usr/bin/docker:/usr/bin/docker
5.3 启动 Jenkins
docker compose up -d
# 获取初始密码
cat /data/jenkins/mount/secrets/initialAdminPassword
5.4 Jenkins 初始化配置
- 访问http://master:8088,输入初始密码登录;
- 安装推荐插件,之后创建管理员账号;
- 安装必备插件:Git Parameter Plug-In、Publish Over SSH;
- 配置 JDK 和 Maven:将 JDK、Maven 包上传到挂载目录并解压,在 Jenkins 全局配置中指定路径;
- 配置 Maven 镜像源:修改 settings.xml,添加阿里云镜像加速。
六、安装 Harbor 私有镜像仓库(master 节点)
6.1 下载并解压
# 下载离线包(可手动下载后上传)
wget https://github.com/goharbor/harbor/releases/download/v2.10.0/harbor-offline-installer-v2.10.0.tgz
# 解压
tar -zxvf harbor-offline-installer-v2.10.0.tgz
cd harbor
6.2 修改配置文件
cp harbor.yml.tmpl harbor.yml
# 编辑配置
vim harbor.yml
# 修改内容:
# hostname: 192.168.100.100
# port: 5000
# 注释https相关配置
# 修改admin密码:harbor_admin_password: Harbor12345
6.3 安装 Harbor
./prepare
./install.sh
七、配置 CI/CD 流水线
7.1 准备工作
- 配置 Docker 信任 Harbor 私有仓库:



在这里插入图片描述
cat >> /etc/docker/daemon.json << EOF
"insecure-registries": ["192.168.100.100:5000"]
EOF
systemctl daemon-reload && systemctl restart docker
- 编写 Dockerfile(项目根目录):
FROM java:8
MAINTAINER dev@example.com
ENV TZ=Asia/Shanghai
RUN ln -sf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone
ENV JAVA_OPTS="-Xms128m -Xmx256m -Djava.security.egd=file:/dev/./urandom"
WORKDIR /app
ADD ./target/*.jar app.jar
EXPOSE 9111
CMD ["sh", "-c","java $JAVA_OPTS -jar app.jar"]
7.2 Jenkins 流水线脚本
def TAG = 'v1.0.0'
pipeline{
agent any
environment {
harborUser = 'admin'
harborPassword = 'Harbor12345'
harborAddress = '192.168.100.100:5000'
harborRepo = 'demo'
}
stages {
stage('拉取代码') {
steps {
checkout scmGit(branches: [[name: '*/master']], extensions: [], userRemoteConfigs: [[credentialsId: 'git-auth', url: 'https://codeup.aliyun.com/xxx/xxx/springbootdemo.git']])
script{
TAG = sh(script: "git tag --sort=-creatordate |head -n1", returnStdout:true).trim()
}
checkout scmGit(branches: [[name: TAG]], extensions: [], userRemoteConfigs: [[credentialsId: 'git-auth', url: 'https://codeup.aliyun.com/xxx/xxx/springbootdemo.git']])
}
}
stage('Maven构建') {
steps {
sh '/var/jenkins_home/maven/bin/mvn clean package -DskipTests'
}
}
stage('构建镜像') {
steps {
sh '''cp ./target/*.jar ./
docker build -t ${JOB_NAME}:'''+TAG+''' ./'''
}
}
stage('推送镜像到Harbor') {
steps {
sh '''docker login -u ${harborUser} -p ${harborPassword} ${harborAddress}
docker tag ${JOB_NAME}:'''+TAG+''' ${harborAddress}/${harborRepo}/${JOB_NAME}:'''+TAG+'''
docker push ${harborAddress}/${harborRepo}/${JOB_NAME}:'''+TAG
}
}
stage('部署到K8S') {
steps {
// 修改YAML中的镜像版本
sh 'ssh root@master "yq -i \'.spec.template.spec.containers[0].image = \\"${harborAddress}/${harborRepo}/${JOB_NAME}:'+TAG+'\\"\' /data/k8s/deployment.yml"'
// 执行部署
sh '''ssh root@master kubectl apply -f /data/k8s/deployment.yml
ssh root@master kubectl apply -f /data/k8s/service.yml'''
}
}
}
}
7.3 K8S 部署文件示例
deployment.yml
apiVersion: apps/v1
kind: Deployment
metadata:
name: springboot-demo
namespace: default
spec:
replicas: 3
selector:
matchLabels:
app: demo-pod
template:
metadata:
labels:
app: demo-pod
spec:
containers:
- name: demo-app
image: 192.168.100.100:5000/demo/springboot-demo:v1.0.0
ports:
- containerPort: 9111
service.yml
apiVersion: v1
kind: Service
metadata:
name: springboot-demo
namespace: default
spec:
selector:
app: demo-pod
type: NodePort
ports:
- port: 31111
protocol: TCP
targetPort: 9111
nodePort: 31111
八、总结
- 本次实践完成了 K8S 1.23.17 集群的完整搭建,核心步骤包括环境初始化、Docker 安装、K8S 组件部署、网络插件配置;
- 集成 Jenkins 实现了从代码拉取、Maven 构建、镜像制作到 Harbor 推送的完整 CI 流程,结合 K8S 实现了应用的自动化部署;
- 关键注意点:集群节点时间同步、Swap 分区关闭、Pod 网段一致、私有镜像仓库信任配置,这些是保证集群稳定运行的核心。
通过这套流程,可快速搭建一套企业级的容器化 CI/CD 平台,满足微服务应用的自动化部署需求,后续可根据实际业务场景扩展监控、日志、告警等能力。
更多推荐




所有评论(0)