K8S-Nacos高可用集群搭建

2022-01-16 K8S學習之路
K8S-Nacos高可用集群搭建背景

隨著項目業務發展,微服務架構升級,傳統的配置文件方式和資料庫方式已經無法滿足對配置管理的需求.

本文記錄一下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
SPRING_DATASOURCE_PLATFORMstandalone support mysqlmysql / empty default emptyMYSQL_SERVICE_HOSTmysql host
MYSQL_SERVICE_PORTmysql database portdefault : 3306MYSQL_SERVICE_DB_NAMEmysql database name
MYSQL_SERVICE_USERusername of database
MYSQL_SERVICE_PASSWORDpassword of database
MYSQL_DATABASE_NUMIt indicates the number of databasedefault :1MYSQL_SERVICE_DB_PARAMDatabase url parameterdefault : characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&useSSL=falseJVM_XMS-Xmsdefault :1gJVM_XMX-Xmxdefault :1gJVM_XMN-Xmndefault :512mJVM_MS-XX:MetaspaceSizedefault :128mJVM_MMS-XX:MaxMetaspaceSizedefault :320mNACOS_DEBUGenable remote debugy/n default :nTOMCAT_ACCESSLOG_ENABLEDserver.tomcat.accesslog.enableddefault :falseNACOS_AUTH_SYSTEM_TYPEThe auth system to use, currently only 『nacos』 is supporteddefault :nacosNACOS_AUTH_ENABLEIf turn on auth systemdefault :falseNACOS_AUTH_TOKEN_EXPIRE_SECONDSThe token expiration in secondsdefault :18000NACOS_AUTH_TOKENThe default tokendefault :SecretKey012345678901234567890123456789012345678901234567890123456789NACOS_AUTH_CACHE_ENABLETurn on/off caching of auth information. By turning on this switch, the update of auth information would have a 15 seconds delay.default : falseMEMBER_LISTSet the cluster list with a configuration file or command-line argumenteg:192.168.16.101:8847?raft_port=8807,192.168.16.101?raft_port=8808,192.168.16.101:8849?raft_port=8809EMBEDDED_STORAGEUse embedded storage in cluster mode without mysqlembedded default : noneNACOS_AUTH_CACHE_ENABLEnacos.core.auth.caching.enableddefault : falseNACOS_AUTH_USER_AGENT_AUTH_WHITE_ENABLEnacos.core.auth.enable.userAgentAuthWhitedefault : falseNACOS_AUTH_IDENTITY_KEYnacos.core.auth.server.identity.keydefault : serverIdentityNACOS_AUTH_IDENTITY_VALUEnacos.core.auth.server.identity.valuedefault : securityNACOS_SECURITY_IGNORE_URLSnacos.security.ignore.urlsdefault : /,/error,/**/*.css,/**/*.js,/**/*.html,/**/*.map,/**/*.svg,/**/*.png,/**/*.ico,/console-fe/public/**,/v1/auth/**,/v1/console/health/**,/actuator/**,/v1/console/server/**

參考文檔:

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

相關焦點

  • 微服務學習之路(1)——配置中心Nacos鏡像製作、集群搭建
    關於Nacos本文不作詳述,相關信息請參見:https://nacos.io本文將重點介紹Nacos源碼編譯、Docker鏡像製作、集群搭建相關內容。源碼編譯本文採用Kubernetes+Mysql方式進行Nacos集群搭建,但MySQL集群版本較低,在使用Nacos官方提供的鏡像時報驅動程序相關錯誤,因此需要在源碼層面修改訪問MySQL資料庫的驅動程序版本。
  • Nacos的那些事兒(一):集群搭建
    /startup.sh -m cluster (集群)ps:若啟動失敗,先查看日誌確認下什麼方式啟動的。"集群模式改為單機模式,set MODE = "standalone"  或者配置mysql資料庫解決:配置mysql資料庫解決//默認埠為8848http://yourlocalhost:8848/nacos/index.html帳戶:nacos  密碼:nacos
  • Nacos 集群部署模式最佳實踐
    在實踐中,我們往往習慣用單機模式快速構建一個 Nacos 開發/測試環境,而在生產中,出於高可用的考慮,一定需要使用 Nacos 集群部署模式。我的上一篇文章《一文詳解 Nacos 高可用特性》提到了 Nacos 為高可用做了非常多的特性支持,而這些高可用特性大多數都依賴於集群部署模式。
  • CentOS7下快速搭建K8s集群實踐
    Kubernetes 的服務、支持和工具廣泛可用。 (圖片可放大查看)(圖片可放大查看)CentOS7下快速搭建K8s集群實踐也可以參考之前文章CentOS7環境下快速部署Kubernetes(k8s)集群CentOS7下利用Rancher搭建K8s集群具體步驟如下1、基礎環境說明
  • 一分鐘,搭建k8s集群
    JAVA環境作者|劉蒞hello大家好,今天我們一起動手,採用kubeadm方式,搭建一個k8s集群。單master集群我們搭建單master集群,一個master(為了保證高可用,生產中需要搭建多master集群)。
  • k8s系列第八篇~k8s集群環境搭建
    前七篇文章帶大家初步了解了kubernetes資源對象,本文主要帶大家搭建kubernetes集群環境。
  • K8S系列之一:k8s集群搭建
    機器準備準備三臺機器k8s-master: 此機器用來安裝k8s-master的操作環境k8s-node01: 此機器用來安裝
  • k8s(二) ---- kubeadm 的方式搭建 k8s 集群
    16G 內存 + SSD 的 MacBook Pro 上偶爾已經可以感受到卡頓2.2.3 搭建集群的方式簡單, 快速, 組件自動安裝過程繁瑣, 所有組件都需要自行安裝, 並且底層配置複雜, 容易出錯且不易排查, 只適用於底層原理學習階段2.3 kubeadm 的方式搭建 k8s 集群2.3.1 環境準備
  • k8s集群上ingress實戰
    ←-> k8s ingress controller(ingress) ←-> k8s service ←-> k8s pods當自己拿幾個裸機或者虛擬機搭建k8s集群時,往往沒有公有雲LoadBalancer支持,只能迂迴通過NodePort方式把ingress controller服務暴露出去,訪問流相應變為如下
  • kubeadm搭建的K8S集群升級
    升級說明可以小版本升級,也可以跨一個大版本升級,不建議跨兩個大版本升級升級目標將kubernetes 1.17.9版本升級到1.18.9版本現有集群版本已經節點如下:# kubectl get nodes NAME
  • 簡單了解一下K8S,並搭建自己的集群
    文章前半段會簡單的介紹一下K8S,後半段會介紹如何從零開始慢慢的搭建集群。如果想直接開始著手搭建集群,則可以直接從第三章開始看。1. K8S是什麼K8S全稱kubernetes,是由Google在2014年開源的生產級別的容器編排系統,或者說是微服務和雲原生平臺。
  • 手把手教大家使用樹莓派4B搭建K8s集群
    為什麼要使用樹莓派安裝K8s自己折騰很多雲伺服器,曾經的MJJ(VPS圈中的垃圾佬),花了好多錢買了很多便宜機器,啥事也沒幹,想要自己搭建一個K8s集群肯定需要一些穩定的機器了,國外的不穩定,國內的機器買時一時爽,續費火葬場。綜合考慮使用樹莓派再好不過了,功耗小,永久使用權,方便折騰,網上也有人實現了,所以毫不猶豫就下手了。
  • 實戰:kubeadm方式搭建k8s集群(containerd)-20211102
    (all節點均要配置)使用 containerd 作為容器運行時搭建 Kubernetes 集群。現在我們使用 kubeadm 從頭搭建一個使用 containerd 作為容器運行時的 Kubernetes 集群,這裡我們安裝最新的 v1.22.2 版本。
  • 微服務的靈魂擺渡者Nacos究竟有多強?
    圖片真是夠了,又來扯皮高可用了,真是頭大Nacos推薦集群模式部署,這樣可以避免單點故障,那麼如何搭建集群呢?請求進來先共同Nginx集群進行轉發到Nacos集群中,當然為了保持高可用,資料庫必須也是集群模式。Nacos官方推薦Linux下搭建集群模式,因此陳某嘗試在Linux環境下搭建。Nginx和Mysql這裡集群就不再演示如何搭建了,不是今天的重點,主要演示下Nacos集群的搭建方法。
  • 高可用安裝K8s集群1.20.x
    高可用組件安裝7. 集群初始化8. 高可用Master9. 添加Node節點10. Calico安裝11. Metrics Server部署12. Dashboard部署1.本次安裝採用的是Kubeadm安裝工具,安裝版本是K8s 1.20+,採用的系統為CentOS 7.9,其中Master節點3臺,Node節點2臺,高可用工具採用HAProxy + KeepAlived,高可用架構視頻講解點我前沿技術,快人一步,點我了解~2.
  • 微服務註冊中心Nacos入門
    Nacos集群部署本例搭建是偽集群,在一臺虛擬機上起3個nacos服務,使用nginx做負載均衡。3306/nacos?> listen 8848; #客戶端訪問地址 location / { proxy_pass http://nacos; } }}輸入http://192.168.1.5:8848 登錄nacos,用戶名nacos,密碼nacos。
  • 使用kubeadm創建K8S單控制節點集群
    /virt-infra.yml \ --limit kvmhost,k8s-masters,k8s-nodes一鍵在 master、nodes 節點上安裝 dockeransible-playbook .
  • 邊緣計算k8s集群之SuperEdge
    邊緣計算在具有低時延、高帶寬、高可靠、海量連接、 異構匯聚和本地安全隱私保護等特點的應用場景,如智能交通、智慧城市、智慧工廠和智能家居等行業或領域,存在非常突出的優勢。比如在自動駕駛領域,邊緣計算是實現自動駕駛的關鍵。智能汽車本質上可以看作是一臺車輪上的大型高功率計算機,其通過多個傳感器收集數據。
  • Rancher2.5.7安裝及k8s集群部署
    >詳情可參考: https://www.runoob.com/docker/centos-docker-install.html[root@K8S-master01 ~]# docker -vDocker version 18.09.9, build 039a7df9ba安裝Rancher詳情可參考:rancher
  • 基於k8s手動部署rabbitmq集群
    目錄1、RabbitMQ介紹2、RabbitMQ的持久化和鏡像隊列3、RabbitMQ集群在k8s中的部署3.1 環境介紹3.2 創建configmap3.3 創建service3.4 創建rbac授權3.5 創建statefulset