k8s集群内部署nacos集群
一、前言
? ? 在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: 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
初始用户名nacos? 密码nacos?
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!