一、前言
在k8s集群中部署nacos集群需要用到以下服务setafulset、pv、pvc、service、configmap,setafulset用来管理nacos服务,因为nacos服务是有状态服务,所以需要使用setafulset,pv、pvc用来挂载存储nacos数据的路径,configmap用来管理nacos配置,service用来配置无头服务和对外访问,无头服务是为了固定nacos每个节点的地址,使用cluster ip会导致pod的地址发生变化,但是使用service的无头服务就可以固定nacos每个节点的地址,即给每个nacos节点分配以下地址:nacos-0.nacos.nacos.svc.cluster.local:8848该地址解析出来的意思就是 pod名称.service名称.命名空间名称.svc.cluster.local:service端口,这个地址就是不会变得,即每个nacos服务都有了固定的地址,就类似于deployment管理的无状态服务,需要访问这些无状态服务,在集群内部可以通过 service名称.命名空间:service端口访问,举个例子就是nacos.nacos:8848
二、部署
部署nacos前需要先部署mysql
参考:yum安装mysql 5.7_yum安装mysql5.7-CSDN博客
创建nacos数据存储库
mysql -u root -p
create database nacos
创建nacos配置数据库用户
grant all on nacos.* to 'nacos'@'%' identified by '12345678';
flush privileges;
往nacos库中导入nacos初始化脚本
在nacos官网中下载对应版本的安装包
参考:Releases · alibaba/nacos · GitHub
下载解压
tar -zxvf nacos-server-1.4.2.tar.gz
ls /root/nacos/conf/
mysql -u root -p
use nacos
source /root/nacos/conf/nacos-mysql.sql
创建命名空间
kubectl create namespace nacos
创建nacos的yaml文件存放目录
mkdir /opt/nacos && cd /opt/nacos
编辑pv配置文件
nacos集群有三个节点,所以需要创建三个不同的pv
vi pv.yaml
apiVersion: v1
kind: PersistentVolume
metadata:
name: nacos-pv0
spec:
storageClassName: nacos-pv #定义模板匹配名称,用于给pvc自动匹配
capacity:
storage: 40Gi
accessModes:
- ReadWriteMany
persistentVolumeReclaimPolicy: Retain
nfs:
path: /share/k8s/nacos/nacos01
server: 10.1.60.22
---
apiVersion: v1
kind: PersistentVolume
metadata:
name: nacos-pv1
spec:
storageClassName: nacos-pv #定义模板匹配名称,用于给pvc自动匹配
capacity:
storage: 40Gi
accessModes:
- ReadWriteMany
persistentVolumeReclaimPolicy: Retain
nfs:
path: /share/k8s/nacos/nacos02
server: 10.1.60.22
---
apiVersion: v1
kind: PersistentVolume
metadata:
name: nacos-pv2
spec:
storageClassName: nacos-pv #定义模板匹配名称,用于给pvc自动匹配
capacity:
storage: 40Gi
accessModes:
- ReadWriteMany
persistentVolumeReclaimPolicy: Retain
nfs:
path: /share/k8s/nacos/nacos03
server: 10.1.60.22
编辑configmap配置文件
vi configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: nacos-cm
namespace: nacos
data:
mysql.host: "10.1.60.8" #数据库地址
mysql.db.name: "nacos" #nacos数据存储库名称
mysql.port: "6033" #数据库端口,这里使用了proxysql所以是6033
mysql.user: "root" #数据库用户名
mysql.password: "12345678" #数据库用密码
编辑service配置文件
这里需要两个service服务,一个给nacos提供无头服务,一个给nacos提供对外访问
vi service.yaml
apiVersion: v1
kind: Service
metadata:
name: nacos
namespace: nacos
labels:
app: nacos
spec:
publishNotReadyAddresses: true
clusterIP: None #无头服务中配置clusterip为none
ports:
- port: 8848
name: server
targetPort: 8848
- port: 9848 #选举端口
name: client-rpc
targetPort: 9848
## 兼容1.4.x版本的选举端口
- port: 7848
name: old-raft-rpc
targetPort: 7848
selector:
app: nacos
vi service-nodeport.yaml
kind: Service
apiVersion: v1
metadata:
name: nacos-nodeport
namespace: nacos
labels:
app: nacos
spec:
type: NodePort
ports:
- name: http-8848
protocol: TCP
port: 8848
nodePort: 30002
targetPort: 8848
- port: 9848 #对外提供服务的其实可以把这里删了,选举端口不用对外服务
name: client-rpc
targetPort: 9848
selector:
app: nacos
编辑setafulset配置文件
vi setafulset.yaml
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: nacos
namespace: nacos
spec:
podManagementPolicy: Parallel #对setafulset的pod进行并行操作,而不是像deployment一样处理完一个pod再到下一个pod
serviceName: nacos
replicas: 3
template:
metadata:
labels:
app: nacos
annotations:
pod.alpha.kubernetes.io/initialized: "true"
spec:
affinity: #反亲和性,避免pod在同一个node上
podAntiAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
- labelSelector:
matchExpressions:
- key: "app"
operator: In
values:
- nacos
topologyKey: "kubernetes.io/hostname"
initContainers:
- name: peer-finder-plugin-install
image: nacos/nacos-peer-finder-plugin:1.1
imagePullPolicy: IfNotPresent
volumeMounts:
- mountPath: /home/nacos/plugins/peer-finder
name: data
subPath: peer-finder
containers:
- name: nacos
imagePullPolicy: IfNotPresent
image: nacos/nacos-server:1.4.2
resources:
requests:
memory: "2Gi"
cpu: "500m"
ports:
- containerPort: 8848
name: client-port
- containerPort: 9848
name: client-rpc
- containerPort: 9849
name: raft-rpc
- containerPort: 7848
name: old-raft-rpc
env:
- name: NACOS_REPLICAS
value: "3" #定义集群节点数量
- name: SERVICE_NAME
value: "nacos"
- name: DOMAIN_NAME
value: "cluster.local"
- name: POD_NAMESPACE
valueFrom:
fieldRef:
apiVersion: v1
fieldPath: metadata.namespace
- name: MYSQL_SERVICE_HOST
valueFrom:
configMapKeyRef:
name: nacos-cm #使用configmap中的配置
key: mysql.host
- name: MYSQL_SERVICE_DB_NAME
valueFrom:
configMapKeyRef:
name: nacos-cm #使用configmap中的配置
key: mysql.db.name
- name: MYSQL_SERVICE_PORT
valueFrom:
configMapKeyRef:
name: nacos-cm #使用configmap中的配置
key: mysql.port
- name: MYSQL_SERVICE_USER
valueFrom:
configMapKeyRef: #使用configmap中的配置
name: nacos-cm
key: mysql.user
- name: MYSQL_SERVICE_PASSWORD
valueFrom:
configMapKeyRef:
name: nacos-cm
key: mysql.password
- name: SPRING_DATASOURCE_PLATFORM
value: "mysql" #配置nacos使用mysql数据库
- name: NACOS_SERVER_PORT
value: "8848"
- name: NACOS_APPLICATION_PORT
value: "8848"
- name: PREFER_HOST_MODE
value: "hostname"
livenessProbe:
httpGet:
path: /nacos/actuator/health
port: 8848
initialDelaySeconds: 10
periodSeconds: 10
readinessProbe:
httpGet:
path: /nacos/actuator/health
port: 8848
initialDelaySeconds: 10
periodSeconds: 10
startupProbe:
tcpSocket:
port: 8848
failureThreshold: 30
periodSeconds: 10
volumeMounts:
- name: data
mountPath: /home/nacos/plugins/peer-finder
subPath: peer-finder #该配置会在挂载的路径中单独创建一个该名称的目录
- name: data
mountPath: /home/nacos/data
subPath: data #该配置会在挂载的路径中单独创建一个该名称的目录
- name: data
mountPath: /home/nacos/logs
subPath: logs #该配置会在挂载的路径中单独创建一个该名称的目录
volumeClaimTemplates: #使用pvc模板,使pvc自动创建,然后自动绑定pv
- metadata:
name: data
spec:
accessModes: [ "ReadWriteMany" ]
storageClassName: "nacos-pv" #使用模板名称,去对应的模板名称中匹配pv
resources:
requests:
storage: 40Gi
selector:
matchLabels:
app: nacos
创建各项yaml文件对应的服务
kubectl apply -f pv.yaml
kubectl apply -f service.yaml
kubectl apply -f service-nodeport.yaml
kubectl apply -f configmap.yaml
kubectl apply -f setafulset.yaml
查看服务是否正常
kubectl get pv
kubectl get pvc -n nacos
kubectl get configmap -n nacos
kubectl get all -n nacos
访问nacos web
http://10.1.60.14:30002/
初始用户名nacos 密码nacos