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 先把仓库拉到本地
git clone git@github.com:nacos-group/nacos-k8s.git
3.2 安装nacos-operator
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:
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
:
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
的依赖,因为我只使用配置中心,我只引入了
<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初始化脚本