Spring Cloud入门—— (1)Spring Cloud Alibaba生态组件Nacos3.0本地部署

Spring Cloud入门------ (1)Spring Cloud Alibaba生态组件Nacos3.0本地部署

基于Nacos的服务注册与服务发现

Nacos3.0本地部署

Nacos官网地址

  1. 基于Docker Desktop配置Kubernetes集群,可以参考之前的博客

    Kubernetes入门笔记 ------(4)Windows搭建k8s测试集群

  2. 进入nacos下载页面,参考nacos官网部署文档

    https://nacos.io/docs/latest/quickstart/quick-start-kubernetes/

  3. 下载nacos

    shell 复制代码
    git clone https://github.com/nacos-group/nacos-k8s.git
    cd nacos-k8s

    下面会有很多创建文件拉取等基于linux的命令动作,可以使用git bash或者cmder,或者自己查找window下cmd或powershell的命令

  4. 使用nacos的快速启动模式

    使用此方式快速启动,请注意这是没有使用持久化卷的,可能存在数据丢失风险

    编辑/deploy/nacos/nacos-quick-start.yaml文件,添加如下3个环境变量:

    • NACOS_AUTH_TOKEN: Nacos 用于生成JWT Token的密钥,使用长度大于32字符的字符串,再经过Base64编码。可以直接通过代码生成,也可以利用在线工具生成UUID后再Base64编码

      https://1024tools.com/uuid

      https://tool.chinaz.com/tools/base64.aspx

    • NACOS_AUTH_IDENTITY_KEY: Nacos Server端之间 Inner API的身份标识的Key,必填。

    • NACOS_AUTH_IDENTITY_VALUE: Nacos Server端之间 Inner API的身份标识的Value,必填。

    需要添加在nacos-headless服务下nacos容器的env下:

    yaml 复制代码
    ---
    apiVersion: v1
    kind: Service
    metadata:
      name: nacos-headless
      ....
    
                - name: NACOS_SERVERS
                  value: "nacos-0.nacos-headless.default.svc.cluster.local:8848 nacos-1.nacos-headless.default.svc.cluster.local:8848 nacos-2.nacos-headless.default.svc.cluster.local:8848"
                - name: NACOS_AUTH_TOKEN
                  value: ${your_nacos_auth_secret_token}
                - name: NACOS_AUTH_IDENTITY_KEY
                  value: ${your_nacos_server_identity_key}
                - name: NACOS_AUTH_IDENTITY_VALUE
                  value: ${your_nacos_server_identity_value}
      selector:
        matchLabels:
          app: nacos
  5. 创建nacos的命名空间

    为了方便管理资源建议不要再default命名空间启动nacos,新建一个nacos的命名空间

    shell 复制代码
    kubectl create namespace nacos

    查看是否创建成功

    shell 复制代码
    kubectl get namespaces
  6. 进入nacos-k8s目录下,查看nacos依赖mysql的初始化脚本

    shell 复制代码
    cd nacos-k8s
    vim deploy/mysql/mysql-init.sh
    shell 复制代码
    #!/bin/bash
    set -e
    
    # 加载 NACOS_VERSION
    source .env
    CLEAN_VERSION=${NACOS_VERSION#v}
    # deal -slim
    CLEAN_VERSION=${CLEAN_VERSION%-*}
    
    SCHEMA_URL="https://raw.githubusercontent.com/alibaba/nacos/${CLEAN_VERSION}/distribution/conf/mysql-schema.sql"
    
    TARGET_DIR="/data/mysql-init"
    VERSIONED_FILE="${TARGET_DIR}/${CLEAN_VERSION}-mysql-schema.sql"
    FINAL_FILE="${TARGET_DIR}/mysql-schema.sql"
    
    # 创建目录
    mkdir -p "${TARGET_DIR}"
    
    # 下载 schema 文件
    echo "⬇️  Downloading MySQL schema for Nacos ${CLEAN_VERSION}..."
    curl -sSL "$SCHEMA_URL" -o "${VERSIONED_FILE}"
    
    # 校验下载
    if [ ! -s "${VERSIONED_FILE}" ]; then
      echo "❌ Failed to download schema file from $SCHEMA_URL"
      exit 1
    fi
    
    # 拷贝为标准文件名供 MySQL 初始化使用
    cp "${VERSIONED_FILE}" "${FINAL_FILE}"
    
    # 删除原始版本号文件
    rm -f "${VERSIONED_FILE}"
    
    echo "✅ Downloaded and prepared: ${FINAL_FILE}"

    其中NACOS_VERSION可以在.env文件中看到,如这里是v3.1.1版本,需要去掉首字母v

    这里脚本主要是下载mysql-schema.sql文件,我们在当前目录下新建data/mysql-init文件夹

    shell 复制代码
    mkdir -p data/mysql-init
    curl -sSl "https://raw.githubusercontent.com/alibaba/nacos/3.1.1/distribution/conf/mysql-schema.sql" -o "data/mysql-init/mysql-schema.sql"
  7. 修改./deploy/mysql/mysql-local.yaml的初始化挂载路径:

    这里顺便能看到nacos的数据库用户与密码分别都是nacos,数据库为nacos_devtest

    yaml 复制代码
    apiVersion: v1
    kind: ReplicationController
    metadata:
      name: mysql
      labels:
        name: mysql
    spec:
      replicas: 1
      selector:
        name: mysql
      template:
        metadata:
          labels:
            name: mysql
        spec:
          containers:
          - name: mysql
            image: registry.openanolis.cn/openanolis/mysql:8.0.30-8.6
            ports:
            - containerPort: 3306
            args:
              - "--character-set-server=utf8mb4"
              - "--collation-server=utf8mb4_unicode_ci"
            volumeMounts:
            - name: mysql-data
              mountPath: /var/lib/mysql
            - name: mysql-init
              mountPath: /docker-entrypoint-initdb.d
            env:
            - name: MYSQL_ROOT_PASSWORD
              value: "root"
            - name: MYSQL_DATABASE
              value: "nacos_devtest"
            - name: MYSQL_USER
              value: "nacos"
            - name: MYSQL_PASSWORD
              value: "nacos"
          volumes:
          - name: mysql-data
            hostPath:
              path: /var/lib/mysql
          - name: mysql-init
            hostPath:
              path: E:/developer/xxx/nacos-k8s/data/mysql-init # linux下的路径,修改为windows的绝对路径
  8. nacos的命名空间下启动mysql

    shell 复制代码
    kubectl create -f ./deploy/mysql/mysql-local.yaml  -n nacos
  9. 启动mysql后进入mysql的容器

    shell; 复制代码
    kubectl get pods -n nacos
    shell 复制代码
    kubect.exe exec -it -n nacos mysql-rbmdg -- bash  # 将mysql-rbmdg替换成对应的容器名
    mysql -u nacos -p 
    # 输入密码:nacos
    use nacos_devtest;
    show tables;

如果能看到nacos对应的数据库表示数据库初始化完成,如果没有看到可以手动初始化

shell 复制代码
# 将sql文件传至对应容器的目录下
kubectl exec -n nacosmysql-rbmdg -- mkdir -p /data/mysql-init/
kubectl cp data/mysql-init/mysql-schema.sql nacos/mysql-rbmdg:/data/mysql-init/
# copy完成后进入数据库
mysql -u nacos -p 
# 输入密码:nacos
use nacos_devtest;
show tables;
source /data/mysql-init/mysql-schema.sql
  1. nacos的命名空间下启动nacos
shell 复制代码
kubectl create -f ./deploy/nacos/nacos-quick-start.yaml -n nacos

查看nacos的pod是否成功启动

shell 复制代码
kubectl get pods -n nacos

发现有一个pod处于pending状态

复制代码
kubectl.exe describe pods  -n nacos nacos-2
shell 复制代码
 Warning  FailedScheduling  97s (x4 over 16m)  default-scheduler  0/3 nodes are available: 1 node(s) had untolerated taint {node-role.kubernetes.io/control-plane: }, 2 node(s) didn't match pod anti-affinity rules. preemption: 0/3 nodes are available: 1 Preemption is not helpful for scheduling, 2 No preemption victims found for incoming pod.

意思是本身有反亲和要求,我们有3个节点但是一个节点有污点标签node-role.kubernetes.io/control-plane导致无法部署,查看node

shell 复制代码
kubectl.exe get nodes

其中一个节点是控制面,我们可以扩容一个节点

扩容完成后再次查看ok

相关推荐
ywf12154 分钟前
Spring Integration + MQTT
java·后端·spring
大傻^20 分钟前
Spring AI 2.0 企业级 RAG 架构:混合检索、重排序与多模态知识库
人工智能·spring·架构·多模态·rag·混合检索·重排序
ps酷教程21 分钟前
spring batch动态示例
spring·batch
大傻^25 分钟前
Spring AI 2.0 多模型提供商配置:OpenAI、Gemini、Anthropic 与 Ollama 深度集成
java·人工智能·spring·springai
武超杰27 分钟前
SpringMVC核心功能详解:从RESTful到JSON数据处理
后端·json·restful
代龙涛41 分钟前
WordPress 主题开发指南:模板文件、函数与页面选型规则
开发语言·后端·php·wordpress
代码探秘者42 分钟前
【大模型应用】6.RAG 场景下的向量+关键词混合检索
java·开发语言·人工智能·python·spring
三水不滴1 小时前
Elasticsearch 实战系列(二):SpringBoot 集成 Elasticsearch,从 0 到 1 实现商品搜索系统
经验分享·spring boot·笔记·后端·elasticsearch·搜索引擎
Amour恋空1 小时前
Nacos服务发现与配置
java·后端·服务发现
uzong1 小时前
为什么是你来做?面试中犀利问题的底层逻辑是什么和标准回答模版
后端·面试