Spring Cloud入门------ (1)Spring Cloud Alibaba生态组件Nacos3.0本地部署
基于Nacos的服务注册与服务发现
Nacos3.0本地部署
-
基于Docker Desktop配置Kubernetes集群,可以参考之前的博客
-
进入nacos下载页面,参考nacos官网部署文档
https://nacos.io/docs/latest/quickstart/quick-start-kubernetes/
-
下载nacos
shellgit clone https://github.com/nacos-group/nacos-k8s.git cd nacos-k8s下面会有很多创建文件拉取等基于linux的命令动作,可以使用git bash或者cmder,或者自己查找window下cmd或powershell的命令
-
使用nacos的快速启动模式
使用此方式快速启动,请注意这是没有使用持久化卷的,可能存在数据丢失风险
编辑
/deploy/nacos/nacos-quick-start.yaml文件,添加如下3个环境变量:-
NACOS_AUTH_TOKEN: Nacos 用于生成JWT Token的密钥,使用长度大于32字符的字符串,再经过Base64编码。可以直接通过代码生成,也可以利用在线工具生成UUID后再Base64编码 -
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 -
-
创建
nacos的命名空间为了方便管理资源建议不要再
default命名空间启动nacos,新建一个nacos的命名空间shellkubectl create namespace nacos查看是否创建成功
shellkubectl get namespaces -
进入nacos-k8s目录下,查看nacos依赖mysql的初始化脚本
shellcd nacos-k8s vim deploy/mysql/mysql-init.shshell#!/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文件夹shellmkdir -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" -
修改
./deploy/mysql/mysql-local.yaml的初始化挂载路径:这里顺便能看到nacos的数据库用户与密码分别都是
nacos,数据库为nacos_devtestyamlapiVersion: 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的绝对路径 -
在
nacos的命名空间下启动mysqlshellkubectl create -f ./deploy/mysql/mysql-local.yaml -n nacos -
启动mysql后进入mysql的容器
shell;kubectl get pods -n nacos
shellkubect.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
- 在
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
