隨著項目業務發展,微服務架構升級,傳統的配置文件方式和資料庫方式已經無法滿足對配置管理的需求.
本文記錄一下Nacos的部署過程, 以及碰到的問題
1. 部署完成後的效果訪問nacos集群界面
k8s部署效果, 啟動3個有狀態的Pod
2. 部署過程本文採用的部署方式為, 連接外部MySQL資料庫, 不需要配置PV, PVC的相關屬性
打包Nacos鏡像,上傳到公司內部harbor鏡像倉庫
FROM nacos/nacos-server:v2.0.3
初始化資料庫
# 使用自主資料庫,需要先手動創建資料庫並初始化SQL
https://github.com/alibaba/nacos/blob/develop/distribution/conf/nacos-mysql.sql
創建namespace / configMap / secret
---
# 創建namespace
apiVersion: v1
kind: Namespace
metadata:
name: kube-nacos
---
apiVersion: v1
kind: ConfigMap
metadata:
name: nacos-cm
namespace: kube-nacos
data:
mysql.host: "172.16.11.66"
mysql.db.name: "nacos"
mysql.port: "3306"
---
apiVersion: v1
kind: Secret
metadata:
name: nacos-secret
namespace: kube-nacos
data:
dbUserName: eHVoCg==
dbPassword: cm9vdAo=
---
通過kubectl客戶端執行命令
kubectl create -f nacos-data.yaml
創建service / StatefulSet
###使用自建資料庫;使用Ingress發布配置後臺###
---
# 創建service對內部提供服務
apiVersion: v1
kind: Service
metadata:
name: nacos-svc
namespace: kube-nacos
labels:
app: nacos-svc
spec:
type: ClusterIP
clusterIP: None
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
selector:
app: nacos
---
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: nacos
namespace: kube-nacos
spec:
serviceName: nacos-svc
replicas: 3
template:
metadata:
labels:
app: nacos
spec:
# 設置pod的反親和性
affinity:
podAntiAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
- topologyKey: kubernetes.io/hostname
labelSelector:
matchExpressions:
- key: app
operator: In
values:
- nacos
containers:
- name: k8s-nacos
imagePullPolicy: Always
image: reg.xxxxx.xx/services/nacos:2.0.3
resources:
requests:
memory: "1Gi"
cpu: "500m"
ports:
- containerPort: 8848
name: client
- containerPort: 9848
name: client-rpc
- containerPort: 9849
name: raft-rpc
- containerPort: 7848
name: old-raft-rpc
env:
- name: NACOS_REPLICAS
value: "3"
- name: MYSQL_SERVICE_HOST
valueFrom:
configMapKeyRef:
name: nacos-cm
key: mysql.host
- name: MYSQL_SERVICE_DB_NAME
valueFrom:
configMapKeyRef:
name: nacos-cm
key: mysql.db.name
- name: MYSQL_SERVICE_PORT
valueFrom:
configMapKeyRef:
name: nacos-cm
key: mysql.port
- name: MYSQL_SERVICE_USER
valueFrom:
secretKeyRef:
name: nacos-secret
key: dbUserName
- name: MYSQL_SERVICE_PASSWORD
valueFrom:
secretKeyRef:
name: nacos-secret
key: dbPassword
- name: MYSQL_SERVICE_DB_PARAM
value: "characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&useSSL=false&serverTimezone=UTC"
- name: MODE
value: "cluster"
- name: NACOS_SERVER_PORT
value: "8848"
- name: PREFER_HOST_MODE
value: "hostname"
- name: NACOS_SERVERS
value: "nacos-0.nacos-svc.kube-nacos.svc.cluster.local:8848 nacos-1.nacos-svc.kube-nacos.svc.cluster.local:8848 nacos-2.nacos-svc.kube-nacos.svc.cluster.local:8848"
selector:
matchLabels:
app: nacos
----
# 創建Ingress
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: nacos
namespace: kube-nacos
spec:
rules:
- host: nacos.xuh.com
http:
paths:
- backend:
serviceName: nacos-svc
servicePort: server
path: /
執行 kubectl create命令後查看容器狀態
瀏覽器中訪問Ingress中的host
區域網內,通過配置host的方式,進行測試.需要暴露到公網的話,將域名解析到伺服器上即可(內部系統不建議暴露到公網)
3. 總結部署是完成了, 但是部署過程中碰到了一些問題
Pod啟動失敗, 查看容器中的日誌文件報錯
No DataSource set
Caused by: com.mysql.cj.exceptions.InvalidConnectionAttributeException: The server time zone value '�й���ʱ��' is unrecognized or represents more than one time zone. You must configure either the server or JDBC driver (via the serverTimezone configuration property) to use a more specifc time zone value if you want to utilize time zone support.
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
..
ERROR Nacos failed to start, please see \home\nacos\logs\nacos.log for more details.
主要錯誤 : The server time zone value 『�й���ʱ��』 is unrecognized or represents more than one time zone. You must configure either the server or JDBC driver (via the serverTimezone configuration property) to use a more specifc time zone value if you want to utilize time zone support.
解決辦法: StatefulSet中spec.containers.env添加MYSQL_SERVICE_DB_PARAM信息
資料庫連接URL參數, 添加 ?serverTimezone=UTC
文檔地址https://hub.docker.com/r/nacos/nacos-server
集群節點只有一個UP, 其他節點狀態為 DOWN
官方文檔, Nacos集群部署在 default空間下. 如果自己搭建的Nacos放在其他namespace下, 需要修改 :
StatefulSet下spec.containers.env中的NACOS_SERVERS信息
附: spec.containers.env公眾參數配置信息namedescriptionoptionMODEcluster/standalonecluster/standalone default clusterNACOS_SERVERSnacos cluster addresseg. ip1:port1 ip2:port2 ip3:port3PREFER_HOST_MODEWhether hostname are supportedhostname/ip default ipNACOS_APPLICATION_PORTnacos server portdefault 8848NACOS_SERVER_IPcustom nacos server ip when network was mutil-network參考文檔:
https://github.com/nacos-group/nacos-k8s
https://nacos.io/zh-cn/docs/use-nacos-with-kubernetes.html
https://hub.docker.com/r/nacos/nacos-server