第 7 篇 Helm 部署 Nacos【详细步骤】
文章目录
- 安装 Chart
- 准备工作
- 单机 + MySQL 模式
- 第 1 步:自定义配置
- 第 2 步:安装 chart
- 第 3 步:查看状态
- 查看 Pod 运行状态
- 查看 Pod 信息
 
- 第 4 步:访问 Nacos
- 集群外访问
- 集群内访问
 
 
- 集群 + MySQL 模式
- 第 1 步:自定义配置文件
- 第 2 步:安装 chart
- 第 3 步:查看 Pod 状态
- 第 4 步:访问 Nacos
- 第 5 步:集群扩容/缩容
- 方法 1:helm upgrade
- 方法 2:kubectl scale
 
 
 
- chart 配置参数
- 入坑指南
- 坑 1:service.nodePort 映射的是不是 HTTP 端口?
- 查看 Service 信息
- 排查 templates/service.yaml
 
- 坑 2:resources 内存配置,不会改变 JVM 启动参数
 
- 参考
- 相关博文
🚀 本文内容:使用 Helm 部署 Nacos。
Nacos:动态服务发现、服务配置、服务元数据和流量管理。
Nacos Chart:Nacos Server 官方 Helm Chart,基于 nacos-k8s 项目
- Artifact HUB:https://artifacthub.io/packages/helm/kubegemsapp/nacos
- GitHub:https://github.com/nacos-group/nacos-k8s/
安装 Chart
前提条件:
- Kubernetes 1.10+
- Helm v3
- 提供 PV provisioner:‼️务必提供存储制备器,否则没有持久化存储,那么重启后数据就没啦!
模式选择:
- 默认配置下,是单机+内嵌数据库+无持久化存储,仅能用于快速体验!重启后数据丢失!
- 单机+MySQL+持久化存储:靠谱的单机版
- 集群+MySQL+持久化存储:高可用集群版
准备工作
Helm Chart 是基于 nacos-k8s 项目的,需要把整个 Chart 相关内容克隆下来。
# 安装 git
yum install git -y# 克隆 nacos-k8s 项目
git clone https://github.com/nacos-group/nacos-k8s.git# 跳转到 helm 目录(这里都是 chart 相关文件,比如 Chart.yaml、values.yaml、templates 等)
cd nacos-k8s/helm/
单机 + MySQL 模式
第 1 步:自定义配置
基于 nacos-k8s/helm/ 目录下的 values.yaml,我们可以定制自己的配置,从而实现覆盖掉 values.yaml 中的默认配置。
新增 nacos_values.yaml:
- 重点 1:在 nacos.image 属性下面,指定 nacos 镜像版本【这里选择和 Java 代码配套的 2.2.0 版本】
- 重点 2:配置 MySQL 连接,使用 MySQL 作为外置存储【MySQL 配置请根据实际情况修改】
- 重点 3:开启持久化存储,并指定 StorageClass【StorageClass 请根据实际情况修改】
- 重点 4:service 类型使用 NodePort,即在集群外暴露服务
global:# 单机版mode: standalonenacos:# nacos 镜像配置image:repository: nacos/nacos-servertag: v2.2.0pullPolicy: IfNotPresent# nacos 插件配置plugin:enable: trueimage:repository: nacos/nacos-peer-finder-plugintag: 1.1# 启用健康检测health:enabled: true# nacos 存储storage:type: mysqldb:host: 172.20.134.48port: 32000name: nacosusername: rootpassword: Yumc@ru123param: characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&useSSL=false# 持久化存储
persistence:enabled: truedata:accessModes:- ReadWriteOnce# 指定 StorageClassstorageClassName: managed-nfs-storageresources:requests:storage: 4Gi# service 配置
service:type: NodePortport: 8848# !!! 这里并不是 8848 对应 30000 端口,实际上是 7748 对应的 30000 端口,所以此端口对于外部访问来说没有用!nodePort: 30000# 资源限制(调大内存的同时,必须同时修改环境变量 JVM_XMS、JVM_XMX、JVM_XMN,否则还是使用 1g 堆内存!!!)
resources:requests:cpu: 500mmemory: 2Gilimits:cpu: 1000mmemory: 2Gi
第 2 步:安装 chart
# 跳转到 helm 目录
cd nacos-k8s/helm/# 安装 nacos:必须在 nacos-k8s/helm/,得有 Chart.yaml
helm install my-nacos ./ --values nacos_values.yaml
# NAME: my-nacos
# LAST DEPLOYED: Thu May 23 13:45:45 2024
# NAMESPACE: default
# STATUS: deployed
# REVISION: 1
# TEST SUITE: None
# NOTES:
# 1. Get the application URL by running these commands:
#   export NODE_PORT=$(kubectl get --namespace default -o jsonpath="{.spec.ports[0].nodePort}" services  nacos-cs)
#   export NODE_IP=$(kubectl get nodes --namespace default -o jsonpath="{.items[0].status.addresses[0].address}")
#   echo http://$NODE_IP:$NODE_PORT/nacos
# 2. MODE:
#    standalone: you need to modify replicaCount in the values.yaml, .Values.replicaCount=1
#    cluster: kubectl scale sts default-nacos --replicas=3
第 3 步:查看状态
查看 Pod 运行状态
容器从创建、运行、Ready,耗时 4m11s。
# 查看 Pod 状态
kubectl get pods -w
# NAME                                      READY   STATUS              RESTARTS   AGE
# my-nacos-0                                0/1     ContainerCreating   0          2s
# my-nacos-0                                0/1     Running             0          6s
# my-nacos-0                                1/1     Running             0          4m11s
😂 容器一直 CrashLoopBackOff ?说明有错误,此时必须人工看一下。
- 思路 1:kubectl logs -f my-nacos-0 查看日志,并进行分析。
- 思路 2: 找到对应的 PV 存储,进入目录查看 nacos.log,并进行分析。
- 示例:default-data-my-nacos-0-pvc-23eac20f-3f2c-4c22-bf95-f58ac2b4f154/logs/nacos.log
- my-nacos 是 release name
查看 Pod 信息
从 Pod 信息中可以看到很多有用的信息:比如容器镜像、容器 ID 等等
kubectl describe pod my-nacos-0
# Name:         my-nacos-0
# Namespace:    default
# Priority:     0
# Node:         k8s-master/172.24.4.246
# Start Time:   Thu, 23 May 2024 14:24:43 +0800
# Labels:       app.kubernetes.io/instance=my-nacos
#               app.kubernetes.io/name=nacos
#               controller-revision-hash=my-nacos-f59994b89
#               statefulset.kubernetes.io/pod-name=my-nacos-0
# Annotations:  cni.projectcalico.org/podIP: 192.168.102.198/32
#               cni.projectcalico.org/podIPs: 192.168.102.198/32
# Status:       Running
# IP:           192.168.102.198
# IPs:
#   IP:           192.168.102.198
# Controlled By:  StatefulSet/my-nacos
# Containers:
#   nacos:
#     Container ID:   docker://7ca87c84aeba62442b4357feef83c4922f730f94ed126a8f5712ffd1fad3238c
#     Image:          nacos/nacos-server:v2.2.0
#     Image ID:       docker-pullable://nacos/nacos-server@sha256:be794368c96f90e42a6dd9f288d3fb12d69608cebd782eb091a489ccb48cfd28
#     Ports:          8848/TCP, 9848/TCP, 9849/TCP, 7848/TCP
#     Host Ports:     0/TCP, 0/TCP, 0/TCP, 0/TCP
#     State:          Running
#       Started:      Thu, 23 May 2024 14:24:48 +0800
#     Ready:          True
#     Restart Count:  0
#     Limits:
#       cpu:     1
#       memory:  2Gi
#     Requests:
#       cpu:     500m
#       memory:  2Gi
#     Liveness:  http-get http://:8848/nacos/v1/console/health/liveness delay=10s timeout=10s period=5s #success=1 #failure=3
#     Startup:   http-get http://:8848/nacos/v1/console/health/readiness delay=180s timeout=10s period=5s #success=1 #failure=3
#     Environment:
#       NACOS_SERVER_PORT:           8848
#       NACOS_APPLICATION_PORT:      8848
#       PREFER_HOST_MODE:            hostname
#       MODE:                        standalone
#       SPRING_DATASOURCE_PLATFORM:  mysql
#       MYSQL_SERVICE_HOST:          <set to the key 'mysql.db.host' of config map 'nacos-cm'>   Optional: false
#       MYSQL_SERVICE_DB_NAME:       <set to the key 'mysql.db.name' of config map 'nacos-cm'>   Optional: false
#       MYSQL_SERVICE_PORT:          <set to the key 'mysql.port' of config map 'nacos-cm'>      Optional: false
#       MYSQL_SERVICE_USER:          <set to the key 'mysql.user' of config map 'nacos-cm'>      Optional: false
#       MYSQL_SERVICE_PASSWORD:      <set to the key 'mysql.password' of config map 'nacos-cm'>  Optional: false
#       MYSQL_SERVICE_DB_PARAM:      <set to the key 'mysql.param' of config map 'nacos-cm'>     Optional: false
#     Mounts:
#       /home/nacos/data from data (rw,path="data")
#       /home/nacos/logs from data (rw,path="logs")
#       /home/nacos/plugins/peer-finder from data (rw,path="peer-finder")
#       /var/run/secrets/kubernetes.io/serviceaccount from default-token-8b52b (ro)
# Conditions:
#   Type              Status
#   Initialized       True 
#   Ready             True 
#   ContainersReady   True 
#   PodScheduled      True 
# Volumes:
#   data:
#     Type:       PersistentVolumeClaim (a reference to a PersistentVolumeClaim in the same namespace)
#     ClaimName:  data-my-nacos-0
#     ReadOnly:   false
# #   default-token-8b52b:
#     Type:        Secret (a volume populated by a Secret)
#     SecretName:  default-token-8b52b
#     Optional:    false
# QoS Class:       Burstable
# Node-Selectors:  <none>
# Tolerations:     node.kubernetes.io/not-ready:NoExecute for 300s
#                  node.kubernetes.io/unreachable:NoExecute for 300s
# Events:
#   Type    Reason     Age    From               Message
#   ----    ------     ----   ----               -------
#  Normal  Scheduled  5m20s  default-scheduler  Successfully assigned default/my-nacos-0 to k8s-master
#  Normal  Pulled     5m17s  kubelet            Container image "nacos/nacos-server:v2.2.0" already present on machine
#  Normal  Created    5m15s  kubelet            Created container nacos
#  Normal  Started    5m15s  kubelet            Started container nacos
第 4 步:访问 Nacos
集群外访问
查看 Nacos IP 及端口:
# 获取 IP 地址
kubectl get nodes --namespace default -o jsonpath="{.items[0].status.addresses[0].address}"
# 172.24.4.246# 获取节点端口
kubectl get --namespace default -o jsonpath="{.spec.ports[0].nodePort}" services nacos-cs
# 32566
直接使用上面的 IP+Port 访问:

集群内访问
集群内,使用服务名称访问。
- 格式:http://{service_name}.{namespace}.svc.cluster.local
- 实例:http://nacos-cs.default.svc.cluster.local
集群 + MySQL 模式
此模式建立在《单机+MySQL 模式》的基础上,上面的务必了解清楚,再开始下面的操作。
第 1 步:自定义配置文件
在单机 + MySQL 的基础上,基于 nacos_values.yaml 配置文件,创建集群版配置文件 nacos_cluster_values.yaml:
- 修改点 1:global.mode 改成 cluster
- 修改点 2:添加 nacos.replicaCount 为 3
global:# 集群版mode: clusternacos:replicaCount: 3# nacos 镜像配置image:repository: nacos/nacos-servertag: v2.2.0pullPolicy: IfNotPresent# nacos 插件配置plugin:enable: trueimage:repository: nacos/nacos-peer-finder-plugintag: 1.1# 启用健康检测health:enabled: true# nacos 存储storage:type: mysqldb:host: 172.20.134.48port: 32000name: nacosusername: rootpassword: Yumc@ru123param: characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&useSSL=false# 持久化存储
persistence:enabled: truedata:accessModes:- ReadWriteOnce# 指定 StorageClassstorageClassName: managed-nfs-storageresources:requests:storage: 4Gi# service 配置
service:type: NodePortport: 8848# !!! 这里并不是 8848 对应 30000 端口,实际上是 7748 对应的 30000 端口,所以此端口对于外部访问来说没有用!nodePort: 30000# 资源限制(调大内存的同时,必须同时修改环境变量 JVM_XMS、JVM_XMX、JVM_XMN,否则还是使用 1g 堆内存!!!)
resources:requests:cpu: 500mmemory: 2Gilimits:cpu: 1000mmemory: 2Gi
第 2 步:安装 chart
helm install my-nacos-cluster ./ --values nacos_cluster_values.yaml
# NAME: my-nacos-cluster
# LAST DEPLOYED: Thu May 23 15:44:10 2024
# NAMESPACE: default
# STATUS: deployed
# REVISION: 1
# TEST SUITE: None
# NOTES:
# 1. Get the application URL by running these commands:
#   export NODE_PORT=$(kubectl get --namespace default -o jsonpath="{.spec.ports[0].nodePort}" services  nacos-cs)
#   export NODE_IP=$(kubectl get nodes --namespace default -o jsonpath="{.items[0].status.addresses[0].address}")
#   echo http://$NODE_IP:$NODE_PORT/nacos
# 2. MODE:
#    standalone: you need to modify replicaCount in the values.yaml, .Values.replicaCount=1
#    cluster: kubectl scale sts default-nacos --replicas=3第 3 步:查看 Pod 状态
容器从创建、运行、Ready,耗时 4m15s。
[root@k8s-master helm]# kubectl get pods -w
NAME                                      READY   STATUS    RESTARTS   AGE
my-nacos-cluster-0                        0/1     Running   0          64s
my-nacos-cluster-1                        0/1     Running   0          64s
my-nacos-cluster-2                        0/1     Running   0          64s
my-nacos-cluster-0                        1/1     Running   0          3m43s
my-nacos-cluster-1                        1/1     Running   0          3m56s
my-nacos-cluster-2                        1/1     Running   0          4m15s
第 4 步:访问 Nacos
查看 Service,找到 8848 对应的外部端口:
kubectl get services | grep nacos
# nacos-cs            NodePort    192.168.103.166   <none>        8848:31329/TCP,9848:32624/TCP,9849:30424/TCP,7848:31122/TCP      10m
# nacos-hs            ClusterIP   None              <none>        8848/TCP,9848/TCP,9849/TCP,7848/TCP                              10m
使用如下命令,获取 IP 地址:
# 获取 IP 地址
kubectl get nodes --namespace default -o jsonpath="{.items[0].status.addresses[0].address}"
# 172.24.4.246
集群外访问 Nacos:能看到节点有 3 个。

集群内,使用服务名称访问。
- 格式:http://{service_name}.{namespace}.svc.cluster.local
- 实例:http://nacos-cs.default.svc.cluster.local
第 5 步:集群扩容/缩容
方法 1:helm upgrade
修改 nacos_cluster_values.yaml,将 nacos.replicaCount 从 3 改为 4,然后直接 helm upgrade
helm upgrade my-nacos-cluster ./ --values nacos_cluster_values.yaml
# Release "my-nacos-cluster" has been upgraded. Happy Helming!
# NAME: my-nacos-cluster
# LAST DEPLOYED: Thu May 23 15:57:59 2024
# NAMESPACE: default
# STATUS: deployed
# REVISION: 2
# TEST SUITE: None
# NOTES:
# 1. Get the application URL by running these commands:
#   export NODE_PORT=$(kubectl get --namespace default -o jsonpath="{.spec.ports[0].nodePort}" services  nacos-cs)
#   export NODE_IP=$(kubectl get nodes --namespace default -o jsonpath="{.items[0].status.addresses[0].address}")
#   echo http://$NODE_IP:$NODE_PORT/nacos
# 2. MODE:
#    standalone: you need to modify replicaCount in the values.yaml, .Values.replicaCount=1
#    cluster: kubectl scale sts default-nacos --replicas=3
几分钟,变成 4 个节点啦!

方法 2:kubectl scale
使用 kubectl sacle sts 指定副本数量也可实现伸缩。
kubectl scale sts my-nacos-cluster --replicas=5
# statefulset.apps/my-nacos-cluster scaled
坐等一小会,变成 5 个节点啦!

缩容,也是一样的做法哦。😊
chart 配置参数
Nacos Chart 配置参数如下:
| Parameter | Description | Default | 
|---|---|---|
| global.mode | Run Mode (quickstart, standalone, cluster; ) | standalone | 
| resources | The [resources] to allocate for nacos container | {} | 
| nodeSelector | Nacos labels for pod assignment | {} | 
| affinity | Nacos affinity policy | {} | 
| tolerations | Nacos tolerations | {} | 
| resources.requests.cpu | nacos requests cpu resource | 500m | 
| resources.requests.memory | nacos requests memory resource | 2G | 
| nacos.replicaCount | Number of desired nacos pods, the number should be 1 as run standalone mode | 1 | 
| nacos.image.repository | Nacos container image name | nacos/nacos-server | 
| nacos.image.tag | Nacos container image tag | latest | 
| nacos.image.pullPolicy | Nacos container image pull policy | IfNotPresent | 
| nacos.plugin.enable | Nacos cluster plugin that is auto scale | true | 
| nacos.plugin.image.repository | Nacos cluster plugin image name | nacos/nacos-peer-finder-plugin | 
| nacos.plugin.image.tag | Nacos cluster plugin image tag | 1.1 | 
| nacos.health.enabled | Enable health check or not | false | 
| nacos.env.preferhostmode | Enable Nacos cluster node domain name support | hostname | 
| nacos.env.serverPort | Nacos port | 8848 | 
| nacos.storage.type | Nacos data storage method mysql or embedded. The embedded supports either standalone or cluster mode | embedded | 
| nacos.storage.db.host | mysql host | |
| nacos.storage.db.name | mysql database name | |
| nacos.storage.db.port | mysql port | 3306 | 
| nacos.storage.db.username | username of database | |
| nacos.storage.db.password | password of database | |
| nacos.storage.db.param | Database url parameter | characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&useSSL=false | 
| persistence.enabled | Enable the nacos data persistence or not | false | 
| persistence.data.accessModes | Nacos data pvc access mode | ReadWriteOnce | 
| persistence.data.storageClassName | Nacos data pvc storage class name | manual | 
| persistence.data.resources.requests.storage | Nacos data pvc requests storage | 5G | 
| service.type | http service type | NodePort | 
| service.port | http service port | 8848 | 
| service.nodePort | http service nodeport | 30000 | 
| ingress.enabled | Enable ingress or not | false | 
| ingress.annotations | The annotations used in ingress | {} | 
| ingress.hosts | The host of nacos service in ingress rule | nacos.example.com | 
入坑指南
坑 1:service.nodePort 映射的是不是 HTTP 端口?
上面配置参数:service.nodePort 的解释是 http service nodeport,那么 http 端口只有 8848。但实际真的是这样吗?不懂就查 😊
查看 Service 信息
从 service 上看,端口映射如下:
- http 8848/TCP -》http 32566/TCP
- client-rpc 9848/TCP -》client-rpc 32724/TCP
- raft-rpc 9849/TCP -》raft-rpc 32656/TCP
- old-raft-rpc 7848/TCP -》old-raft-rpc 30000/TCP
所以,service.nodePort 对应的是 old-raft-rpc 端口,并不是 8848 http 端口。
另外一个坑,这里 8848 和 9848 应该按照偏移量(offset)来生成,但实际是随机值,会导致集群外 Nacos 客户端无法正常连接到 Nacos。
kubectl describe service nacos-cs
# Name:                     nacos-cs
# Namespace:                default
# Labels:                   app.kubernetes.io/managed-by=Helm
# Annotations:              meta.helm.sh/release-name: my-nacos
#                           meta.helm.sh/release-namespace: default
# Selector:                 app.kubernetes.io/instance=my-nacos,app.kubernetes.io/name=nacos
# Type:                     NodePort
# IP:                       192.168.103.146
# Port:                     http  8848/TCP
# TargetPort:               8848/TCP
# NodePort:                 http  32566/TCP
# Endpoints:                192.168.102.217:8848
# Port:                     client-rpc  9848/TCP
# TargetPort:               9848/TCP
# NodePort:                 client-rpc  32724/TCP
# Endpoints:                192.168.102.217:9848
# Port:                     raft-rpc  9849/TCP
# TargetPort:               9849/TCP
# NodePort:                 raft-rpc  32656/TCP
# Endpoints:                192.168.102.217:9849
# Port:                     old-raft-rpc  7848/TCP
# TargetPort:               7848/TCP
# NodePort:                 old-raft-rpc  30000/TCP
# Endpoints:                192.168.102.217:7848
# Session Affinity:         None
# External Traffic Policy:  Cluster
# Events:                   <none>
排查 templates/service.yaml
查看 templates/service.yaml,发现确实把 7848 指向了 30000 端口(service.nodePort)…
- 8848 HTTP 端口
- 9848 客户端 RPC 端口
- 9849 Raft RPC 端口
- 7848 兼容 1.4.x Raft RPC 端口

至此,真相大白!!!🚀🚀🚀
坑 2:resources 内存配置,不会改变 JVM 启动参数
需要注意的是,即便 resources 的内存调整为 10Gi,但是容器也只会使用 1g 作为堆内存大小。
因为容器使用环境变量 JVM_XMX、JVM_XMS、JVM_XMN 指定堆内存最大、最小、新生代大小。
查看 Nacos Chart 模板,发现没有地方可以配置环境变量。😂
那怎么改才能实现呢?😊
- 添加新参数,将新参数放入 ConfigMap,最后在 StatefulSet 中配置环境变量并引用 ConfigMap。
- 涉及 templates 下的 configmap.yaml 和 statefulset.yaml 模板文件。
参考
1.https://artifacthub.io/packages/helm/kubegemsapp/nacos
 2.https://github.com/nacos-group/nacos-k8s/
相关博文
1.第 1 篇 Helm 简介及安装
 2.第 2 篇 Helm 部署 MySQL【入门案例】
 3.第 3 篇 Helm 命令、环境变量、相关目录
 4.第 4 篇 Chart 仓库详解
 5.第 5 篇 Chart 文件结构详解
 6.第 6 篇 自定义 Helm Chart
 7.第 7 篇 Helm 部署 Nacos【详细步骤】
 8.第 8 篇 Chart 修改入门示例:Nacos
 9.第 9 篇 Helm 部署 Seata Server
 10.第 10 篇 Chart 修改完美示例:Seata Server
 11.第 11篇 Helm 部署 RabbitMQ
 12.第 12 篇 Helm 部署 Redis
 13.第13 篇 Helm 部署 ElasticSearch
