本文原文链接:https://blog.csdn.net/xzk9381/article/details/114264549
一、什么是 nacos
Nacos 是阿里开源的服务注册中心与配置中心组件,能够帮助开发人员快速实现动态服务发现、服务配置、服务元数据及流量管理。同时能够与 SpringCloud、Kubernetes、Dubbo 等开源生态无缝集成。
Nacos 支持如下核心特性:
- 服务发现: 支持 DNS 与 RPC 服务发现,也提供原生 SDK 、OpenAPI 等多种服务注册方式和 DNS、HTTP 与 API 等多种服务发现方式。
- 服务健康监测: Nacos 提供对服务的实时的健康检查,阻止向不健康的主机或服务实例发送请求。
- 动态配置服务: Nacos 提供配置统一管理功能,能够帮助我们将配置以中心化、外部化和动态化的方式管理所有环境的应用配置和服务配置。
- 动态 DNS 服务: Nacos 支持动态 DNS 服务权重路由,能够让我们很容易地实现中间层负载均衡、更灵活的路由策略、流量控制以及数据中心内网的简单 DNS 解析服务。
- 服务及其元数据管理: Nacos 支持从微服务平台建设的视角管理数据中心的所有服务及元数据,包括管理服务的描述、生命周期、服务的静态依赖分析、服务的健康状态、服务的流量管理、路由及安全策略、服务的 SLA 以及最首要的 metrics 统计数据。
二、搭建 nacos 集群
在 k8s 中搭建 nacos 集群需要按照如下步骤安装:
- 搭建 MySQL 环境并配置数据持久化存储
- 导入 nacos 数据库表结构
- 搭建 nacos 集群(官方推荐至少 3 个节点)
1. 创建命名空间
首先创建 nacos 集群所需要使用的命名空间 ns-nacos:
---
apiVersion: v1
kind: Namespace
metadata:
name: ns-nacos
labels:
name: ns-nacos
2. 创建存储类
创建一个用于管理 pv 和 pvc 的存储类,新建 storage.yaml 文件,内容如下:
---
kind: StorageClass
apiVersion: storage.k8s.io/v1
metadata:
name: nacos-storage
provisioner: kubernetes.io/no-provisioner
volumeBindingMode: WaitForFirstConsumer
3. 搭建 MySQL 8.0(单节点)
3.1 创建 ConfigMap 存储 MySQL 配置文件
新建 mysql-config.yaml 文件,内容如下:
apiVersion: v1
kind: ConfigMap
metadata:
name: mysql-config
namespace: ns-nacos
labels:
nacos-app: mysql
data:
my.cnf: |-
[client]
default-character-set=utf8mb4
[mysql]
default-character-set=utf8mb4
[mysqld]
max_connections = 2000
secure_file_priv=/var/lib/mysql
max_allowed_packet=256M
sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION
3.2 创建 Secret 存储 MySQL 密码配置
初始化 MySQL 时需要设置密码,可以直接引入 Secret 文件中的变量值来作为密码。新建 mysql-secret.yaml 文件,内容如下:
apiVersion: v1
kind: Secret
metadata:
name: mysql-secret
namespace: ns-nacos
type: Opaque
data:
mysql-user-root-pwd: bmFjb3NfbXlzcWxfYWRtaW4K
3.3 创建 pv 和 pvc
本次搭建集群的存储使用的 cephfs,当前已经将 cephfs 挂载到 k8s 集群的所有节点上,所以创建 pv 和 pvc 的时候,直接使用宿主机目录即可。新建 mysql-pvc.yaml,内容如下:
---
apiVersion: v1
kind: PersistentVolume
metadata:
name: nacos-mysql-pv
spec:
accessModes:
- ReadWriteOnce
capacity:
storage: 500Gi
local:
path: /opt/ops_ceph_data/nacos/mysql-data
nodeAffinity:
required:
nodeSelectorTerms:
- matchExpressions:
- key: nacos-cluster
operator: In
values:
- "true"
persistentVolumeReclaimPolicy: Retain
storageClassName: nacos-storage
---
kind: PersistentVolumeClaim
apiVersion: v1
metadata:
name: nacos-mysql-pvc
namespace: ns-nacos
spec:
accessModes:
- ReadWriteOnce
storageClassName: nacos-storage
resources:
requests:
storage: 500Gi
3.4 创建存储目录并设置 labels
根据上面 pv 中的设置,在本地宿主机中创建目录 /opt/ops_ceph_data/nacos/mysql-data
并在所有的宿主机节点上设置标签 nacos-cluster=true
:
for i in 1 2 3 4 5
do
kubectl label nodes k8s-node${i} nacos-cluster=true
done
3.5 创建 Service
创建一个 Service 用于暴露 MySQL 服务的 3306 端口,新建 mysql-service.yaml 文件,内容如下:
apiVersion: v1
kind: Service
metadata:
name: mysql-service
namespace: ns-nacos
labels:
nacos-app: mysql
spec:
type: NodePort
ports:
- name: mysql-port
port: 3306
targetPort: 3306
nodePort: 30336
selector:
nacos-app: mysql
3.6 创建 Deployment
新建 mysql-pod.yaml 文件,内容如下:
apiVersion: apps/v1
kind: Deployment
metadata:
name: mysql-for-nacos
namespace: ns-nacos
labels:
nacos-app: mysql
spec:
replicas: 1
selector:
matchLabels:
nacos-app: mysql
template:
metadata:
labels:
nacos-app: mysql
spec:
restartPolicy: Always
containers:
- name: mysql
image: mysql:8.0.19
imagePullPolicy: IfNotPresent
ports:
- containerPort: 3306
env:
- name: MYSQL_ROOT_PASSWORD
valueFrom:
secretKeyRef:
name: mysql-secret
key: mysql-user-root-pwd
resources:
limits:
cpu: 2000m
memory: 512Mi
requests:
cpu: 2000m
memory: 512Mi
livenessProbe:
initialDelaySeconds: 60
periodSeconds: 10
timeoutSeconds: 5
successThreshold: 1
failureThreshold: 3
exec:
command: ["mysqladmin", "-uroot", "-p${MYSQL_ROOT_PASSWORD}", "ping"]
readinessProbe:
initialDelaySeconds: 60
periodSeconds: 10
timeoutSeconds: 5
successThreshold: 1
failureThreshold: 3
exec:
command: ["mysqladmin", "-uroot", "-p${MYSQL_ROOT_PASSWORD}", "ping"]
volumeMounts:
- name: data
mountPath: /var/lib/mysql
- name: config
mountPath: /etc/mysql/conf.d/my.cnf
subPath: my.cnf
- name: localtime
readOnly: true
mountPath: /etc/localtime
volumes:
- name: data
persistentVolumeClaim:
claimName: nacos-mysql-pvc
- name: config
configMap:
name: mysql-config
- name: localtime
hostPath:
type: File
path: /usr/share/zoneinfo/Asia/Shanghai
3.7 导入 nacos 数据库结构
应用上面的文件创建 MySQL 服务后,需要将 nacos 的数据库结构导入到数据库中。
在导入 SQL 之前,需要提前创建好数据库:
CREATE DATABASE nacos_config DEFAULT CHARACTER SET UTF8mb4 COLLATE utf8mb4_bin;
nacos 数据库结构 sql 语句可以在 nacos 源码包中获取,将源码包解压后,在 conf 目录下可以看到名为 nacos-mysql.sql 的文件,将该文件导入 nacos_config 库即可。
本文原文链接:https://blog.csdn.net/xzk9381/article/details/114264549
4. 搭建 nacos 集群
4.1 创建 RBAC
新建 nacos-rbac.yaml 文件,内容如下:
apiVersion: v1
kind: ServiceAccount
metadata:
name: nacos-admin
namespace: ns-nacos
---
kind: ClusterRole
apiVersion: rbac.authorization.k8s.io/v1
metadata:
name: nacos-admin-clusterrole
rules:
- apiGroups: [""]
resources: ["persistentvolumes"]
verbs: ["get", "list", "watch", "create", "delete"]
- apiGroups: [""]
resources: ["persistentvolumeclaims"]
verbs: ["get", "list", "watch", "update"]
- apiGroups: [""]
resources: ["endpoints"]
verbs: ["get", "list", "watch", "create", "update", "patch"]
- apiGroups: ["storage.k8s.io"]
resources: ["storageclasses"]
verbs: ["get", "list", "watch"]
- apiGroups: [""]
resources: ["events"]
verbs: ["create", "update", "patch"]
---
kind: ClusterRoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:
name: nacos-admin-binding
subjects:
- kind: ServiceAccount
name: nacos-admin
namespace: ns-nacos
roleRef:
kind: ClusterRole
name: nacos-admin-clusterrole
apiGroup: rbac.authorization.k8s.io
4.2 创建 ConfigMap 存储 nacos 配置文件
新建 nacos-config.yaml 文件,内容如下:
apiVersion: v1
kind: ConfigMap
metadata:
name: nacos-config
namespace: ns-nacos
data:
SERVICE_NAME: "nacos-headless"
DOMAIN_NAME: "cluster.local"
NACOS_REPLICAS: "3"
PREFER_HOST_MODE: "hostname"
NACOS_SERVER_PORT: "8848"
NACOS_APPLICATION_PORT: "8848"
JVM_XMX: "2g"
JVM_XMS: "2g"
JVM_XMN: "1g"
MYSQL_SERVICE_HOST: "mysql-service"
MYSQL_SERVICE_DB_NAME: "nacos_config"
MYSQL_SERVICE_PORT: "3306"
MYSQL_SERVICE_USER: "root"
MYSQL_SERVICE_PASSWORD: "nacos_mysql_admin"
Nacos 提供了很多可以配置的参数,以环境变量的方式进行配置,部分参数如下所示:
参数名称 | 默认值 | 参数描述 |
---|---|---|
SERVER_SERVLET_CONTEXTPATH | /nacos | 指定 Nacos 服务前缀。 |
NACOS_APPLICATION_PORT | 8848 | 指定 Nacos 端口。 |
TOMCAT_ACCESSLOG_ENABLED | false | 是否开启访问日志。 |
SPRING_DATASOURCE_PLATFORM | 指定数据库平台,目前只支持 mysql。 | |
MYSQL_DATABASE_NUM | 1 | 数据库数量。 |
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 | 指定数据库连接参数。 |
JVM_XMS | 2g | JVM 的 -Xms 参数配置。 |
JVM_XMX | 2g | JVM 的 -Xmx 参数配置。 |
JVM_XMN | 1g | JVM 的 -Xmn 参数配置。 |
JVM_MS | 128m | JVM 的 -XX:MetaspaceSize 参数配置。 |
JVM_MMS | 320m | JVM 的 -XX:MaxMetaspaceSize 参数配置。 |
NACOS_DEBUG | 支持y/n,默认为n | 是否启用远程调试。 |
NACOS_AUTH_ENABLE | false | 是否启用系统鉴权。 |
NACOS_AUTH_SYSTEM_TYPE | nacos | 指定 Nacos 系统鉴权认证类型。 |
NACOS_AUTH_TOKEN | SecretKey012345678901234567890123456789012345678901234567890123456789 | 指定 Nacos 安全认证 Token。 |
NACOS_AUTH_CACHE_ENABLE | false | 指定 Nacos 是否开启身份验证信息的缓存。 |
NACOS_AUTH_TOKEN_EXPIRE_SECONDS | 18000 | 指定 Nacos Token 超时时间,单位(秒)。 |
NACOS_AUTH_USER_AGENT_AUTH_WHITE_ENABLE | false | 指定 Nacos 是否使用 user-agent 判断服务端请求并放行鉴权的功能。 |
NACOS_AUTH_IDENTITY_KEY | serverIdentity | 指定 Nacos 自定义身份识别的 key。 |
NACOS_AUTH_IDENTITY_VALUE | security | 指定 Nacos 自定义身份识别的 value。 |
PREFER_HOST_MODE | ip | 指定通信模式,支持hostname和ip两种。 |
NACOS_SERVERS | 指定 Nacos 集群地址。 | |
NACOS_APPLICATION_PORT | 8848 | 指定 Nacos 服务端口。 |
NACOS_SERVER_IP | 在存在多网卡时,指定使用的 IP。 |
4.3 创建 pv 和 pvc
本次搭建集群的存储使用的 cephfs,当前已经将 cephfs 挂载到 k8s 集群的所有节点上,所以创建 pv 和 pvc 的时候,直接使用宿主机目录即可。新建 nacos-pvc.yaml,内容如下:
---
apiVersion: v1
kind: PersistentVolume
metadata:
name: nacos-pv
spec:
accessModes:
- ReadWriteMany
capacity:
storage: 1024Gi
local:
path: /opt/ops_ceph_data/nacos/nacos_data
nodeAffinity:
required:
nodeSelectorTerms:
- matchExpressions:
- key: nacos-cluster
operator: In
values:
- "true"
persistentVolumeReclaimPolicy: Retain
storageClassName: nacos-storage
---
kind: PersistentVolumeClaim
apiVersion: v1
metadata:
name: nacos-pvc
namespace: ns-nacos
spec:
accessModes:
- ReadWriteMany
storageClassName: nacos-storage
resources:
requests:
storage: 1024Gi
4.4 创建存储目录和并设置 labels
根据上面 pv 中的设置,在本地宿主机中创建目录 /opt/ops_ceph_data/nacos/nacos-data
,标签信息已经在之前创建过了,此处不需要重复创建。
4.5 创建 Service
创建一个 headless 用于集群内部通信使用,并为 8848 单独创建一个 nodePort 类型暴露出来,新建 nacos-service.yaml 文件,内容如下:
apiVersion: v1
kind: Service
metadata:
name: nacos-headless
namespace: ns-nacos
labels:
nacos-app: nacos
spec:
ports:
- name: server
port: 8848
targetPort: 8848
- name: rpc
port: 7848
targetPort: 7848
clusterIP: None
selector:
nacos-app: nacos
---
kind: Service
apiVersion: v1
metadata:
name: nacos-expose
namespace: ns-nacos
labels:
nacos-app: nacos
spec:
ports:
- name: server
port: 8848
targetPort: 8848
nodePort: 30848
selector:
nacos-app: nacos
type: NodePort
4.6 创建 StateFulSet
使用 StateFulSet 控制器创建 nacos 集群,新建 nacos-pod.yaml 文件,内容如下:
---
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: nacos-cluster
namespace: ns-nacos
labels:
nacos-app: nacos
spec:
serviceName: nacos-headless
replicas: 1
selector:
matchLabels:
nacos-app: nacos
template:
metadata:
labels:
nacos-app: nacos
spec:
terminationGracePeriodSeconds: 10 # 配置优雅停机时间
serviceAccountName: nacos-admin # 分配服务账户给应用,方便应用能够获取一定的权限
initContainers: # 初始化镜像执行初始化操作
- name: peer-finder-plugin-install
image: nacos/nacos-peer-finder-plugin:1.0
volumeMounts:
- mountPath: "/home/nacos/plugins/peer-finder"
name: nacosdir
affinity: # 配置Pod反亲和性,放置Pod都起在同一节点上(如果都在一个节点,节点宕机将会使全部实例不可用)
podAntiAffinity:
# requiredDuringSchedulingIgnoredDuringExecution: # 硬策略,pod一定不能启在同一个节点上
# - topologyKey: "kubernetes.io/hostname"
# labelSelector:
# matchExpressions:
# - key: "nacos-app"
# operator: In
# values:
# - nacos
preferredDuringSchedulingIgnoredDuringExecution: # 软策略,尽可能pod不启在同一个节点上
- weight: 100
podAffinityTerm:
topologyKey: "kubernetes.io/hostname"
labelSelector:
matchExpressions:
- key: nacos-app
operator: In
values:
- nacos
containers:
- name: nacos-cluster
image: nacos/nacos-server:1.4.1
resources:
limits:
cpu: 2
memory: "2Gi"
requests:
cpu: 100m
memory: "1Gi"
ports:
- name: client-port
containerPort: 8848
- name: rpc
containerPort: 7848
envFrom:
- configMapRef:
name: nacos-config
env:
- name: POD_NAMESPACE
valueFrom:
fieldRef:
apiVersion: v1
fieldPath: metadata.namespace
volumeMounts:
- name: nacosdir
mountPath: /home/nacos/plugins/peer-finder
subPath: peer-finder
- name: nacosdir
mountPath: /home/nacos/data
subPath: data
- name: nacosdir
mountPath: /home/nacos/logs
subPath: logs
- name: localtime
readOnly: true
mountPath: /etc/localtime
volumes:
- name: nacosdir
persistentVolumeClaim:
claimName: nacos-pvc
- name: localtime
hostPath:
type: File
path: /usr/share/zoneinfo/Asia/Shanghai
4.7 访问 nacos
应用上面的 yaml 文件创建 Pod 后,等待 Pod 的状态变为 running ,即可在浏览器中访问 IP:30848/nacos 访问 nacos 控制台,初始用户名和密码均为 nacos。
本文原文链接:https://blog.csdn.net/xzk9381/article/details/114264549