Kubernetes 上部署 Nacos

nacos 使用 NFS 持久化安装部署

部署 NFS

在 NFS Server 上执行以下命令:

sudo apt update 
sudo apt install nfs-kernel-server -y

创建用于存放 Nacos 数据的目录

sudo mkdir -p /data/nfs/nacos 

调整权限,生产环境建议更精细的权限控制

sudo chown nobody:nogroup /data/nfs/nacos 
sudo chmod 777 /data/nfs/nacos

配置 NFS 服务

sudo nano /etc/exports

/data/nfs/nacos 192.168.1.0/24(rw,sync,no_subtree_check,no_root_squash)

启动服务:

sudo exportfs -a 
sudo systemctl restart nfs-kernel-server

在 Kubernetes 中配置 NFS 客户端

为了让 K8S 节点能挂载 NFS,所有 Worker 节点都必须安装客户端工具:

sudo apt install nfs-common -y

部署 NFS 动态存储类 (StorageClass)

手动创建 PV 非常麻烦,在 K8S 中我们通常使用 nfs-subdir-external-provisioner 来实现自动创建 PV。

使用 Helm 快速部署 (推荐)

这是目前最简单、最标准的方式,添加仓库

helm repo add nfs-subdir-external-provisioner https://kubernetes-sigs.github.io/nfs-subdir-external-provisioner/ 

安装 nfs-provisioner 作为 存储 Provisioner

helm install nfs-provisioner nfs-subdir-external-provisioner/nfs-subdir-external-provisioner \
--set nfs.server=192.168.1.100 \
--set nfs.path=/data/nfs/nacos \
--set storageClass.name=nfs-storage \
--set storageClass.defaultClass=true

kubectl get sc 验证 StorageClass

Nacos 关联 NFS 存储

现在可以在 Nacos 的部署配置中使用这个 nfs-storage 的 StorageClass 了。参考以下资源清单部署单节点的 Nacos 完整服务,包括 Nginx Ingress 以及鉴权

nacos-single-node.yaml
apiVersion: v1
kind: Namespace
metadata:
name: nacos
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: nacos-pvc
namespace: nacos
spec:
accessModes:
- ReadWriteMany # ⚠️ NFS 必须用这个
storageClassName: nfs-storage
resources:
requests:
storage: 5Gi
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: nacos
namespace: nacos
spec:
replicas: 1
selector:
matchLabels:
app: nacos
template:
metadata:
labels:
app: nacos
spec:
containers:
- name: nacos
image: nacos/nacos-server:v2.2.3
ports:
- containerPort: 8848
env:
- name: MODE
value: "standalone"
- name: NACOS_AUTH_ENABLE
value: "true"
- name: NACOS_AUTH_TOKEN
value: "XDoArVHBA1o8DDsyBchWLGXNfWYibjvEOa7qfroNmZ4="
- name: NACOS_AUTH_IDENTITY_KEY
value: "admin"
- name: NACOS_AUTH_IDENTITY_VALUE
value: "admin"
- name: JVM_XMS
value: "512m"
- name: JVM_XMX
value: "512m"
volumeMounts:
- name: nacos-storage
mountPath: /home/nacos/data
- name: nacos-storage
mountPath: /home/nacos/logs
volumes:
- name: nacos-storage
persistentVolumeClaim:
claimName: nacos-pvc
---
apiVersion: v1
kind: Service
metadata:
name: nacos
namespace: nacos
spec:
selector:
app: nacos
ports:
- name: http
port: 8848
targetPort: 8848
type: ClusterIP
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: nacos
namespace: nacos
annotations:
nginx.ingress.kubernetes.io/rewrite-target: /
nginx.ingress.kubernetes.io/whitelist-source-range: "54.251.236.229/24,206.119.115.76/24"
spec:
ingressClassName: nginx
rules:
- host: nacos.example.click
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: nacos
port:
number: 8848

部署完成后通过 nacos.example.click 登录后台,初始默认密码为 nacos/nacos

nacos 使用 Mysql 持久化安装部署

要使用 Mysql 存储数据,只需修改资源清单为以下内容即可:

apiVersion: v1
kind: Namespace
metadata:
name: nacos
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: nacos-pvc
namespace: nacos
spec:
accessModes:
- ReadWriteMany # ⚠️ NFS 必须用这个
storageClassName: nfs-storage
resources:
requests:
storage: 5Gi
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: nacos
namespace: nacos
spec:
replicas: 1
selector:
matchLabels:
app: nacos
template:
metadata:
labels:
app: nacos
spec:
containers:
- name: nacos
image: nacos/nacos-server:v2.2.3
ports:
- containerPort: 8848
env:
- name: MODE
value: "standalone"

- name: SPRING_DATASOURCE_PLATFORM
value: "mysql"

- name: MYSQL_SERVICE_HOST
value: "<MYSQL_SERVICE_HOST>"
- name: MYSQL_SERVICE_PORT
value: "3306"
- name: MYSQL_SERVICE_DB_NAME
value: "<MYSQL_SERVICE_DB_NAME>"
- name: MYSQL_SERVICE_USER
value: "<MYSQL_SERVICE_USER>"
- name: MYSQL_SERVICE_PASSWORD
value: "<MYSQL_SERVICE_PASSWORD>"

- name: MYSQL_SERVICE_DB_PARAM
value: "characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true"

- name: NACOS_AUTH_ENABLE
value: "true"
- name: NACOS_AUTH_TOKEN
value: "XDoArVHBA1o8DDsyBchWLGXNfWYibjvEOa7qfroNmZ4="
- name: NACOS_AUTH_IDENTITY_KEY
value: "admin"
- name: NACOS_AUTH_IDENTITY_VALUE
value: "admin"
- name: JVM_XMS
value: "512m"
- name: JVM_XMX
value: "512m"

volumeMounts:
- name: nacos-storage
mountPath: /home/nacos/data
- name: nacos-storage
mountPath: /home/nacos/logs
volumes:
- name: nacos-storage
persistentVolumeClaim:
claimName: nacos-pvc
---
apiVersion: v1
kind: Service
metadata:
name: nacos
namespace: nacos
spec:
selector:
app: nacos
ports:
- name: http
port: 8848
targetPort: 8848
- name: rpc
port: 9848
targetPort: 9848
type: ClusterIP
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: nacos
namespace: nacos
annotations:
nginx.ingress.kubernetes.io/rewrite-target: /
# nginx.ingress.kubernetes.io/whitelist-source-range: "54.251.236.2/24,206.119.115.7/24"
spec:
ingressClassName: nginx
rules:
- host: nacos.example.click
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: nacos
port:
number: 8848