文章目录
- 安装 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: 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 配置参数如下:
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