Kubernetes中部署高可用Nacos集群的完整配置方案
本文详细介绍了Kubernetes中Nacos集群的完整部署方案
#定义一个Kubernetes Headless Service,用于Nacos集群的内部通信
apiVersion: v1
kind: Service
metadata:
name: nacos-headless
namespace: ncs-tool
labels:
app: nacos #选择匹配Pod
annotations:
service.alpha.kubernetes.io/tolerate-unready-endpoints: "true" #允许服务在后端Pod未就绪时仍可解析
spec:
ports:
- port: 9848 #nacos客户端RPC端口
name: client-rpc
targetPort: 9848
- port: 7848 #Nacos Raft RPC端口(用于集群内部通信)
name: raft-rpc
targetPort: 7848
- port: 8848 #Nacos服务端RPC端口
name: server-rpc
targetPort: 8848
clusterIP: None #不会分配集群IP,而是直接解析为后端Pod的IP列表
selector:
app: nacos-cluster #选择标签为nacos-cluster的Pod,需与Nacos StatefulSet的标签匹配
---
#定义一个Kubernetes NodePort类型的服务(Service),用于暴露Nacos集群的RPC服务
apiVersion: v1
kind: Service
metadata:
namespace: ncs-tool
name: test-nacos
labels:
app: test-nacos #用于标识服务
spec:
type: NodePort #通过集群节点的静态端口(NodePort)对外暴露服务
ports:
- port: 8848 #服务在集群内部的端口(集群内访问)
name: server-rpc #标识服务用途
nodePort: 32657 #节点上静态端口(集群外访问)
targetPort: 8848
selector:
app: nacos-cluster #选择标签为nacos-cluster的Pod,需与Nacos StatefulSet的标签匹配
---
#定义一个Kubernetes ConfigMap(配置存储对象),用于存储Nacos集群的MySQL数据库连接配置
apiVersion: v1
kind: ConfigMap
metadata:
namespace: ncs-tool
name: nacos-cluster-cm
data:
mysql.host: "192.168.2.183"
mysql.db.name: "nacos_config"
mysql.port: "3306"
mysql.user: "nacos"
mysql.password: "nacos_2@25_1203"
---
#定义一个Kubernetes NodePort类型的服务Service,用于暴露Nacos集群的RPC服务
apiVersion: v1
kind: Service
metadata:
name: test-nacos-nodeport-service
labels:
app: test-nacos
spec:
type: NodePort ##通过集群节点的静态端口(NodePort)对外暴露服务
ports:
- name: test-nacos
port: 8848 #服务在集群内部的端口(集群内访问)
targetPort: 8848
nodePort: 30001 #节点上静态端口(集群外访问)
selector:
app: nacos-cluster #选择标签为nacos-cluster的Pod,需与Nacos StatefulSet的标签匹配
---
#定义一个Kubernetes StatefulSet有状态副本集,用于部署和管理Nacos集群
apiVersion: apps/v1
kind: StatefulSet
metadata:
namespace: ncs-tool
name: nacos-cluster
spec:
serviceName: nacos-headless #关联到之前定义的Headless Service,确保Pod获得稳定的DNS名称
replicas: 3 #副本数
template:
metadata:
labels:
app: nacos-cluster #用于服务选择器匹配
annotations:
pod.alpha.kubernetes.io/initialized: "true" #表示Pod已初始化完成
spec:
affinity:
podAntiAffinity:
requiredDuringSchedulingIgnoredDuringExecution: #Pod反亲和性确保Nacos Pod分散在不同节点上,提高容错性
- labelSelector:
matchExpressions:
- key: "app"
operator: In
values:
- nacos-cluster
topologyKey: "kubernetes.io/hostname"
containers:
- name: k8snacos
#imagePullPolicy: Never
imagePullPolicy: IfNotPresent
#imagePullPolicy: Always
image: core.harbor.domain:443/tool/nacos-server:v2.1.0 #镜像地址
resources:
requests: #Pod启动所需的最小资源
memory: 1Gi
cpu: 500m
limits: #表示Pod可使用的最大资源
memory: 8Gi
cpu: 8
ports:
- containerPort: 8848
name: client
env:
- name: NACOS_REPLICAS #指定集群节点数量
value: "3"
- name: MYSQL_SERVICE_HOST
valueFrom:
configMapKeyRef:
name: nacos-cluster-cm
key: mysql.host
- name: MYSQL_SERVICE_DB_NAME
valueFrom:
configMapKeyRef:
name: nacos-cluster-cm #从ConfigMap读取MySQL连接信息(主机、端口、数据库名、用户名、密码)。
key: mysql.db.name
- name: MYSQL_SERVICE_PORT
valueFrom:
configMapKeyRef:
name: nacos-cluster-cm
key: mysql.port
- name: MYSQL_SERVICE_USER
valueFrom:
configMapKeyRef:
name: nacos-cluster-cm
key: mysql.user
- name: MYSQL_SERVICE_PASSWORD
valueFrom:
configMapKeyRef:
name: nacos-cluster-cm
key: mysql.password
- name: NACOS_SERVER_PORT
value: "8848"
- name: PREFER_HOST_MODE #表示使用主机名进行节点识别
value: "hostname"
- name: NACOS_SERVERS #明确列出所有集群节点的DNS地址,用于服务发现和集群通信
value: "nacos-cluster-0.nacos-headless.ncs-tool.svc.cluster.local:8848 nacos-cluster-1.nacos-headless.ncs-tool.svc.cluster.local:8848 nacos-cluster-2.nacos-headless.ncs-tool.svc.cluster.local:8848"
selector:
matchLabels:
app: nacos-cluster
---
#定义一个Kubernetes Ingress资源,用于将外部HTTP流量路由到指定的Service
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: test-nacos-ingress
namespace: ncs-tool
spec:
rules:
- host: nacos.test.com #指定域名做为入口
http:
paths: #定义HTTP路径
- backend:
service:
name: test-nacos #后端服务名
port:
number: 8848 #服务端口
path: / #匹配所有路径
pathType: Prefix #确保所有路径均被路由到
更多推荐

所有评论(0)