Kubernetes 部署 Nacos 1.4 集群

Kubernetes 部署 Nacos 1.4 集群

文章目录

  !版权声明:本博客内容均为原创,每篇博文作为知识积累,写博不易,转载请注明出处。


参考地址:

系统环境:

  • Nacos 版本:1.4.1
  • Mysql 版本:8.0.19
  • Kubernetes 版本:1.20.1

项目示例地址:

如果该文章对你有帮助,别忘了 Github 帮忙点颗星哦~

一、什么是 Nacos

Nacos 是阿里开源的服务注册中心与配置中心组件,能够帮助开发人员快速实现动态服务发现、服务配置、服务元数据及流量管理。同时能够与 SpringCloud、Kubernetes、Dubbo 等开源生态无缝集成。

Nacos 支持如下核心特性:

  • 服务发现: 支持 DNS 与 RPC 服务发现,也提供原生 SDK 、OpenAPI 等多种服务注册方式和 DNS、HTTP 与 API 等多种服务发现方式。
  • 服务健康监测: Nacos 提供对服务的实时的健康检查,阻止向不健康的主机或服务实例发送请求。
  • 动态配置服务: Nacos 提供配置统一管理功能,能够帮助我们将配置以中心化、外部化和动态化的方式管理所有环境的应用配置和服务配置。
  • 动态 DNS 服务: Nacos 支持动态 DNS 服务权重路由,能够让我们很容易地实现中间层负载均衡、更灵活的路由策略、流量控制以及数据中心内网的简单 DNS 解析服务。
  • 服务及其元数据管理: Nacos 支持从微服务平台建设的视角管理数据中心的所有服务及元数据,包括管理服务的描述、生命周期、服务的静态依赖分析、服务的健康状态、服务的流量管理、路由及安全策略、服务的 SLA 以及最首要的 metrics 统计数据。

二、提前部署 Mysql

Nacos 需要提前部署 Mysql,目前支持 5.7 及 8.0 版本。关于如何部署 Mysql 可以参考之前本人写的一篇文章 Kubernetes 部署 Mysql 数据库

三、导入 SQL 相关数据

等数据库创建完成后,还需要导入 SQL 文件来创建它的表结构和一些基础数据。操作如下,我们进入 Mysql 客户端,执行 source 命令导入 SQL 文件。

1$ mysql -uroot -p123456
2
3mysql> source /data/nacos.sql

你也可以通过 Navicat 等可视化工具进行快捷导入。

四、部署 Nacos

这里我们部署 Nacos 集群模式,整体如下示意图,会在 Kubernetes 中创建一个 Service,该 Service 关联 Nacos 中的多个 Pod,一个 Pod 就是 Nacos 节点,Pod 之间通过该 Service 进行交互。最后我们会配置一个 NodePort 方式对外访问。当然,你如果你的 Kubernetes 集群已经部署了 Ingress Controller 则可以创建 Ingress 规则对外提供访问。

Kubernetes 下的 Nacos 访问流程

1、创建 RBAC 资源

nacos-rbac.yaml

 1apiVersion: v1
 2kind: ServiceAccount
 3metadata:
 4  name: nacos-admin
 5---
 6kind: ClusterRole
 7apiVersion: rbac.authorization.k8s.io/v1
 8metadata:
 9  name: nacos-admin-clusterrole
10rules:
11- apiGroups: [""]
12  resources: ["persistentvolumes"]
13  verbs: ["get", "list", "watch", "create", "delete"]
14- apiGroups: [""]
15  resources: ["persistentvolumeclaims"]
16  verbs: ["get", "list", "watch", "update"]
17- apiGroups: [""]
18  resources: ["endpoints"]
19  verbs: ["get", "list", "watch", "create", "update", "patch"]
20- apiGroups: ["storage.k8s.io"]
21  resources: ["storageclasses"]
22  verbs: ["get", "list", "watch"]
23- apiGroups: [""]
24  resources: ["events"]
25  verbs: ["create", "update", "patch"]
26---
27kind: ClusterRoleBinding
28apiVersion: rbac.authorization.k8s.io/v1
29metadata:
30  name: nacos-admin-binding
31subjects:
32- kind: ServiceAccount
33  name: nacos-admin
34  namespace: mydlqcloud
35roleRef:
36  kind: ClusterRole
37  name: nacos-admin-clusterrole
38  apiGroup: rbac.authorization.k8s.io

执行部署 Nacos RBAC 资源

  • -n:指定部署的 Namespace
1$ kubectl apply -f nacos-rbac.yaml -n mydlqcloud

2、创建数据库配置 ConfigMap 资源

nacos-config.yaml

 1apiVersion: v1
 2kind: ConfigMap
 3metadata:
 4  name: nacos-config
 5data:
 6  SERVICE_NAME: "nacos-headless"
 7  DOMAIN_NAME: "cluster.local"
 8  NACOS_REPLICAS: "3"
 9  PREFER_HOST_MODE: "hostname"
10  NACOS_SERVER_PORT: "8848"
11  NACOS_APPLICATION_PORT: "8848"
12  JVM_XMX: "2g"
13  JVM_XMS: "2g"
14  JVM_XMN: "1g"
15  MYSQL_SERVICE_HOST: "mysql"
16  MYSQL_SERVICE_DB_NAME: "nacos_config_cluster"
17  MYSQL_SERVICE_PORT: "3306"
18  MYSQL_SERVICE_USER: "root"
19  MYSQL_SERVICE_PASSWORD: "123456"

参数说明:

  • MYSQL_SERVICE_HOST:数据库地址(这里使用上面部署的 Mysql,由于部署在 K8S 里面,所以使用 Mysql Service 提供的 K8S 内部地址)
  • MYSQL_SERVICE_PORT: 数据库端口。
  • MYSQL_SERVICE_DB_NAME: 指定使用的库名称。
  • MYSQL_SERVICE_USER: 数据库用户名。
  • MYSQL_SERVICE_PASSWORD: 数据库密码。
  • NACOS_APPLICATION_PORT:指定 Nacos 端口号。
  • PREFER_HOST_MODE:配置 Nacos 集群节点间服务发现使用的模式,支持 hostname、ip 两种模式。
  • JVM_XMS: 设置 JVM 最大堆内存大小。
  • JVM_XMX: 设置 JVM 最初是堆内存大小。
  • JVM_XMN: 设置 JVM 堆内新生代的内存大小。
  • SERVICE_NAME:指定 Nacos 部署在 K8S 中的 Service 名称。
  • DOMAIN_NAME:指定 k8s domain 配置,一般默认即可。

执行部署 Nacos 数据库 ConfigMap 资源

  • -n:指定部署的 Namespace
1$ kubectl apply -f nacos-config.yaml -n mydlqcloud

3、创建 Nacos 应用

nacos-deploy.yaml

  1apiVersion: v1
  2kind: Service
  3metadata:
  4  name: nacos-headless
  5  labels:
  6    app: nacos
  7spec:
  8  ports:
  9    - name: server
 10      port: 8848
 11      targetPort: 8848
 12    - name: rpc
 13      port: 7848
 14      targetPort: 7848
 15  clusterIP: None
 16  selector:
 17    app: nacos
 18---
 19apiVersion: apps/v1
 20kind: StatefulSet
 21metadata:
 22  name: nacos
 23spec:
 24  serviceName: nacos-headless
 25  replicas: 3
 26  template:
 27    metadata:
 28      labels:
 29        app: nacos
 30    spec:
 31      terminationGracePeriodSeconds: 10  #配置优雅停机时间
 32      serviceAccountName: nacos-admin    #分配服务账户给应用,方便应用能够获取一定的权限
 33      initContainers:                    #初始化镜像执行初始化操作
 34        - name: peer-finder-plugin-install
 35          image: nacos/nacos-peer-finder-plugin:1.0
 36          volumeMounts:
 37            - mountPath: "/home/nacos/plugins/peer-finder"
 38              name: plugindir
 39      affinity:    #配置Pod反亲和性,放置Pod都起在同一节点上(如果都在一个节点,节点宕机将会使全部实例不可用)       
 40        podAntiAffinity:    
 41          # requiredDuringSchedulingIgnoredDuringExecution: #硬策略,pod一定不能启在同一个节点上
 42          #   - topologyKey: "kubernetes.io/hostname"
 43          #     labelSelector:
 44          #       matchExpressions:
 45          #         - key: "app"
 46          #           operator: In
 47          #           values:
 48          #             - nacos
 49          preferredDuringSchedulingIgnoredDuringExecution:  #软策略,尽可能pod不启在同一个节点上
 50            - weight: 100 
 51              podAffinityTerm:
 52                topologyKey: "kubernetes.io/hostname"
 53                labelSelector:
 54                  matchExpressions:
 55                    - key: app
 56                      operator: In
 57                      values:
 58                        - nacos  
 59      containers:
 60        - name: nacos
 61          image: nacos/nacos-server:1.4.1
 62          resources:
 63            limits:
 64              cpu: 2
 65              memory: "2Gi"
 66            requests:
 67              cpu: 100m
 68              memory: "1Gi"
 69          ports:
 70            - name: client-port
 71              containerPort: 8848
 72            - name: rpc
 73              containerPort: 7848
 74          envFrom:
 75            - configMapRef:
 76                name: nacos-config
 77          env:
 78            - name: POD_NAMESPACE
 79              valueFrom:
 80                fieldRef:
 81                  apiVersion: v1
 82                  fieldPath: metadata.namespace
 83          volumeMounts:
 84            - name: plugindir
 85              mountPath: /home/nacos/plugins/peer-finder
 86            - name: datadir
 87              mountPath: /home/nacos/data
 88            - name: logdir
 89              mountPath: /home/nacos/logs
 90  volumeClaimTemplates:
 91    - metadata:
 92        name: plugindir
 93      spec:
 94        storageClassName: nfs-storage #指定storageclass名称,这里需要根据你的K8S集群进行修改
 95        accessModes: ["ReadWriteMany"]
 96        resources:
 97          requests:
 98            storage: 5Gi
 99    - metadata:
100        name: datadir
101      spec:
102        storageClassName: nfs-storage  
103        accessModes: ["ReadWriteMany"]
104        resources:
105          requests:
106            storage: 5Gi
107    - metadata:
108        name: logdir
109      spec:
110        storageClassName: nfs-storage
111        accessModes: ["ReadWriteMany"]
112        resources:
113          requests:
114            storage: 5Gi
115  selector:
116    matchLabels:
117      app: nacos

上面配置中使用的是 StatefulSet 资源创建的 Nacos,所以需要存储驱动支持 StorageClass 来动态创建 PVC,这里使用的 NFS,并且使用 nfs-client-provisioner 插件来动态创建 PVC。

执行部署 Nacos 应用

  • -n:指定部署的 Namespace
1$ kubectl apply -f nacos-deploy.yaml -n mydlqcloud

4、暴露 Nacos 对外访问

这里我们再创建一个 Service 资源,设置其类型为 NodePort 方式,提供 NodePort 端口为 30848,方便后续我们对 Nacos Dashboard 进行访问。

 1kind: Service
 2apiVersion: v1
 3metadata:
 4  name: nacos 
 5  labels:
 6    app: nacos
 7spec:
 8  ports:
 9    - name: server
10      port: 8848
11      targetPort: 8848
12      nodePort: 30848
13  selector:
14    app: nacos
15  type: NodePort

这里使用 NodePort 方式暴露服务。当然,如果你的 Kubernetes 集群部署了 Ingress Controller,也可以配置 Ingress 路由规则,来让外部访问你的服务。

五、访问 Nacos 进行测试

本人这里的 Kubernetes 地址 IP 为 192.168.2.11,而上面配置的 Nacos Service 中指定 NodePort 端口为 30848,又由于 Nacos 默认会带上前缀 /nacos,所以我们可以输入地址 http://192.168.2.11:30848/nacos 访问 Nacos 页面。

Nacos 登录页面

输入用户名/密码: nacos/nacos ,登录 Nacos 后会看到如下页面:

Nacos 管理页面

六、Nacos 变量参数及其说明

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。

博文到此结束,如果该文章对你有帮助,别忘了 Github 帮忙点颗星哦~

---END---


  !版权声明:本博客内容均为原创,每篇博文作为知识积累,写博不易,转载请注明出处。