K8S中部署 Nacos 集群

1. 准备

  • Git
  • K8S
  • kubectl
  • helm

咱也没想到 K8S 部署系列能搞这么多次,我一个开发天天干运维的活,前端后端运维测试工程师实至名归。

2. 方案选择

https://github.com/nacos-group/nacos-k8s

我替你们看了一下,有好几种方式能部署,但我们选择其中一种。

主要是其他的部署方式我也不想验证啊,我只选了最简单的 nacos-operator。跟着我部署,包跑起来的。

3. 利用 nacos-operator 搭建 Nacos 集群

先看看文档:https://github.com/nacos-group/nacos-k8s/blob/master/operator/README-CN.md

3.1 先把仓库拉到本地

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

3.2 安装nacos-operator

shell 复制代码
cd nacos-k8s/operator

helm install nacos-operator ./chart/nacos-operator --namespace infrastructure

安装完成之后提示:

复制代码
NAME: nacos-operator

LAST DEPLOYED: Fri Jun 28 09:10:41 2024

NAMESPACE: infrastructure

STATUS: deployed

REVISION: 1

3.3 修改配置文件并生效

复制代码
# 配置文件示例目录
cd config/samples

# 这个表示集群并使用MySQL进行持久化
vim nacos_cluster_mysql.yaml

nacos_cluster_mysql.yaml:

yaml 复制代码
apiVersion: nacos.io/v1alpha1
kind: Nacos
metadata:
  name: nacos-dev
  namespace: infrastructure
spec:
  type: cluster
  image: nacos/nacos-server:v2.2.3
  replicas: 1
  env:
    # 开启鉴权
    - name: NACOS_AUTH_ENABLE
      value: "true"
    - name: NACOS_AUTH_TOKEN
      value: "XXXXXXXXXX"
    - name: NACOS_AUTH_IDENTITY_KEY
      value: "XXXXXX"
    - name: NACOS_AUTH_IDENTITY_VALUE
      value: "XXXXXX"
  resources:
    requests:
      cpu: 100m
      memory: 512Mi
    limits:
      cpu: 500m
      memory: 1Gi
  mysqlInitImage: "registry.cn-hangzhou.aliyuncs.com/choerodon-tools/mysql-client:10.2.15-r0"
  database:
    type: mysql
    mysqlHost: <HOST>
    mysqlDb: <DB>
    mysqlUser: <USER>
    mysqlPort: <PORT>
    mysqlPassword: <PASSWROD>
  config: |
    management.endpoints.web.exposure.include=*

开启鉴权:Nacos 提供了一个管理后台,部署成功后通过 host:port/nacos 访问。如果我们将这个路径暴露到公网,那么任何人都能访问。可怕的是, Nacos API 接口的 path 也是 /nacos

那么一旦开启,配置中心API 将直接对外,配置中心里面的东西是什么就不用多说了。

也有同学说我保证它只能在内网访问就行了吧?这当然可以,Nacos 也是这样说的。

但我还是建议打开这个开关,因为一旦有人非常不小心暴露了出去,那你就得提桶。我们应该做的是把鉴权打开,然后把管理员权限给老板,如果他没改默认密码,我们还要提醒他修改默认。懂我意思了吧?

mysqlInitImage:这是 initContainer 的镜像,initContainer 是 k8s中的概念,表示服务启动之前先做一些操作。在这个场景中是连接上MySQL,然后创建库表这些操作。我实测没有生效,会报错 No Datasource set,所以需要我们自己先初始化好库表以及插入必要的记录。

执行这个MySQL初始化脚本

No Datasource set 有很多的原因,有可能是我刚刚的这种情况,也有可能MySQL用户没有权限等等。遇到问题可以在 issue 看看其他大佬的骚操作。
Issues · nacos-group/nacos-k8s (github.com)

3.4 验证集群是否可用

根据刚刚的配置文件,我们可以访问这个路径来查看Nacos的管理后台,当然,这是通过内网访问的。http://nacos-dev-headless.infrastructure:8848/nacos,访问能看见管理后台就大功告成了。可以使用默认的账户密码登录:nacos/nacos

3.5 在Springboot程序中集成Nacos

先在管理后台创建好命名空间和dataId 配置文件等

了解Springboot 的配置读取机制,想装x的(bushi)看这个:21. Externalized Configuration (spring.io)英语看不懂就看这个:Felo搜索 - 你的免费AI智能搜索引擎,不是把中文的内容给你了你都能挑出毛病?好吧!

太长不看就让我给你嚼一下,然后喂给你:

工作目录下的 config 目录中的配置文件先加载,配置文件 bootstrap 比 application 先加载。所以我们只要把配置文件挂载到工作目录下的config中就行了。

老规矩,先整理好配置 bootstrap.properties

properties 复制代码
spring.application.name=<app-name>
server.port=8080
spring.profiles.active=<profile>

spring.cloud.nacos.config.server-addr=nacos-dev-0.nacos-dev-headless.infrastructure.svc.cluster.local:8848
spring.cloud.nacos.config.enabled=true
spring.cloud.nacos.config.refresh-enabled=true
spring.cloud.nacos.config.file-extension=properties
spring.cloud.nacos.username=<username>
spring.cloud.nacos.password=<password>
spring.cloud.nacos.config.namespace=74a2a3bc-cded-4090-b326-993dba2871e6
spring.cloud.nacos.config.group=DEFAULT_GROUP

spring.cloud.nacos.config.shared-configs[0].data-id=redis-dev.properties
spring.cloud.nacos.config.shared-configs[1].data-id=kafka-dev.properties
spring.cloud.nacos.config.shared-configs[2].data-id=xxl-job-dev.properties
spring.cloud.nacos.config.shared-configs[3].data-id=druid-dev.properties

然后,在 k8s 配置文件中挂载配置文件:ConfigMaps | Kubernetes 或者这个 k8s deployment挂载配置文件-Felo搜索

最后当然是在应用中引入 Nacos 的依赖,因为我只使用配置中心,我只引入了

xml 复制代码
<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
    <version>2.2.10-RC1</version>
</dependency>

启动服务,查看监听查询

elegant!

Ref

集群模式部署 | Nacos 官网

nacos-operator方式部署

Nacos API 接口

属性配置列表

MySQL初始化脚本

相关推荐
chuanauc5 小时前
Kubernets K8s 学习
java·学习·kubernetes
小张是铁粉5 小时前
docker学习二天之镜像操作与容器操作
学习·docker·容器
烟雨书信5 小时前
Docker文件操作、数据卷、挂载
运维·docker·容器
IT成长日记5 小时前
【Docker基础】Docker数据卷管理:docker volume prune及其参数详解
运维·docker·容器·volume·prune
这儿有一堆花5 小时前
Docker编译环境搭建与开发实战指南
运维·docker·容器
LuckyLay5 小时前
Compose 高级用法详解——AI教你学Docker
运维·docker·容器
Uluoyu5 小时前
redisSearch docker安装
运维·redis·docker·容器
IT成长日记10 小时前
【Docker基础】Docker数据持久化与卷(Volume)介绍
运维·docker·容器·数据持久化·volume·
疯子的模样14 小时前
Docker 安装 Neo4j 保姆级教程
docker·容器·neo4j
虚伪的空想家15 小时前
rook-ceph配置dashboard代理无法访问
ceph·云原生·k8s·存储·rook