当前位置: 首页 > news >正文

第 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 配置参数如下:

ParameterDescriptionDefault
global.modeRun Mode (quickstart, standalone, cluster; )standalone
resourcesThe [resources] to allocate for nacos container{}
nodeSelectorNacos labels for pod assignment{}
affinityNacos affinity policy{}
tolerationsNacos tolerations{}
resources.requests.cpunacos requests cpu resource500m
resources.requests.memorynacos requests memory resource2G
nacos.replicaCountNumber of desired nacos pods, the number should be 1 as run standalone mode1
nacos.image.repositoryNacos container image namenacos/nacos-server
nacos.image.tagNacos container image taglatest
nacos.image.pullPolicyNacos container image pull policyIfNotPresent
nacos.plugin.enableNacos cluster plugin that is auto scaletrue
nacos.plugin.image.repositoryNacos cluster plugin image namenacos/nacos-peer-finder-plugin
nacos.plugin.image.tagNacos cluster plugin image tag1.1
nacos.health.enabledEnable health check or notfalse
nacos.env.preferhostmodeEnable Nacos cluster node domain name supporthostname
nacos.env.serverPortNacos port8848
nacos.storage.typeNacos data storage method mysql or embedded. The embedded supports either standalone or cluster modeembedded
nacos.storage.db.hostmysql host
nacos.storage.db.namemysql database name
nacos.storage.db.portmysql port3306
nacos.storage.db.usernameusername of database
nacos.storage.db.passwordpassword of database
nacos.storage.db.paramDatabase url parametercharacterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&useSSL=false
persistence.enabledEnable the nacos data persistence or notfalse
persistence.data.accessModesNacos data pvc access modeReadWriteOnce
persistence.data.storageClassNameNacos data pvc storage class namemanual
persistence.data.resources.requests.storageNacos data pvc requests storage5G
service.typehttp service typeNodePort
service.porthttp service port8848
service.nodePorthttp service nodeport30000
ingress.enabledEnable ingress or notfalse
ingress.annotationsThe annotations used in ingress{}
ingress.hostsThe host of nacos service in ingress rulenacos.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


http://www.mrgr.cn/news/24922.html

相关文章:

  • Java控制台+activiti+springboot+mybatis实现账务报销工作流程
  • 华为OD机试 - 周末爬山 - 广度优先搜索BFS(Python/JS/C/C++ 2024 E卷 200分)
  • 通用与专用LabVIEW软件版本对比
  • MAX3483ESA+T具有±15kV ESD保护的+3.3V、低功耗收发器,适用于RS-485和RS-422通信
  • 【时时三省】tessy 单元测试 集成测试 专栏 文章阅读说明
  • C#里的分治算法和汉诺塔问题
  • 可解释性机器学习的目标
  • c语言位运算符速成
  • SciPy 模块列表
  • 如何删除电脑系统桌面文件右键菜单多余选项
  • 用Blender来烘培模型材质
  • 赋能百业:多模态处理技术与大模型架构下的AI解决方案落地实践
  • 如何在 Ubuntu 系统上部署 Laravel 项目 ?
  • Java 每日一刊(第4期):Java 23 即将发布
  • Ae软件2018-2023全版本 不限速下载
  • C语言 | Leetcode C语言题解之第399题除法求值
  • Python | Leetcode Python题解之第400题第N位数字
  • Spring Cloud(一)
  • 3个热门、好用、功能强大的C#开源帮助工具类
  • 日志管理之Logrotate