部署过程
数据库
- 在RDS上创建名为nacos的库以及用户,记录密码。
- 为nacos用户授权nacos库的读写权限。
- 记录RDS的内网连接地址及端口。
- 通过Navicat连接RDS,对nacos库导入数据结构。
.sql 文件可以从官方 clone 出来的目录中找到。
git clone https://github.com/nacos-group/nacos-k8s.git
NAS
在NAS上创建一个挂载点,选择和ACK集群同VPC即可。
PVC
- 进入ACK集群。
- 菜单栏选择存储>存储声明。
- 切换到目标命名空间。如果还未创建命名空间,先创建。
- 点击创建存储声明,参考下面的截图进行配置。
- 创建完成后,记录存储声明的名称nacos-data-pvc,后续使用。
ConfigMap
- 在ACK控制台菜单栏中选择配置管理>配置项。
- 单击使用YAML创建资源。
- 输入以下内容,单击创建,创建名为nacos-cm的ConfigMap,用于传递RDS的信息。
apiVersion: v1
kind: ConfigMap
metadata:
name: nacos-cm
data:
mysql.host: "*****.mysql.rds.aliyuncs.com"
mysql.db.name: "nacos"
mysql.port: "3306"
mysql.user: "nacos"
mysql.password: "*******"
Secret
为了开启 Nacos 的 https 访问,所以需要参考下面的步骤,创建 Secret。
- 在ACK控制台菜单栏中选择配置管理>保密字典。
- 单击创建,将SSL证书的公私钥配置进去,保存并记录字典名称。
SSL 证书请自行申请获取,不开启 https 访问的话,这里可以省略,ingress 里也省略 tls 的部分即可。
Service
- 在ACK控制台菜单栏中选择网络>服务。
- 单击使用YAML创建资源。
- 输入以下内容,单击创建,创建名为nacos-svc的服务。
apiVersion: v1
kind: Service
metadata:
name: nacos-svc
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
端口均和官网文档保持一致。
StatefulSet
- 在ACK控制台菜单栏中选择工作负载>有状态。
- 单击使用YAML创建资源。
- 输入以下内容,单击创建,创建名为nacos-sfs的有状态负载。
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: nacos-sfs
namespace: default
spec:
replicas: 2
selector:
matchLabels:
app: nacos
serviceName: nacos-svc
template:
metadata:
annotations:
pod.alpha.kubernetes.io/initialized: 'true'
labels:
app: nacos
spec:
containers:
- env:
- name: NACOS_REPLICAS
value: '2'
- name: POD_NAME
valueFrom:
fieldRef:
apiVersion: v1
fieldPath: metadata.name
- name: SERVICE_NAME
value: nacos-svc
- name: DOMAIN_NAME
value: cluster.local
- name: POD_NAMESPACE
valueFrom:
fieldRef:
apiVersion: v1
fieldPath: metadata.namespace
- name: MYSQL_SERVICE_HOST
valueFrom:
configMapKeyRef:
key: mysql.host
name: nacos-cm
- name: MYSQL_SERVICE_DB_NAME
valueFrom:
configMapKeyRef:
key: mysql.db.name
name: nacos-cm
- name: MYSQL_SERVICE_PORT
valueFrom:
configMapKeyRef:
key: mysql.port
name: nacos-cm
- name: MYSQL_SERVICE_USER
valueFrom:
configMapKeyRef:
key: mysql.user
name: nacos-cm
- name: MYSQL_SERVICE_PASSWORD
valueFrom:
configMapKeyRef:
key: mysql.password
name: nacos-cm
- name: NACOS_SERVER_PORT
value: '8848'
- name: NACOS_APPLICATION_PORT
value: '8848'
- name: PREFER_HOST_MODE
value: hostname
- name: NACOS_AUTH_ENABLE
value: 'true'
image: 'nacos/nacos-server:latest'
imagePullPolicy: Always
name: nacos
ports:
- containerPort: 8848
name: client-port
protocol: TCP
- containerPort: 9848
name: client-rpc
protocol: TCP
- containerPort: 9849
name: raft-rpc
protocol: TCP
- containerPort: 7848
name: old-raft-rpc
protocol: TCP
resources:
requests:
memory: 2Gi
limits:
memory: 2Gi
terminationMessagePath: /dev/termination-log
terminationMessagePolicy: File
volumeMounts:
- mountPath: /home/nacos/plugins/peer-finder
name: volume-nacos-data
subPath: peer-finder
- mountPath: /home/nacos/data
name: volume-nacos-data
subPathExpr: $(POD_NAME)
- mountPath: /home/nacos/logs
name: volume-nacos-data
subPath: logs
dnsPolicy: ClusterFirst
initContainers:
- image: 'nacos/nacos-peer-finder-plugin:1.1'
imagePullPolicy: Always
name: peer-finder-plugin-install
resources: {}
terminationMessagePath: /dev/termination-log
terminationMessagePolicy: File
volumeMounts:
- mountPath: /home/nacos/plugins/peer-finder
name: volume-nacos-data
subPath: peer-finder
restartPolicy: Always
schedulerName: default-scheduler
securityContext: {}
terminationGracePeriodSeconds: 30
volumes:
- name: volume-nacos-data
persistentVolumeClaim:
claimName: nacos-data
updateStrategy:
type: RollingUpdate
- 此处的副本数为2,后续结果验证时将扩容到 3 个。
- mysql相关的配置从上面创建的ConfigMap中获取。
- 限制资源使用量为内存2G。
- 挂载了3个存储卷。
- 服务名称与上面创建的服务一致。
-
检查负载的状态,等待几分钟后,确认状态均为running。
-
查看日志,确认最新日志显示nacos启动成功,并且以集群+外置存储方式运行。
Ingress
- 在ACK控制台菜单栏中选择网络>路由。
- 单击使用YAML创建资源。
- 输入以下内容,单击创建,创建名为nacos-ingress的路由。
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
annotations:
nginx.ingress.kubernetes.io/force-ssl-redirect: 'true'
nginx.ingress.kubernetes.io/service-weight: ''
name: nacos-ingress
namespace: ops-share
spec:
rules:
- host: nacos.xxx.com
http:
paths:
- backend:
serviceName: nacos-svc
servicePort: 8848
path: /
pathType: ImplementationSpecific
tls:
- hosts:
- nacos.xxx.com
secretName: nacos-secret1629271865685
status:
loadBalancer:
ingress:
- ip: x.x.x.x
- 其中8848为Nacos的控制台端口。
- nacos-svc为上面创建的服务名称。
- nacos.xxx.com为访问域名,根据实际情况填写。
- secretName为创建的保密字典名称。
- ip为负载均衡的外网IP地址,以便下面进行DNS解析。
DNS
创建一条A记录,名称nacosx指向上面负载均衡的外网地址 。
结果验证
- 通过域名访问,确认可以正常访问到Nacos的后台。
- 在集群管理>节点列表里,确认可以看到和k8s副本数一致的节点数,并且状态为UP。
- 在ACK控制台,调整nacos-sfs的副本数,增加到3个副本,确认Nacos后台的节点数变为3个,并且状态为UP。即节点数与副本数保持完全一致。
- 差个每个 Nacos 节点的元数据,确认其中不存在报错。
参考文档
更多信息
- 开启鉴权:创建nacos-sfs时,添加的环境变量中
NACOS_AUTH_ENABLE=true
就是用来开启鉴权的。如果没有添加此环境变量,默认不启用鉴权。 - 鉴权开启后,给用户授权时,务必授予 读写 权限,以免服务无法正常注册及读取配置。