在Kubernetes中部署单节点Nacos服务
配置准备
1. 初始化MySQL数据库
首先从官方仓库获取Nacos的数据库初始化脚本:
wget https://raw.githubusercontent.com/alibaba/nacos/develop/distribution/conf/mysql-schema.sql
登录MySQL并创建专用数据库与用户:
mysql -uroot -p
CREATE DATABASE IF NOT EXISTS nacos_config DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
USE nacos_config;
SOURCE /root/mysql-schema.sql;
-- 创建访问账户(避免使用特殊字符)
CREATE USER 'nacos_user'@'%' IDENTIFIED BY 'SecurePass123';
GRANT ALL PRIVILEGES ON nacos_config.* TO 'nacos_user'@'%';
FLUSH PRIVILEGES;
EXIT;
2. 创建ConfigMap存储数据库连接信息
使用ConfigMap管理数据库配置,便于维护和解耦:
apiVersion: v1
kind: ConfigMap
metadata:
name: nacos-config
namespace: middleware
data:
db.host: "mysql-service.middleware.svc.cluster.local"
db.name: "nacos_config"
db.port: "3306"
db.username: "nacos_user"
db.password: "SecurePass123"
3. 部署Deployment运行Nacos实例
定义单副本Deployment,启用安全认证与持久化配置:
apiVersion: apps/v1
kind: Deployment
metadata:
name: nacos-server
namespace: middleware
spec:
replicas: 1
selector:
matchLabels:
app: nacos
template:
metadata:
labels:
app: nacos
spec:
containers:
- name: nacos
image: nacos/nacos-server:v2.2.0
ports:
- containerPort: 8848
name: http
- containerPort: 9848
name: rpc-client
- containerPort: 9849
name: rpc-raft
resources:
requests:
cpu: 500m
memory: 1Gi
env:
- name: MODE
value: "standalone"
- name: SPRING_DATASOURCE_PLATFORM
value: "mysql"
- name: MYSQL_SERVICE_HOST
valueFrom:
configMapKeyRef:
name: nacos-config
key: db.host
- name: MYSQL_SERVICE_DB_NAME
valueFrom:
configMapKeyRef:
name: nacos-config
key: db.name
- name: MYSQL_SERVICE_PORT
valueFrom:
configMapKeyRef:
name: nacos-config
key: db.port
- name: MYSQL_SERVICE_USER
valueFrom:
configMapKeyRef:
name: nacos-config
key: db.username
- name: MYSQL_SERVICE_PASSWORD
valueFrom:
configMapKeyRef:
name: nacos-config
key: db.password
- name: NACOS_SERVER_PORT
value: "8848"
- name: PREFER_HOST_MODE
value: "hostname"
- name: NACOS_AUTH_ENABLE
value: "true"
- name: NACOS_AUTH_TOKEN_EXPIRE_SECONDS
value: "18000"
- name: NACOS_AUTH_IDENTITY_KEY
value: "authKey"
- name: NACOS_AUTH_IDENTITY_VALUE
value: "authValue"
- name: NACOS_AUTH_TOKEN
value: "SecretKey012345678901234567890123456789012345678901234567890123456789"
4. 暴露服务 via Service
通过NodePort方式暴露多个必要端口:
apiVersion: v1
kind: Service
metadata:
name: nacos-service
namespace: middleware
spec:
type: NodePort
selector:
app: nacos
ports:
- name: server-http
port: 8848
targetPort: 8848
nodePort: 31048
- name: client-rpc
port: 9848
targetPort: 9848
- name: raft-rpc
port: 9849
targetPort: 9849
5. 配置Ingress实现外部访问
使用ALB Ingress控制器对外提供HTTPS访问:
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: nacos-ingress
namespace: middleware
annotations:
alb.ingress.kubernetes.io/listen-ports: '[{"HTTP":80},{"HTTPS":443}]'
alb.ingress.kubernetes.io/ssl-redirect: "true"
spec:
ingressClassName: alb
rules:
- host: nacos.example.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: nacos-service
port:
number: 8848
完成上述YAML文件编写后,依次执行kubectl apply即可完成部署。
常见问题及解决方案
1. 启动时报错"Unknown column 'encrypted_data_key'"
该错误通常出现在升级或迁移场景中。需手动为以下三张表添加缺失字段:
ALTER TABLE config_info ADD COLUMN `encrypted_data_key` text COMMENT '加密密钥';
ALTER TABLE config_info_beta ADD COLUMN `encrypted_data_key` text COMMENT '加密密钥';
ALTER TABLE his_config_info ADD COLUMN `encrypted_data_key` text COMMENT '历史加密密钥';
2. 默认账号密码无法登录
当开启鉴权但数据库中的密码未加密时,会导致登录失败。可通过Bcrypt工具生成加密串,并更新users表中nacos用户的密码字段:
- 访问在线Bcrypt生成器
- 输入明文密码
nacos,生成哈希值如:$2a$10$... - 执行SQL更新:
UPDATE users SET password='$2a$10$...' WHERE username='nacos';