一,nacos 概览
Nacos 致力于帮助您发现、配置和管理微服务。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据及流量管理。
Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。 Nacos 是构建以“服务”为中心的现代应用架构 (例如微服务范式、云原生范式) 的服务基础设施。
二,nacos 2.0版本须知
nacos2.0版本相比1.X新增了gRPC的通信方式,因此需要增加2个端口。新增端口是在配置的主端口(server.port)基础上,进行一定偏移量自动生成。
端口 | 与主端口的偏移量 | 描述 |
---|---|---|
9848 | 1000 | 客户端gRPC请求服务端端口,用于客户端向服务端发起连接和请求 |
9849 | 1001 | 服务端gRPC请求服务端端口,用于服务间同步等 |
使用VIP/nginx请求时,需要配置成TCP转发,不能配置http2转发,否则连接会被nginx断开。
客户端拥有相同的计算逻辑,用户如同1.X的使用方式,配置主端口(默认8848),通过相同的偏移量,计算对应gRPC端口(默认9848)。
因此如果客户端和服务端之前存在端口转发,或防火墙时,需要对端口转发配置和防火墙配置做相应的调整。
三,nacos部署
1. 准备外部ceph存储,部署好ceph-csi,以及storageclass的存储名部署nacos需要用到。
ceph-csi部署:K8S使用ceph-csi持久化存储之cephfs部署验证快照
ceph存储:ceph v15.2.13版本[octopus]分布式集群部署
2. 准备好数据库,我们集群里面是有数据库,这里我就不做配置直接使用,然后导入数据库。
数据库在GitHub里面有,可以复制一份。 https://github.com/alibaba/nacos/blob/develop/distribution/conf/nacos-mysql.sql
官方nacos集群yaml文档参考:https://github.com/nacos-group/nacos-k8s.git
3. 创建配置文件
# cat configmap.yaml
---
apiVersion: v1
kind: ConfigMap
metadata:
name: nacos-cm
namespace: nacos
data:
mysql.db.name: "nacos_devtest"
mysql.db.host: "10.102.155.63" # mysql数据库内部地址
mysql.port: "3306"
mysql.user: "root"
mysql.password: "uUN38#%pq"
# 部署以及查看状态
[root@master ~]# kubectl apply -f configmap.yaml
[root@master ~]# kubectl get configmap -n nacos
NAME DATA AGE
nacos-cm 5 28d
4. 部署nacos service服务以及设置NodePort暴露外部端口
# cat nacos-service.yaml
---
apiVersion: v1
kind: Service
metadata:
name: nacos-headless
namespace: nacos
labels:
app: nacos
annotations:
service.alpha.kubernetes.io/tolerate-unready-endpoints: "true"
spec:
ports:
- port: 8848
name: server
targetPort: 8848
- port: 9848
name: client-rpc
targetPort: 9848
- port: 9849
name: raft-rpc
targetPort: 9849
## 兼容1.4.x版本的选举端口
- port: 7848
name: old-raft-rpc
targetPort: 7848
clusterIP: None
selector:
app: nacos
---
apiVersion: v1
kind: Service
metadata:
name: nacos
namespace: nacos
labels:
app: nacos
annotations:
service.alpha.kubernetes.io/tolerate-unready-endpoints: "true"
spec:
ports:
- protocol: TCP
port: 8848
targetPort: 8848
nodePort: 38848
name: nacos-http
- protocol: TCP
port: 9849
targetPort: 9849
name: raft-rpc
nodePort: 39849
selector:
app: nacos
type: NodePort
# 执行命令
[root@master ~]# kubectl apply -f nacos-service.yaml
# 查看nacos服务状态
[root@master ~]# kubectl get svc -n nacos
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
mysql-nacos NodePort 10.98.111.83 <none> 3306:33306/TCP 29d
nacos NodePort 10.108.121.237 <none> 8848:38848/TCP,9849:39849/TCP 28d
nacos-headless ClusterIP None <none> 8848/TCP,9848/TCP,9849/TCP,7848/TCP 28d
5. 创建部署文件StatefulSet
StatefulSet部署方式为每个POD生成固定的名称,如nacos-0、nacos-1、nacos-2等。
StatefulSet和Headless Service为每个nacos实例生成一个唯一的dns地址,其中NACOS_SERVERS 的value值一定要根据实际情况来更改:
模板:statefulset名.nacos服务名.空间命名.svc.cluster.local:端口
我的空间命名是nacos所以是:nacos-0.nacos-headless.nacos.svc.cluster.local:8848
# cat nacos-statefulset.yaml
---
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: nacos
namespace: nacos
spec:
serviceName: nacos-headless ## nacos服务名,名字要统一
replicas: 3
template:
metadata:
labels:
app: nacos
# annotations:
# pod.alpha.kubernetes.io/initialized: "true"
spec:
# affinity:
# podAntiAffinity:
# requiredDuringSchedulingIgnoredDuringExecution:
# - labelSelector:
# matchExpressions:
# - key: "app"
# operator: In
# values:
# - nacos
# topologyKey: "kubernetes.io/hostname"
#serviceAccountName: cephfs-provisioner
initContainers:
- name: peer-finder-plugin-install
image: jinyuyun.top/nacos-peer-finder-plugin:1.1
imagePullPolicy: Always
volumeMounts:
- mountPath: /home/nacos/plugins/peer-finder
name: data
subPath: peer-finder
containers:
- name: nacos
imagePullPolicy: Always
image: jinyuyun.top/nacos-server:2.0.0
resources:
requests:
memory: "2Gi"
cpu: "500m"
limits:
memory: "2048Mi"
cpu: "512m"
ports:
- containerPort: 8848
name: client-port
- containerPort: 9848
name: client-rpc
- containerPort: 9849
name: raft-rpc
#- containerPort: 7848
#name: old-raft-rpc
env:
- name: NACOS_REPLICAS
value: "3"
- name: SERVICE_NAME
value: "nacos-headless"
- name: DOMAIN_NAME
value: "cluster.local"
- name: POD_NAMESPACE
valueFrom:
fieldRef:
apiVersion: v1
fieldPath: metadata.namespace
- name: MYSQL_SERVICE_DB_NAME
valueFrom:
configMapKeyRef:
name: nacos-cm
key: mysql.db.name
- name: MYSQL_SERVICE_HOST
valueFrom:
configMapKeyRef:
name: nacos-cm
key: mysql.db.host
- name: MYSQL_SERVICE_PORT
valueFrom:
configMapKeyRef:
name: nacos-cm
key: mysql.port
- name: MYSQL_SERVICE_USER
valueFrom:
configMapKeyRef:
name: nacos-cm
key: mysql.user
- name: MYSQL_SERVICE_PASSWORD
valueFrom:
configMapKeyRef:
name: nacos-cm
key: mysql.password
- name: NACOS_SERVER_PORT
value: "8848"
- name: NACOS_APPLICATION_PORT
value: "8848"
- name: NACOS_APPLICATION_PORT
value: "8848"
- name: PREFER_HOST_MODE
value: "hostname"
- name: NACOS_SERVERS ##节点IP
value: "nacos-0.nacos-headless.nacos.svc.cluster.local:8848 nacos-1.nacos-headless.naocs.svc.cluster.local:8848 nacos-2.nacos-headless.nacos.svc.cluster.local:8848"
volumeMounts:
- name: data
mountPath: /home/nacos/plugins/peer-finder
subPath: peer-finder
- name: data
mountPath: /home/nacos/data
subPath: data
- name: data
mountPath: /home/nacos/logs
subPath: logs
volumeClaimTemplates: ## 给nacos创建存储类卷名pvc并分配存储
- metadata:
name: data
spec:
accessModes: [ "ReadWriteMany" ]
storageClassName: "jyy-cephfs-sc"
resources:
requests:
storage: 1Gi
selector:
matchLabels:
app: nacos
# 执行部署命令
[root@master ~]# kubectl apply -f nacos-statefulset.yaml
# 查看部署状态
[root@master ~]# kubectl get statefulset -n nacos
NAME READY AGE
nacos 3/3 28d
[root@master ~]# kubectl get pod -n nacos
NAME READY STATUS RESTARTS AGE
mysql-naocs-f4kwc 1/1 Running 3 29d
nacos-0 1/1 Running 1 8d
nacos-1 1/1 Running 2 28d
nacos-2 1/1 Running 3 28d
官方bug:### 已知问题
- 启动后需要重启pod nacos-0集群才能正常使用
6. 可以配置Ingress(可选),这儿直接用的nodeport暴露端口方式外部访问。
http://192.168.1.90:38848/nacos/
7. 参考
https://blog.51cto.com/fengwan/2941368
更多推荐