命令行配置文件部署

环境准备

确认要部署的k8s环境正常,git工具已安装

下载 nacos-k8s 项目

git clone https://github.com/nacos-group/nacos-k8s.git
cd nacos-k8s

快速启动

cd nacos-k8s
chmod +x quick-startup.sh
./quick-startup.sh

验证Nacos服务是否启动成功

通过kubectl logs -f $pod_name命令,查看Nacos服务启动日志,如果看到如下日志,说明服务启动成功。

Nacos started successfully in xxxx mode. use xxxx storage

可以通过下列服务,快速检验Nacos的功能。

访问Nacos控制台页面

link:http://${cluster-ip}:8848/nacos/

Rancher表单界面部署

现在k8s服务为了方便管理和操作一般都配置有ui管理页面,所以我们下面用k8s的管理工具之一的rancher来配置一下nacos集群

创建mysql存储服务

这里创建的mysql是单节点的不是集群,如果你已经部署了相关的存储服务可以跳过这一步

创建数据卷

配置mysql的密码和配置文件

配置密码

配置mysql的配置文件

配置文件是我自己随便找的写上去的,其他人可以从网上找到更详细的配置文件进行替换

[mysqld]
pid-file=/var/run/mysqld/mysqld.pid
socket=/var/run/mysqld/mysqld.sock
datadir=/var/lib/mysql
lower_case_table_names=1
character-set-server=utf8mb4

[client]
port = 3306
default-character-set=utf8mb4

[mysqldump]
max_allowed_packet=512M

配置工作负载(容器)

以上就是mysql服务的创建过程。

创建nacos集群服务

在数据库中创建对应的库表

sql文件可以通过下载官方的代码,在压缩包中找到,官网地址:https://nacos.io/download/nacos-server/

也可以点击这里直接下载导入数据库中,数据库名称自定义

mysql-schema.sql

创建nacos-headless

headless 服务介绍

在 Kubernetes (K8S) 中,headless 服务(无头服务)是一种特殊类型的服务,它与普通的 K8S 服务有所不同。通常情况下,服务(Service)的作用是为一组后端 Pod 提供一个稳定的网络入口,使得这些 Pod 可以通过服务的名称或 IP 地址被访问到。

Headless 服务的主要特点如下:

1、不分配 ClusterIP:
  普通的服务会自动分配一个集群内部的虚拟 IP(ClusterIP),这个 IP 在整个集群范围内是唯一的,并且可以通过这个 IP 访问到服务后端的 Pod。
  相比之下,headless 服务不会被分配 ClusterIP,这意味着它没有一个中心化的入口地址。

2、直接暴露 Pod IP:
  Headless 服务允许客户端直接访问其后端 Pod 的 IP 地址。每个 Pod 都有一个固定的 IP 地址,因此客户端可以直接通过这些 IP 地址来访问 Pod。
  这种方式特别适用于需要知道后端 Pod 实际 IP 地址的情况,例如数据库复制场景。

3、DNS 解析:
  当创建一个 headless 服务时,Kubernetes DNS 会为该服务创建特殊的 DNS 记录。这些记录包含所有匹配选择器(selector)的 Pod 的 IP 地址。
  客户端可以通过查询服务的 DNS 名称获取到后端 Pod 的列表。这意味着客户端可以实现自己的负载均衡策略,而不是依赖于服务提供的内置负载均衡。

4、使用场景:
  Headless 服务非常适合用于需要多播或者直接 Pod-to-Pod 通信的场景。
  常见的例子包括数据库集群、分布式存储系统等,其中各个节点之间需要直接通信,而不需要通过一个中心化的服务代理。

5、与普通服务结合使用:
  有时候,你可能需要同时拥有 headless 服务和普通的服务。例如,你可以创建一个 headless 服务来提供 Pod 的直接访问,同时创建另一个服务(比如 NodePort 或 LoadBalancer 类型)来为外部流量提供统一的入口。

综上所述,headless 服务主要用于那些不需要中心化负载均衡逻辑的应用场景,而是希望直接与后端 Pod 交互的情况。这种方式提供了更多的灵活性和控制能力,但同时也要求应用程序具备适当的发现机制和负载均衡策略。

以上引用于 黄嘉波 —— 在K8S中,headless服务是什么? https://www.cnblogs.com/huangjiabobk/p/18324872

创建headless


创建nacos-db配置的ConfigMap

创建nacos集群服务(StatefulSet)

注:配置端口时client-rpc、raft-rpc端口时,需要再client端口的基础上分别+1000+1001 例如client端口配置的是30110 则client-rpc的端口则必须配置为31110,raft-rpc的端口必须配置为31111。否则再客户端连接时会抛出 Client not connected, current status:STARTING异常。

参数

NACOS_REPLICAS

3

MYSQL_SERVICE_HOST

mysql.host

MYSQL_SERVICE_DB_NAME

mysql.db.name

MYSQL_SERVICE_PORT

mysql.port

MYSQL_SERVICE_USER

mysql.user

MYSQL_SERVICE_PASSWORD

mysql.password

SPRING_DATASOURCE_PLATFORM

mysql

NACOS_SERVER_PORT

8848

NACOS_APPLICATION_PORT

8848

PREFER_HOST_MODE

hostname

NACOS_SERVERS

nacos-0.nacos-headless.{部署的命名空间}.svc.cluster.local:8848

nacos-1.nacos-headless.{部署的命名空间}.svc.cluster.local:8848

nacos-2.nacos-headless.{部署的命名空间}.svc.cluster.local:8848

例:

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

完成以上步骤后,我们就可以访问控制台了

访问控制台验证

link:http://${cluster-ip}:${client-export-port}/nacos/

开启鉴权

经过以上步骤后我们已经成功创建了nacos集群,但此时的nacos集群是未开启鉴权的,也就是我们不用再登录页面输入账号密码就直接可以登录进去,但是这样肯定是不安全的,所以我们要开启鉴权。开启鉴权的方式很简单只需要再环境变量中增加下面几个参数即可

  • Nacos是一个内部微服务组件,需要在可信的内部网络中运行,不可暴露在公网环境,防止带来安全风险。

  • Nacos提供简单的鉴权实现,为防止业务错用的弱鉴权体系,不是防止恶意攻击的强鉴权体系。

参数名

描述

默认值

NACOS_AUTH_ENABLE

是否开启鉴权功能

false

NACOS_AUTH_SYSTEM_TYPE

鉴权类型

nacos

NACOS_AUTH_TOKEN

默认鉴权插件用于生成用户登陆临时accessToken所使用的密钥,使用老版本默认值有安全风险

这个token有一些特殊限制,长度必须大于等于32位,且要经过base64加密

无默认值

NACOS_AUTH_TOKEN_EXPIRE_SECONDS

用户登陆临时accessToken的过期时间

18000

NACOS_AUTH_IDENTITY_KEY

用于服务端之间请求的身份识别key,使用老版本默认值有安全风险

无默认值

NACOS_AUTH_IDENTITY_VALUE

用于服务端之间请求的身份识别value,使用老版本默认值有安全风险

无默认值

NACOS_AUTH_USER_AGENT_AUTH_WHITE_ENABLE

是否使用useragent白名单,主要用于适配老版本升级,置为true时有安全风险

false

NACOS_AUTH_CACHE_ENABLE

是否开启Token缓存,默认关闭,开启后accessToken会缓存到内存中,但权限更新时可能存在15s左右的延迟。

false

镜像环境变量

属性名称

描述

选项

MODE

系统启动方式: 集群/单机,对应nacos.standalone

cluster/standalone 默认 cluster

NACOS_SERVERS

集群地址,对应nacos.member.list

ip1

空格ip2

空格ip3

PREFER_HOST_MODE

支持IP还是域名模式,对应nacos.inetutils.prefer-hostname-over-ip

hostname/ip 默认IP

NACOS_SERVER_PORT

Nacos 运行端口,对应server.port

默认8848

NACOS_SERVER_IP

多网卡模式下可以指定IP,对应nacos.server.ip

SPRING_DATASOURCE_PLATFORM

单机模式下支持MYSQL数据库,对应spring.sql.init.platform

mysql / 空 默认:空

MYSQL_SERVICE_HOST

数据库 连接地址

MYSQL_SERVICE_PORT

数据库端口

默认 : 3306

MYSQL_SERVICE_DB_NAME

数据库库名

MYSQL_SERVICE_USER

数据库用户名

MYSQL_SERVICE_PASSWORD

数据库用户密码

MYSQL_SERVICE_DB_PARAM

数据库连接参数

默认:

characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&useSSL=false

MYSQL_DATABASE_NUM

数据库个数

默认:1

JVM_XMS

-Xms

默认 :1g

JVM_XMX

-Xmx

默认 :1g

JVM_XMN

-Xmn

512m

JVM_MS

- XX

默认 :128m

JVM_MMS

-XX

默认 :320m

NACOS_DEBUG

是否开启远程DEBUG

y/n 默认

TOMCAT_ACCESSLOG_ENABLED

server.tomcat.accesslog.enabled

默认

NACOS_AUTH_SYSTEM_TYPE

权限系统类型选择,目前只支持nacos类型

默认

NACOS_AUTH_ENABLE

是否开启权限系统,对应nacos.core.auth.enabled

默认

NACOS_AUTH_TOKEN_EXPIRE_SECONDS

token 失效时间

默认 :18000

NACOS_AUTH_TOKEN

token

注意:该环境变量的默认值在Nacos 2.2.1版本中已移除,开启鉴权时需要指定

NACOS_AUTH_CACHE_ENABLE

权限缓存开关 ,开启后权限缓存的更新默认有15秒的延迟

默认 : false

MEMBER_LIST

通过环境变量的方式设置集群地址

例子:192.168.16.101:8847?raft_port=8807,192.168.16.101?raft_port=8808,192.168.16.101:8849?raft_port=8809

EMBEDDED_STORAGE

是否开启集群嵌入式存储模式

embedded 默认 : none

NACOS_AUTH_CACHE_ENABLE

nacos.core.auth.caching.enabled

default : false

NACOS_AUTH_USER_AGENT_AUTH_WHITE_ENABLE

nacos.core.auth.enable.userAgentAuthWhite

default : false

NACOS_AUTH_IDENTITY_KEY

nacos.core.auth.server.identity.key

注意:该环境变量的默认值在Nacos 2.2.1版本中已移除,开启鉴权时需要指定

NACOS_AUTH_IDENTITY_VALUE

nacos.core.auth.server.identity.value

注意:该环境变量的默认值在Nacos 2.2.1版本中已移除,开启鉴权时需要指定

NACOS_SECURITY_IGNORE_URLS

nacos.security.ignore.urls

default : /,/error,/**/*.css,/**/*.js,/**/*.html,/**/*.map,/**/*.svg,/**/*.png,/**/*.ico,/console-fe/public/**,/v1/auth/**,/v1/console/health/**,/actuator/**,/v1/console/server/**

DB_POOL_CONNECTION_TIMEOUT

数据库连接池超时时间,单位为毫秒

默认 : 30000

NACOS_CONSOLE_UI_ENABLED

nacos.console.ui.enabled

default : true

NACOS_CORE_PARAM_CHECK_ENABLED

nacos.core.param.check.enabled

default : true