一、前言
在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/
找到nacos库初始化脚本,在nacos库中导入
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: 40GiaccessModes:- ReadWriteManypersistentVolumeReclaimPolicy: Retainnfs:path: /share/k8s/nacos/nacos01server: 10.1.60.22
---
apiVersion: v1
kind: PersistentVolume
metadata:name: nacos-pv1
spec:storageClassName: nacos-pv #定义模板匹配名称,用于给pvc自动匹配capacity:storage: 40GiaccessModes:- ReadWriteManypersistentVolumeReclaimPolicy: Retainnfs:path: /share/k8s/nacos/nacos02server: 10.1.60.22
---
apiVersion: v1
kind: PersistentVolume
metadata:name: nacos-pv2
spec:storageClassName: nacos-pv #定义模板匹配名称,用于给pvc自动匹配capacity:storage: 40GiaccessModes:- ReadWriteManypersistentVolumeReclaimPolicy: Retainnfs:path: /share/k8s/nacos/nacos03server: 10.1.60.22
编辑configmap配置文件
vi configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:name: nacos-cmnamespace: nacos
data:mysql.host: "10.1.60.8" #数据库地址mysql.db.name: "nacos" #nacos数据存储库名称mysql.port: "6033" #数据库端口,这里使用了proxysql所以是6033mysql.user: "root" #数据库用户名mysql.password: "12345678" #数据库用密码
编辑service配置文件
这里需要两个service服务,一个给nacos提供无头服务,一个给nacos提供对外访问
vi service.yaml
apiVersion: v1
kind: Service
metadata:name: nacosnamespace: nacoslabels:app: nacos
spec:publishNotReadyAddresses: trueclusterIP: None #无头服务中配置clusterip为noneports:- port: 8848name: servertargetPort: 8848- port: 9848 #选举端口name: client-rpctargetPort: 9848## 兼容1.4.x版本的选举端口- port: 7848name: old-raft-rpctargetPort: 7848selector:app: nacos
vi service-nodeport.yaml
kind: Service
apiVersion: v1
metadata:name: nacos-nodeportnamespace: nacoslabels:app: nacos
spec:type: NodePortports:- name: http-8848protocol: TCPport: 8848nodePort: 30002targetPort: 8848- port: 9848 #对外提供服务的其实可以把这里删了,选举端口不用对外服务name: client-rpctargetPort: 9848selector:app: nacos
编辑setafulset配置文件
vi setafulset.yaml
apiVersion: apps/v1
kind: StatefulSet
metadata:name: nacosnamespace: nacos
spec:podManagementPolicy: Parallel #对setafulset的pod进行并行操作,而不是像deployment一样处理完一个pod再到下一个podserviceName: nacosreplicas: 3template:metadata:labels:app: nacosannotations:pod.alpha.kubernetes.io/initialized: "true"spec:affinity: #反亲和性,避免pod在同一个node上podAntiAffinity:requiredDuringSchedulingIgnoredDuringExecution:- labelSelector:matchExpressions:- key: "app"operator: Invalues:- nacostopologyKey: "kubernetes.io/hostname"initContainers:- name: peer-finder-plugin-installimage: nacos/nacos-peer-finder-plugin:1.1imagePullPolicy: IfNotPresentvolumeMounts:- mountPath: /home/nacos/plugins/peer-findername: datasubPath: peer-findercontainers:- name: nacosimagePullPolicy: IfNotPresentimage: nacos/nacos-server:1.4.2resources:requests:memory: "2Gi"cpu: "500m"ports:- containerPort: 8848name: client-port- containerPort: 9848name: client-rpc- containerPort: 9849name: raft-rpc- containerPort: 7848name: old-raft-rpcenv:- name: NACOS_REPLICASvalue: "3" #定义集群节点数量- name: SERVICE_NAMEvalue: "nacos"- name: DOMAIN_NAMEvalue: "cluster.local"- name: POD_NAMESPACEvalueFrom:fieldRef:apiVersion: v1fieldPath: metadata.namespace- name: MYSQL_SERVICE_HOSTvalueFrom:configMapKeyRef:name: nacos-cm #使用configmap中的配置key: mysql.host - name: MYSQL_SERVICE_DB_NAMEvalueFrom:configMapKeyRef:name: nacos-cm #使用configmap中的配置key: mysql.db.name- name: MYSQL_SERVICE_PORTvalueFrom:configMapKeyRef:name: nacos-cm #使用configmap中的配置key: mysql.port- name: MYSQL_SERVICE_USERvalueFrom:configMapKeyRef: #使用configmap中的配置name: nacos-cmkey: mysql.user- name: MYSQL_SERVICE_PASSWORDvalueFrom:configMapKeyRef:name: nacos-cmkey: mysql.password- name: SPRING_DATASOURCE_PLATFORMvalue: "mysql" #配置nacos使用mysql数据库- name: NACOS_SERVER_PORTvalue: "8848"- name: NACOS_APPLICATION_PORTvalue: "8848"- name: PREFER_HOST_MODEvalue: "hostname"livenessProbe:httpGet:path: /nacos/actuator/healthport: 8848initialDelaySeconds: 10periodSeconds: 10readinessProbe:httpGet:path: /nacos/actuator/healthport: 8848initialDelaySeconds: 10periodSeconds: 10startupProbe:tcpSocket:port: 8848failureThreshold: 30periodSeconds: 10volumeMounts:- name: datamountPath: /home/nacos/plugins/peer-findersubPath: peer-finder #该配置会在挂载的路径中单独创建一个该名称的目录- name: datamountPath: /home/nacos/datasubPath: data #该配置会在挂载的路径中单独创建一个该名称的目录- name: datamountPath: /home/nacos/logssubPath: logs #该配置会在挂载的路径中单独创建一个该名称的目录volumeClaimTemplates: #使用pvc模板,使pvc自动创建,然后自动绑定pv- metadata:name: dataspec:accessModes: [ "ReadWriteMany" ]storageClassName: "nacos-pv" #使用模板名称,去对应的模板名称中匹配pvresources:requests:storage: 40Giselector: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