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

相关推荐
七夜zippoe14 小时前
Spring WebFlux核心原理-对比Servlet与响应式模型
java·spring·servlet·长连接·webflux·短连接
superman超哥14 小时前
Rust API 设计的零成本抽象原则:性能与表达力的完美统一
开发语言·后端·rust·rust api·抽象原则·性能与表达力
trayvontang14 小时前
Spring Gateway常用过滤器(限流、熔断等)
spring·gateway·spring gateway·gateway常用过滤器
IT 行者14 小时前
Spring Security 6.x CSRF Token增强:从XorCsrfTokenRequestAttributeHandler到安全实践
安全·spring·spring security·csrf
superman超哥14 小时前
Rust 所有权的三大基本规则:内存安全的类型系统基石
开发语言·后端·rust·内存安全·rust所有权·基本规则·系统基石
superman超哥14 小时前
Rust 线程安全性保证(Send 与 Sync):编译期并发安全的类型系统
开发语言·后端·rust·编程语言·并发安全·send与sync·rust线程
IT_陈寒14 小时前
SpringBoot 3.2 性能飞跃:5个优化策略让你的应用提速40%
前端·人工智能·后端
indexsunny14 小时前
互联网大厂Java面试实录:从Spring Boot到微服务实战解析
java·spring boot·spring cloud·kafka·microservices·java interview·software development
BingoGo14 小时前
PHP 高效的标准库 SPL 全面指南
后端·php