保姆级教程:从源码编译到K8s部署,手把手教你定制自己的Nacos 2.2.0镜像(含Harbor推送)
·
深度定制Nacos 2.2.0镜像全流程:从源码编译到K8s生产部署实战
在云原生技术栈中,服务发现与配置中心如同神经系统般重要。当团队需要完全掌控中间件的每个细节时,从源码编译到镜像定制的完整闭环就成为刚需。本文将呈现一个企业级Nacos 2.2.0的深度定制方案,涵盖从源码编译、镜像优化到K8s部署的全链路实践,特别针对需要替换基础镜像、集成特定配置的生产环境场景。
1. 环境准备与源码编译
1.1 基础环境配置
生产级编译环境需要特别注意隔离性与可复现性。推荐使用干净的Anolis OS 8.9作为基础系统,这是RHEL兼容发行版中对云原生支持较好的选择。关键组件版本要求:
| 组件 | 版本要求 | 验证命令 |
|---|---|---|
| JDK | OpenJDK 1.8+ | java -version |
| Maven | 3.6.0+ | mvn -v |
| Docker | 20.10.5+ | docker version |
| Kubernetes | 1.20+ | kubectl version |
配置Maven镜像加速编译依赖下载:
# 配置阿里云镜像
cat > ~/.m2/settings.xml <<EOF
<settings>
<mirrors>
<mirror>
<id>aliyunmaven</id>
<name>阿里云公共仓库</name>
<url>https://maven.aliyun.com/repository/public</url>
<mirrorOf>central</mirrorOf>
</mirror>
</mirrors>
</settings>
EOF
1.2 源码编译实战
获取Nacos 2.2.0源码并执行定制化编译:
git clone --depth 1 -b 2.2.0 https://gitee.com/mirrors/Nacos.git
cd Nacos
# 跳过测试和代码检查的快速编译
mvn -Prelease-nacos -Dmaven.test.skip=true -Dpmd.skip=true clean install
编译产物位于distribution/target/nacos-server-2.2.0.tar.gz。此时可以着手进行关键配置的预置:
- 数据库连接优化:修改
distribution/conf/application.properties中的连接池参数 - 鉴权配置:调整
nacos.core.auth.system.type等安全相关参数 - JVM调优:预设适合生产环境的堆内存参数
提示:建议将编译产物进行md5校验并归档,确保后续环节使用的是一致的构建版本
2. Docker镜像深度定制
2.1 基础镜像选型策略
原始CentOS基础镜像存在体积大、安全更新滞后等问题。我们采用Anolis OS的优化镜像作为基础,对比优势如下:
| 特性 | CentOS 7.9 | Anolis OS 8.9 |
|---|---|---|
| 镜像体积 | 204MB | 98MB |
| 漏洞修复周期 | 已停止维护 | 持续更新 |
| 软件包版本 | 较旧 | 较新 |
| 云原生支持 | 一般 | 优秀 |
定制后的Dockerfile关键改动点:
FROM registry.cn-hangzhou.aliyuncs.com/anolis/anolisos:8.9
MAINTAINER your-team@company.com
# 设置时区和语言环境
ENV TZ=Asia/Shanghai \
LANG=en_US.UTF-8
# 最小化安装依赖
RUN microdnf install -y java-1.8.0-openjdk-headless tzdata \
&& microdnf clean all \
&& rm -rf /var/cache/yum
2.2 镜像构建优化技巧
- 分层优化:将变动频率低的指令放在前面
- 多阶段构建:分离编译环境和运行环境
- 安全加固:使用非root用户运行
完整构建命令:
docker build --pull \
--build-arg DB_URL=jdbc:mysql://db-prod:3306/nacos \
--build-arg DB_USER=nacos_prod \
-t nacos-custom:2.2.0 \
-f Dockerfile.multi-stage .
构建时可注入的环境变量参数:
| 变量名 | 必需 | 默认值 | 说明 |
|---|---|---|---|
| DB_URL | 是 | 无 | MySQL连接字符串 |
| DB_USER | 是 | 无 | 数据库用户名 |
| DB_PASSWORD | 是 | 无 | 数据库密码 |
| JVM_XMS | 否 | 1g | 初始堆内存 |
| NACOS_AUTH_TOKEN | 否 | 随机生成 | 集群鉴权token |
3. Harbor私有仓库集成
3.1 镜像推送全流程
- 登录Harbor仓库:
docker login harbor.your-company.com -u ci-bot -p $HARBOR_TOKEN
- 标记并推送镜像:
docker tag nacos-custom:2.2.0 harbor.your-company.com/cloud-native/nacos:2.2.0
docker push harbor.your-company.com/cloud-native/nacos:2.2.0
3.2 集群访问配置
确保K8s各节点能拉取私有仓库镜像,需配置secret:
kubectl create secret docker-registry harbor-creds \
--docker-server=harbor.your-company.com \
--docker-username=ci-bot \
--docker-password=$HARBOR_TOKEN \
-n nacos-system
常见问题解决方案:
- 证书问题:在Docker配置中添加
insecure-registries - 权限不足:检查Harbor项目权限设置
- 网络不通:验证节点到Harbor的网络连通性
4. Kubernetes生产部署
4.1 Rancher UI部署配置
在Rancher中创建部署时需要注意:
- 镜像拉取策略:设置为
Always确保版本更新 - 资源限制:根据节点规格合理设置requests/limits
- 健康检查:配置完善的readiness/liveness探针
关键环境变量配置示例:
| 变量名 | 值示例 | 说明 |
|---|---|---|
| MODE | cluster | 集群模式运行 |
| PREFER_HOST_MODE | hostname | 使用主机名注册 |
| JVM_XMS | 2g | JVM初始堆内存 |
| NACOS_AUTH_ENABLE | true | 开启鉴权 |
4.2 高可用配置方案
对于生产环境,建议采用三节点集群部署,配置示例:
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: nacos-cluster
spec:
replicas: 3
serviceName: nacos-headless
template:
spec:
containers:
- name: nacos
env:
- name: NACOS_SERVERS
value: "nacos-0.nacos-headless.nacos.svc.cluster.local:8848 nacos-1.nacos-headless.nacos.svc.cluster.local:8848 nacos-2.nacos-headless.nacos.svc.cluster.local:8848"
4.3 监控与运维
集成Prometheus监控的配置要点:
- 暴露metrics端口:
ports:
- name: metrics
containerPort: 8848
protocol: TCP
- 添加ServiceMonitor:
apiVersion: monitoring.coreos.com/v1
kind: ServiceMonitor
metadata:
labels:
app: nacos-monitor
name: nacos-monitor
spec:
endpoints:
- interval: 30s
port: metrics
selector:
matchLabels:
app: nacos
实际部署中发现,当节点数超过3个时,需要适当调整nacos.naming.distro.taskDispatchThreadCount参数以避免心跳检测超时问题。
更多推荐
所有评论(0)