第 7 篇 Helm 部署 Nacos【详细步骤】


🚀 本文内容:使用 Helm 部署 Nacos。


Nacos:动态服务发现、服务配置、服务元数据和流量管理。

Nacos Chart:Nacos Server 官方 Helm Chart,基于 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: standalone

nacos:
  # nacos 镜像配置
  image:
    repository: nacos/nacos-server
    tag: v2.2.0
    pullPolicy: IfNotPresent
  # nacos 插件配置
  plugin:
    enable: true
    image:
      repository: nacos/nacos-peer-finder-plugin
      tag: 1.1
  # 启用健康检测
  health:
    enabled: true
  # nacos 存储
  storage:
    type: mysql
    db:
      host: 172.20.134.48
      port: 32000
      name: nacos
      username: root
      password: Yumc@ru123
      param: characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&useSSL=false

# 持久化存储
persistence:
  enabled: true
  data:
    accessModes:
      - ReadWriteOnce
    # 指定 StorageClass
    storageClassName: managed-nfs-storage
    resources:
      requests:
        storage: 4Gi

# service 配置
service:
  type: NodePort
  port: 8848
  # !!! 这里并不是 8848 对应 30000 端口,实际上是 7748 对应的 30000 端口,所以此端口对于外部访问来说没有用!
  nodePort: 30000

# 资源限制(调大内存的同时,必须同时修改环境变量 JVM_XMS、JVM_XMX、JVM_XMN,否则还是使用 1g 堆内存!!!)
resources:
  requests:
    cpu: 500m
    memory: 2Gi
  limits:
    cpu: 1000m
    memory: 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: cluster

nacos:
  replicaCount: 3
  # nacos 镜像配置
  image:
    repository: nacos/nacos-server
    tag: v2.2.0
    pullPolicy: IfNotPresent
  # nacos 插件配置
  plugin:
    enable: true
    image:
      repository: nacos/nacos-peer-finder-plugin
      tag: 1.1
  # 启用健康检测
  health:
    enabled: true
  # nacos 存储
  storage:
    type: mysql
    db:
      host: 172.20.134.48
      port: 32000
      name: nacos
      username: root
      password: Yumc@ru123
      param: characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&useSSL=false

# 持久化存储
persistence:
  enabled: true
  data:
    accessModes:
      - ReadWriteOnce
    # 指定 StorageClass
    storageClassName: managed-nfs-storage
    resources:
      requests:
        storage: 4Gi

# service 配置
service:
  type: NodePort
  port: 8848
  # !!! 这里并不是 8848 对应 30000 端口,实际上是 7748 对应的 30000 端口,所以此端口对于外部访问来说没有用!
  nodePort: 30000

# 资源限制(调大内存的同时,必须同时修改环境变量 JVM_XMS、JVM_XMX、JVM_XMN,否则还是使用 1g 堆内存!!!)
resources:
  requests:
    cpu: 500m
    memory: 2Gi
  limits:
    cpu: 1000m
    memory: 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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

甘蓝聊Java

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值