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

bash 复制代码
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

bash 复制代码
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

bash 复制代码
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

bash 复制代码
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

bash 复制代码
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

相关推荐
xiaowu0803 分钟前
IEnumerable、IEnumerator接口与yield return关键字的相关知识
java·开发语言·算法
笨手笨脚の6 分钟前
深入理解 Java 虚拟机-01 JVM 内存模型
java·jvm··虚拟机栈·方法区
天骄t12 分钟前
HTML入门:从基础结构到表单实战
linux·数据库
大聪明-PLUS13 分钟前
了解 Linux 系统中用于流量管理的 libnl 库
linux·嵌入式·arm·smarc
王家视频教程图书馆14 分钟前
android java 开发网路请求库那个好用请列一个排行榜
android·java·开发语言
花卷HJ14 分钟前
Android 文件工具类 FileUtils(超全封装版)
android·java
食咗未15 分钟前
Linux USB HOST EXTERNAL VIRTUAL COM PORT
linux·驱动开发
rchmin15 分钟前
ThreadLocal内存泄漏机制解析
java·jvm·内存泄露
黎雁·泠崖17 分钟前
Java 方法栈帧深度解析:从 JIT 汇编视角,打通 C 与 Java 底层逻辑
java·c语言·汇编
java资料站22 分钟前
springBootAdmin(sba)
java