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

http://10.1.60.14:30002/

初始用户名nacos  密码nacos 

  • 22
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
你可以使用以下的 YAML 文件来部署 Nacos 集群: ```yaml apiVersion: v1 kind: Namespace metadata: name: nacos --- apiVersion: v1 kind: Service metadata: name: nacos-service namespace: nacos spec: selector: app: nacos ports: - protocol: TCP port: 8848 targetPort: 8848 type: LoadBalancer --- apiVersion: apps/v1 kind: Deployment metadata: name: nacos-deployment namespace: nacos spec: replicas: 3 selector: matchLabels: app: nacos template: metadata: labels: app: nacos spec: containers: - name: nacos-server image: nacos/nacos-server:v1.4.1 ports: - containerPort: 8848 env: - name: MODE value: "cluster" - name: SPRING_DATASOURCE_PLATFORM value: "mysql" - name: MYSQL_SERVICE_HOST value: "mysql-host" # 修改为实际的 MySQL 主机名或 IP 地址 - name: MYSQL_SERVICE_DB_NAME value: "nacos" # 修改为实际的数据库名称 - name: MYSQL_SERVICE_PORT value: "3306" # 修改为实际的 MySQL 端口号 - name: MYSQL_SERVICE_USER value: "nacos" # 修改为实际的数据库用户名 - name: MYSQL_SERVICE_PASSWORD value: "nacos" # 修改为实际的数据库密码 ``` 请注意,上述 YAML 文件假设你已经有一个可用的 MySQL 数据库,并且将其相关信息填入了环境变量中。你需要修改 `MYSQL_SERVICE_HOST`,`MYSQL_SERVICE_DB_NAME`,`MYSQL_SERVICE_PORT`,`MYSQL_SERVICE_USER`,`MYSQL_SERVICE_PASSWORD` 这些变量的值,以适应你的实际环境。 你可以使用 `kubectl apply -f <yaml文件名>` 命令来应用这个 YAML 文件并部署 Nacos 集群

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值