天天看點

配置中心預研

配置中心預研

概述

随着程式功能的日益複雜,程式的配置日益增多:各種功能的開關、參數的配置、伺服器的位址……

對程式配置的期望值也越來越高:配置修改後實時生效,分環境、分叢集管理配置,代碼安全、稽核機制……

在這樣的大環境下,傳統的通過配置檔案、資料庫等方式已經越來越無法滿足開發人員對配置管理的需求。

是以,配置中心應運而生。

選型思路

1、詢問幾個道友(多詢問幾個不同的群的道友,防止人雲亦雲)

2、百度大範圍搜大緻的看 選中幾個使用廣、文檔多的

3、github對比issues、pull requests、insights、commits、branches、tags

4、語言對比、性能對比(通過CNCF對比)

詢問道友

大緻得出的可選元件為:apollo nacos eureka zk consul

配置中心預研

百度大範圍搜尋

名詞解釋

CAP理論:CAP理論是分布式架構中重要理論

    • 一緻性(Consistency) (所有節點在同一時間具有相同的資料)
    • 可用性(Availability) (保證每個請求不管成功或者失敗都有響應)
    • 分隔容忍(Partition tolerance) (系統中任意資訊的丢失或失敗不會影響系統的繼續運作)

CAP 不可能都取,隻能取其中2個

原因是

如果C是第一需求的話,那麼會影響A的性能,因為要資料同步,不然請求結果會有差異,但是資料同步會消耗時間,期間可用性就會降低。

如果A是第一需求,那麼隻要有一個服務在,就能正常接受請求,但是對與傳回結果變不能保證,原因是,在分布式部署的時候,資料一緻的過程不可能想切線路那麼快。

再如果,同時滿足一緻性和可用性,那麼分區容錯就很難保證了,也就是單點,也是分布式的基本核心,好了,明白這些理論,就可以在相應的場景選取服務注冊與發現了。

服務注冊中心解決方案

設計或者選型一個服務注冊中心,首先要考慮的就是服務注冊與發現機制。縱觀當下各種主流的服務注冊中心解決方案,大緻可歸為三類:

應用内:直接內建到應用中,依賴于應用自身完成服務的注冊與發現

應用外:把應用當成黑盒,通過應用外的某種機制将服務注冊到注冊中心,最小化對應用的侵入性

DNS:将服務注冊為DNS的SRV記錄,嚴格來說,是一種特殊的應用外注冊方式

Dubbo

https://baike.baidu.com/item/Dubbo/18907815?fr=aladdin

gitlab對比

nacos

配置中心預研

apollo

配置中心預研

consul

配置中心預研

總結

對比項目 Nacos Apollo Eureka Zookeeper Consul
一緻性 CP+AP AP CP
github活躍度 活躍 不活躍 快涼
健康檢查 TCP/HTTP/MYSQL/Client Beat HTTP Client Beat Keep Alive TCP/HTTP/gRPC/Cmd
負載均衡政策 權重/metadata/Selector Ribbon - Fabio
雪崩保護
自動登出執行個體 支援 不支援
通路協定 HTTP/DNS TCP
監聽支援
多資料中心
跨注冊中心同步
Dubbo內建
k8s內建 較困難
語言 JAVA GO
圖形界面 間接直覺 細節繁瑣 僅供展示

通過表格化對比,綜合各方面考慮,推薦的配置中心為:Nacos,理由:1、支援k8s內建 2、操作簡單 3、符合公司需求要求、4、功能支援多

部署

公司内網伺服器做部署測試機

按照省錢省事原則,選擇在單節點上部署mysql pod、nacos pod

按照約定每個應用在我司k8s環境中單屬于一個名稱空間

配置名稱空間

# cat nacos.yaml 
apiVersion: v1
kind: Namespace
metadata:
  name: nacos
           

配置mysql服務

# cat mysql_deployment.yaml 
apiVersion: apps/v1
kind: Deployment
metadata:
  name: mysql
  namespace: nacos
  labels:
    name: mysql
spec:
  replicas: 1
  selector:
    matchLabels:
      name: mysql
  template:
    metadata:
      labels:
        name: mysql
    spec:
      containers:
        - name: mysql
          image: nacos/nacos-mysql:5.7
          ports:
            - containerPort: 3306
          volumeMounts:
            - name: mysql-data
              mountPath: /var/lib/mysql
          env:
            - name: MYSQL_ROOT_PASSWORD
              value: "root"
            - name: MYSQL_DATABASE
              value: "nacos"
            - name: MYSQL_USER
              value: "nacos"
            - name: MYSQL_PASSWORD
              value: "nacos"
      volumes:
        - name: mysql-data
          hostPath:
            path: /data/nacos
           

建立mysql svc 提供nacos 連接配接

# cat mysql_svc.yaml 
apiVersion: v1
kind: Service
metadata:
  name: mysql
  namespace: nacos
  labels:
    name: mysql
spec:
  ports:
    - port: 3306
      targetPort: 3306
  selector:
    name: mysql
           

配置nacos服務

# cat nacos_statefulset.yaml 
apiVersion: v1
kind: ConfigMap
metadata:
  name: nacos-cm
  namespace: nacos
data:
  mysql.db.host: "mysql.nacos.svc.cluster.local" # 添加 mysql pod 通路位址
  mysql.db.name: "nacos"
  mysql.port: "3306"
  mysql.user: "nacos"
  mysql.password: "nacos"
---
apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: nacos
  namespace: nacos
spec:
  selector:
    matchLabels:
      app: nacos
  serviceName: nacos
  replicas: 1
  template:
    metadata:
      labels:
        app: nacos
      annotations:
        pod.alpha.kubernetes.io/initialized: "true"
    spec:
      containers:
        - name: nacos
          imagePullPolicy: Always
          image: nacos/nacos-server:latest
          resources:
            requests:
              memory: "2Gi"
              cpu: "500m"
          ports:
            - containerPort: 8848
              name: client
          env:
            - name: NACOS_REPLICAS
              value: "1"
            - name: MYSQL_SERVICE_DB_NAME
              valueFrom:
                configMapKeyRef:
                  name: nacos-cm
                  key: mysql.db.name
            - name: MYSQL_SERVICE_HOST # 添加 mysql 通路位址的環境變量
              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: PREFER_HOST_MODE
              value: "hostname"
            - name: NACOS_SERVERS
              value: "nacos-0.nacos.nacos.svc.cluster.local:8848"
           

建立nacos svc 代理pod

# cat nacos_svc.yaml 
apiVersion: v1
kind: Service
metadata:
  name: nacos
  namespace: nacos
  labels:
    app: nacos
  annotations:
    service.alpha.kubernetes.io/tolerate-unready-endpoints: "true"
spec:
  ports:
    - port: 8848
      name: server
      targetPort: 8848
  clusterIP: None
  selector:
    app: nacos
           

建立Ingress暴露服務,供内部通路

# cat nacos_ingress.yaml 
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: nacos
  namespace: nacos
spec:
  rules:
    - host: nacos.linux.com
      http:
        paths:
          - backend:
              serviceName: nacos
              servicePort: 8848
           

檢視nacos 配置中心有關應用狀态

# kubectl get pods,svc,ingress -n nacos
NAME                         READY   STATUS    RESTARTS   AGE
pod/mysql-5bbd5954cc-g4k9k   1/1     Running   0          70m
pod/nacos-0                  1/1     Running   0          29m

NAME            TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)    AGE
service/mysql   ClusterIP   10.43.105.239   <none>        3306/TCP   54m
service/nacos   ClusterIP   None            <none>        8848/TCP   38m

NAME                       HOSTS             ADDRESS      PORTS   AGE
ingress.extensions/nacos   nacos.linux.com   10.17.1.44   80      37m
           

似乎是沒得問題

本地hosts解析

配置中心預研

通路

nacos.linux.com

配置中心預研

emmmmmm 404 路徑錯誤, 怎麼搞

檢視日志

# kubectl logs -f nacos-0 -n nacos
......
Console: http://nacos-0.nacos.nacos.svc.cluster.local:8848/nacos/index.html
......
           

有了

通路:nacos.linux.com/nacos

配置中心預研

然後就...... 随便點點看看熟悉熟悉吧

過手如登山,一步一重天