国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

阿里云k8s容器部署consul集群的高可用方案

這篇具有很好參考價值的文章主要介紹了阿里云k8s容器部署consul集群的高可用方案。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

一、背景

原本consul集群是由三個server節(jié)點搭建的,購買的是三個ecs服務(wù)器,
consul高可用方案,阿里云,kubernetes,consul,java,spring,spring boot
consul高可用方案,阿里云,kubernetes,consul,java,spring,spring boot
java服務(wù)在注冊到consul的時候,隨便選擇其中一個節(jié)點。
從上圖可以看出, consul-01有28個服務(wù)注冊,而consul-02有94個服務(wù),consul-03則是29個。

有一次發(fā)生consul集群故障,某個conusl節(jié)點掛了,導(dǎo)致整個的服務(wù)發(fā)現(xiàn)都不通。

所以,我們需要進一步提高consul的高可用。

二、consul集群的高可用方案

consul高可用方案,阿里云,kubernetes,consul,java,spring,spring boot
consul server有三個節(jié)點,保持不變,仍舊部署在ecs。

在k8s各個節(jié)點都部署一個consul agent,同一個節(jié)點上的pod服務(wù)依賴于當(dāng)前節(jié)點的consul agent。

我這里的k8s容器共有11個節(jié)點,所以會再部署11個consul agent。
consul高可用方案,阿里云,kubernetes,consul,java,spring,spring boot

三、部署總結(jié)

1、ConfigMap掛載配置文件consul.json

consul高可用方案,阿里云,kubernetes,consul,java,spring,spring boot

apiVersion: v1
kind: ConfigMap
metadata:
  name: consul-client
  namespace: consul
data:
  consul.json: |-
    {
      "datacenter": "aly-consul",
      "addresses" : {
        "http": "0.0.0.0",
        "dns": "0.0.0.0"
      },
      "bind_addr": "{{ GetInterfaceIP \"eth0\" }}",  
      "client_addr": "0.0.0.0",
      "data_dir": "/consul/data",
      "rejoin_after_leave": true,
      "retry_join": ["10.16.190.29", "10.16.190.28", "10.16.190.30"],
      "verify_incoming": false,
      "verify_outgoing": false,
      "disable_remote_exec": false,
      "encrypt":"Qy3w6MjoXVOMvOMSkuj43+buObaHLS8p4JONwvH0RUg=",
      "encrypt_verify_incoming": true,
      "encrypt_verify_outgoing": true,
      "acl": {
        "enabled": true,
        "default_policy": "deny",
        "down_policy": "extend-cache",
        "tokens" :{ "agent": "xxxx-xx-xx-xx-xxxx" }
     }
    }


這里有幾個地方需要額外注意:

  • datacenter和consul server所在的dc保持一致
  • bind_addr 采用讀取的方式,不能寫死
  • acl 填寫consul集群的訪問token

2、DaemonSet守護進程集

這里采用守護進程來實現(xiàn),在各個節(jié)點只部署一個consul agent。DaemonSet的典型使用場景:除本案例外,還適用于日志和監(jiān)控等等。你只需要在每個節(jié)點僅部署一個filebeat和node-exporter,大大節(jié)約了資源。

consul高可用方案,阿里云,kubernetes,consul,java,spring,spring boot
可以看到容器組共11個。

apiVersion: apps/v1
kind: DaemonSet
metadata:
  name: consul-client
  namespace: consul
  labels:
    app: consul
    environment: prod
    component: client
spec:
  minReadySeconds: 60
  revisionHistoryLimit: 10
  selector:
    matchLabels:
      app: consul
      environment: prod
      commponent: client
  updateStrategy:
    rollingUpdate:
      maxUnavailable: 1
    type: RollingUpdate
  template:
    metadata:
      namespace: consul
      labels:
        app: consul
        environment: prod
        commponent: client
    spec:
      containers:
      - env:
        - name: POD_NAMESPACE
          valueFrom:
            fieldRef:
              apiVersion: v1
              fieldPath: metadata.namespace
        - name: HOST_IP
          valueFrom:
            fieldRef:
              apiVersion: v1
              fieldPath: status.hostIP
        - name: POD_IP
          valueFrom:
            fieldRef:
              apiVersion: v1
              fieldPath: status.podIP
        name: consul-client
        image: consul:1.6.2
        imagePullPolicy: IfNotPresent
        command:
        - "consul"
        - "agent"
        - "-config-dir=/consul/config"
        lifecycle:
          postStart:
            exec:
              command:
              - /bin/sh
              - -c
              - |
                # 最大嘗試次數(shù)
                max_attempts=30
                # 每次嘗試之間的等待時間(秒)
                wait_seconds=2

                attempt=1
                while [ $attempt -le $max_attempts ]; do
                  echo "Checking if Consul is ready (attempt: $attempt)..."
                  
                  # 使用curl檢查Consul的健康狀態(tài)
                  if curl -s http://127.0.0.1:8500/v1/agent/self > /dev/null; then
                    echo "Consul is ready."
                    
                    # 執(zhí)行reload操作
                    consul reload
                    exit 0
                  else
                    echo "Consul is not ready yet."
                  fi
                  
                  # 等待指定的時間后再次嘗試
                  sleep $wait_seconds
                  attempt=$((attempt + 1))
                done

                echo "Consul did not become ready in time."
                exit 1
          preStop:
            exec:
              command:
              - /bin/sh
              - -c
              - consul leave
        ports:
        - name: http-api
          hostPort: 8500
          containerPort: 8500
          protocol: TCP
        - name: dns-tcp
          hostPort: 8600
          containerPort: 8600
          protocol: TCP
        - name: dns-udp
          hostPort: 8600
          containerPort: 8600
          protocol: UDP
        - name: server-rpc
          hostPort: 8300
          containerPort: 8300
          protocol: TCP
        - name: serf-lan-tcp
          hostPort: 8301
          containerPort: 8301
          protocol: TCP
        - name: serf-lan-udp
          hostPort: 8301
          containerPort: 8301
          protocol: UDP
        - name: serf-wan-tcp
          hostPort: 8302
          containerPort: 8302
          protocol: TCP
        - name: serf-wan-udp
          hostPort: 8302
          containerPort: 8302
          protocol: UDP
        volumeMounts:
        - name: consul-config
          mountPath: /consul/config/consul.json
          subPath: consul.json
        - name: consul-data-dir
          mountPath: /consul/data
        - name: localtime
          mountPath: /etc/localtime
        livenessProbe:
          tcpSocket:
            port: 8500
          initialDelaySeconds: 30
          periodSeconds: 10
          successThreshold: 1
          failureThreshold: 3
          timeoutSeconds: 1
        readinessProbe:
          httpGet:
           path: /v1/status/leader
           port: 8500
          initialDelaySeconds: 60
          periodSeconds: 10
          successThreshold: 1
          failureThreshold: 3
          timeoutSeconds: 1
        resources:
          requests:
            memory: "256Mi"
            cpu: "200m"
          limits:
            memory: "1024Mi"
            cpu: "1000m"
        terminationMessagePath: /dev/termination-log
        terminationMessagePolicy: File
      hostNetwork: true
      dnsPolicy: ClusterFirst
      restartPolicy: Always
      schedulerName: default-scheduler
      securityContext: {}
      terminationGracePeriodSeconds: 30
      volumes:
      - name: consul-config
        configMap:
          name: consul-client
          items:
          - key: consul.json
            path: consul.json
      - name: consul-data-dir
        hostPath:
          path: /data/consul/data
          type: DirectoryOrCreate
      - name: localtime
        hostPath:
          path: /etc/localtime
          type: File

四、踩過的坑

1、報錯 ==> Multiple private IPv4 addresses found. Please configure one with ‘bind’ and/or ‘a(chǎn)dvertise’.

解決辦法:

修改consul.json中的"bind_addr": “{{ GetInterfaceIP “eth0” }}”

2、lifecycle,在pod創(chuàng)建成功后,執(zhí)行consul reload失敗,導(dǎo)致consul pod節(jié)點反復(fù)重啟。

進一步描述錯誤現(xiàn)象,consul agent加入到consul集群,但是一會兒容器又掛了,導(dǎo)致又退出consul集群。

我嘗試去掉健康檢測,沒能解決,容器還是會掛。

所以不是健康檢測的問題。

        lifecycle:
          postStart:
            exec:
              command:
              - /bin/sh
              - -c
              - consul reload
          preStop:
            exec:
              command:
              - /bin/sh
              - -c
              - consul leave

后面修改為重試consul reload。

                # 最大嘗試次數(shù)
                max_attempts=30
                # 每次嘗試之間的等待時間(秒)
                wait_seconds=2

                attempt=1
                while [ $attempt -le $max_attempts ]; do
                  echo "Checking if Consul is ready (attempt: $attempt)..."
                  
                  # 使用curl檢查Consul的健康狀態(tài)
                  if curl -s http://127.0.0.1:8500/v1/agent/self > /dev/null; then
                    echo "Consul is ready."
                    
                    # 執(zhí)行reload操作
                    consul reload
                    exit 0
                  else
                    echo "Consul is not ready yet."
                  fi
                  
                  # 等待指定的時間后再次嘗試
                  sleep $wait_seconds
                  attempt=$((attempt + 1))
                done

                echo "Consul did not become ready in time."
                exit 1

3、忽略錯誤 [ERR] agent: failed to sync remote state: No known Consul servers,這個屬于正?,F(xiàn)象。

不要被這個錯誤日志給誤導(dǎo)了,你只要保證后文有類似日志。

2024/02/21 11:09:42 [INFO] consul: adding server aly-consul-02 (Addr: tcp/10.16.190.29:8300) (DC: aly-consul)

4、別忘記了配置acl,否則consul agent是無法加入到consul server集群的。

"acl": {
    "enabled": true,
    "default_policy": "deny",
    "down_policy": "extend-cache",
    "tokens" : {
        "agent": "xxxx-xx-xx-xx-xxxx"
    }
 }

五、服務(wù)接入示例

在deployment.yaml中增加環(huán)境變量。

    containers:
        - env:
            - name: HOST_IP
              valueFrom:
                fieldRef:
                  apiVersion: v1
                  fieldPath: status.hostIP
            - name: POD_IP
              valueFrom:
                fieldRef:
                  apiVersion: v1
                  fieldPath: status.podIP
            - name: CONFIG_SERVICE_ENABLED
              value: 'true'
            - name: CONFIG_SERVICE_PORT
              value: 8500
            - name: CONFIG_SERVICE_HOST
              value: $(HOST_IP)

spring boot工程的bootstrap.yml配置見下

spring:
  application:
    name: xxx-service
  cloud:
    consul:
      enabled: ${CONFIG_SERVICE_ENABLED}
      host: ${CONFIG_SERVICE_HOST}
      port: ${CONFIG_SERVICE_PORT}
      discovery:
        prefer-ip-address: true
        enabled: ${CONFIG_SERVICE_ENABLED}
      config:
        format: yaml
        enabled: ${CONFIG_SERVICE_ENABLED}

六、總結(jié)

本文是以java服務(wù)注冊到consul為示例,給你講述了從部署到接入的全過程。

consul地址,這里填寫的是ip地址,而非域名。
也就是說,與服務(wù)在同一個節(jié)點上的consul如果掛了,也就導(dǎo)致服務(wù)啟動的時候,會注冊失敗。

有人會想,可不可以像nginx反向代理后端服務(wù)那樣,由k8s service或者nginx反向consul集群呢?

如下圖所示:
consul高可用方案,阿里云,kubernetes,consul,java,spring,spring boot
不建議你這樣去做,因為consul作為服務(wù)注冊中心,有一個基本要求是:
java服務(wù)是從哪個consul注冊的服務(wù)就要從那個consul注銷。

所以負(fù)載均衡對后端consul agent就會要求有狀態(tài),而非無狀態(tài)。

好了, consul的高可用部署就寫到這里。文章來源地址http://www.zghlxwxcb.cn/news/detail-851211.html

到了這里,關(guān)于阿里云k8s容器部署consul集群的高可用方案的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費用

相關(guān)文章

  • 基于kubeasz部署高可用k8s集群

    基于kubeasz部署高可用k8s集群

    在部署高可用k8s之前,我們先來說一說單master架構(gòu)和多master架構(gòu),以及多master架構(gòu)中各組件工作邏輯 k8s單master架構(gòu) 提示:這種單master節(jié)點的架構(gòu),通常只用于測試環(huán)境,生產(chǎn)環(huán)境絕對不允許;這是因為k8s集群master的節(jié)點是單點,一旦master節(jié)點宕機,將導(dǎo)致整個集群不可用;

    2023年04月23日
    瀏覽(38)
  • k8s集群部署 | 三節(jié)點(復(fù)用)高可用集群過程參考

    k8s集群部署 | 三節(jié)點(復(fù)用)高可用集群過程參考

    1.1.1 實驗架構(gòu)圖 1.1.2 系統(tǒng)版本說明 OS 版本:CentOS Linux release 7.9.2009 (Core) 初始內(nèi)核版本:3.10.0-1160.71.1.el7.x86_64 配置信息:2C2G 150G硬盤 文件系統(tǒng):xfs 網(wǎng)絡(luò):外網(wǎng)權(quán)限 k8s 版本:1.25.9 1.1.3 環(huán)境基本信息 K8s集群角色 IP地址 主機名 組件信息 控制節(jié)點1(工作節(jié)點1) 192.168.204.10 k8

    2024年02月04日
    瀏覽(30)
  • shell 腳本一鍵部署 k8s 高可用集群

    github地址:https://github.com/Johnny-Demo/deploy/tree/k8s-cluster README.md 要修改腳本里面的 ip 地址,根據(jù)自己情況修改,然后在部署,要不然會出錯。 執(zhí)行 kernel.sh 升級 linux 內(nèi)核,關(guān)閉 selinux 和 swap 分區(qū),重啟服務(wù)器。 執(zhí)行 run.sh 部署k8s,master 和 node 手動加入集群,無法自動獲取加入

    2024年02月07日
    瀏覽(21)
  • k8s集群中部署rancher v2.7高可用集群

    k8s集群中部署rancher v2.7高可用集群

    一,什么是 Rancher? ?官網(wǎng)地址: 什么是 Rancher? | Rancher Manager Rancher 是一個 Kubernetes 管理工具,讓你能在任何地方和任何提供商上部署和運行集群。 Rancher 可以創(chuàng)建來自 Kubernetes 托管服務(wù)提供商的集群,創(chuàng)建節(jié)點并安裝 Kubernetes,或者導(dǎo)入在任何地方運行的現(xiàn)有 Kubernetes 集群

    2024年02月07日
    瀏覽(24)
  • Kubeadm - K8S1.20 - 高可用集群部署(博客)

    1.系統(tǒng)設(shè)置 注意事項: master節(jié)點cpu核心數(shù)要求大于2 ●最新的版本不一定好,但相對于舊版本,核心功能穩(wěn)定,但新增功能、接口相對不穩(wěn) ●學(xué)會一個版本的 高可用部署,其他版本操作都差不多 ●宿主機盡量升級到CentOS 7.9 ●內(nèi)核kernel升級到 4.19+ 這種穩(wěn)定的內(nèi)核 ●部署k8

    2024年02月05日
    瀏覽(22)
  • kubeadm部署k8s 1.26.0版本高可用集群

    kubeadm部署k8s 1.26.0版本高可用集群

    1.前言 本次搭建使用centos7.9系統(tǒng),并且使用haproxy+keepalived作為高可用架構(gòu)軟件,haproxy實現(xiàn)k8s集群管理節(jié)點apiserver服務(wù)的負(fù)載均衡以實現(xiàn)集群的高可用功能,keepalived保障了hapxoy的高可用,容器引擎使用docker,需要額外引入cri-docker服務(wù),且使用集群內(nèi)置的etcd服務(wù),并配置etcd的

    2024年02月11日
    瀏覽(24)
  • Centos7 安裝部署 Kubernetes(k8s) 高可用集群

    Centos7 安裝部署 Kubernetes(k8s) 高可用集群

    宿主機系統(tǒng) 集群角色 服務(wù)器IP 主機名稱 容器 centos7.6 master 192.168.2.150 ks-m1 docker centos7.6 master 192.168.2.151 ks-n1 docker centos7.6 master 192.168.2.152 ks-n2 docker 1.1 服務(wù)器初始化及網(wǎng)絡(luò)配置 VMware安裝Centos7并初始化網(wǎng)絡(luò)使外部可以訪問** 注意事項:請一定要看完上面這篇文章再執(zhí)行下面的操

    2024年02月03日
    瀏覽(55)
  • k8s1.27.2版本二進制高可用集群部署

    k8s1.27.2版本二進制高可用集群部署

    說明:本次實驗共有5臺主機,3臺master節(jié)點同時又是worker,os128、os129、os130 節(jié)點主機容器運行時用的containerd,worker131、worker132主機的用的docker 主機名 IP 組件 系統(tǒng) os128 192.168.177.128 etcd、kube-apiserver、kube-controller-manager、kube-scheduler、kubelet、kube-proxy、containerd CentOS7.9 os129 192.16

    2024年01月22日
    瀏覽(72)
  • 【Flink系列】部署篇(三):Native k8s部署高可用Flink集群實戰(zhàn)

    上一篇博文介紹了如何獨立部署一個高可用的Flink集群,本篇介紹如何用Native k8s去部署高可用的Flink 集群。本篇介紹的集群構(gòu)建在AWS上,和構(gòu)建在自己的服務(wù)器相比,主要區(qū)別在文件系統(tǒng)的選擇和使用上。我選用的S3服務(wù)。 EC2操作系統(tǒng):centos7 本機操作系統(tǒng):Mac flink version: 1.

    2024年02月02日
    瀏覽(59)
  • K8s集群1.27最新版二進制高可用部署

    K8s集群1.27最新版二進制高可用部署

    二進制方式安裝Kubernetes高可用集群,雖然安裝過程較為復(fù)雜,但這也是每個技術(shù)人員必須要掌握的內(nèi)容。同時,在安裝過程中,也可以更加深刻地理解每個組件的工作原理。 一、系統(tǒng)環(huán)境配置 (1)主機名配置 (2)所有節(jié)點修改yum源 (3)所有節(jié)點安裝常用軟件 ? (4)將master01節(jié)點配

    2024年02月07日
    瀏覽(29)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包