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

一、背景

原本consul集群是由三个server节点搭建的,购买的是三个ecs服务器,
在这里插入图片描述
在这里插入图片描述
java服务在注册到consul的时候,随便选择其中一个节点。
从上图可以看出, consul-01有28个服务注册,而consul-02有94个服务,consul-03则是29个。

有一次发生consul集群故障,某个conusl节点挂了,导致整个的服务发现都不通。

所以,我们需要进一步提高consul的高可用。

二、consul集群的高可用方案

在这里插入图片描述
consul server有三个节点,保持不变,仍旧部署在ecs。

在k8s各个节点都部署一个consul agent,同一个节点上的pod服务依赖于当前节点的consul agent。

我这里的k8s容器共有11个节点,所以会再部署11个consul agent。
在这里插入图片描述

三、部署总结

1、ConfigMap挂载配置文件consul.json

在这里插入图片描述

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守护进程集

这里采用守护进程来实现,在各个节点只部署一个consul agent。DaemonSet的典型使用场景:除本案例外,还适用于日志和监控等等。你只需要在每个节点仅部署一个filebeat和node-exporter,大大节约了资源。

在这里插入图片描述
可以看到容器组共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
              - |
                # 最大尝试次数
                max_attempts=30
                # 每次尝试之间的等待时间(秒)
                wait_seconds=2

                attempt=1
                while [ $attempt -le $max_attempts ]; do
                  echo "Checking if Consul is ready (attempt: $attempt)..."
                  
                  # 使用curl检查Consul的健康状态
                  if curl -s http://127.0.0.1:8500/v1/agent/self > /dev/null; then
                    echo "Consul is ready."
                    
                    # 执行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 ‘advertise’.

解决办法:

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

2、lifecycle,在pod创建成功后,执行consul reload失败,导致consul pod节点反复重启。

进一步描述错误现象,consul agent加入到consul集群,但是一会儿容器又挂了,导致又退出consul集群。

我尝试去掉健康检测,没能解决,容器还是会挂。

所以不是健康检测的问题。

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

后面修改为重试consul reload。

                # 最大尝试次数
                max_attempts=30
                # 每次尝试之间的等待时间(秒)
                wait_seconds=2

                attempt=1
                while [ $attempt -le $max_attempts ]; do
                  echo "Checking if Consul is ready (attempt: $attempt)..."
                  
                  # 使用curl检查Consul的健康状态
                  if curl -s http://127.0.0.1:8500/v1/agent/self > /dev/null; then
                    echo "Consul is ready."
                    
                    # 执行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,这个属于正常现象。

不要被这个错误日志给误导了,你只要保证后文有类似日志。

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"
    }
 }

五、服务接入示例

在deployment.yaml中增加环境变量。

    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}

六、总结

好了, consul的高可用部署就写到这里。

本文是以java服务注册到consul为示例,给你讲述了从部署到接入的全过程。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/399957.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

一凸包----------12,分而治之(2)

在上节中,两部分子凸包有重合的部分,不简洁。这一节是沿着某个方向,子凸包不重叠,如下图 根据以前的方法,很可能认为是两个子凸包上顶点与上顶点相连,下顶点与下顶点相连,形成两条支撑线&#…

算法沉淀——二叉树中的深搜(leetcode真题剖析)

算法沉淀——二叉树中的深搜 01.计算布尔二叉树的值02.求根节点到叶节点数字之和03.二叉树剪枝04.验证二叉搜索树05.二叉搜索树中第K小的元素06.二叉树的所有路径 二叉树的深度优先搜索是一种遍历二叉树的方法,它通过深度递归的方式探索树的结构。有两种主要形式&am…

ubuntu 22.04 图文安装

ubuntu 22.04.3 live server图文安装 一、在Vmware里安装ubuntu 22.04.3 live server操作系统 选择第一个选项开始安装 选择English语言 选择中间选项不更新安装,这是因为后续通过更换源之后再更新会比较快 键盘设计继续选择英文,可以通过语言选择…

【微服务生态】Dubbo

文章目录 一、概述二、Dubbo环境搭建-docker版三、Dubbo配置四、高可用4.1 zookeeper宕机与dubbo直连4.2 负载均衡 五、服务限流、服务降级、服务容错六、Dubbo 对比 OpenFeign 一、概述 Dubbo 是一款高性能、轻量级的开源Java RPC框架,它提供了三大核心能力&#…

zabbix5.0利用percona监控MySQL

具体来说包括: Percona Monitoring Plugins 这是一组用于收集MySQL实例各种性能指标和状态的插件脚本,包括: mysqld_stats.pl - 收集服务器状态计数器mysqld_statement_replay.pl - 进行负载模拟测试pt-status - 收集InnoDB资源使用情况等 Percona Templates 基于这些插件收集…

陪诊小程序|陪诊系统解决就医繁忙问题

陪诊现在是个新兴行业,具有比较大的市场前景,陪诊小程序更是行业蓝海,不仅为用户解决了无人陪同看病、医院科室流程繁杂的问题,更为陪诊师提供了线上直接获客的渠道,可谓发展前景不可估量。陪诊服务提供者及需求者来说…

C++之Easyx——图形库的基本功能(2):来点色彩

一、setbkcolor 函数定义 void EGEAPI setbkcolor(color_t color, PIMAGE pimg NULL); // 设置当前绘图背景色(设置并做背景色像素替换) 使用说明 void EGEAPI setbkcolor(颜色RGB, PIMAGE pimg NULL); // 设置当前绘图背景色(…

关于在Windows上socket组播通信的一些问题

一、Windows上的组播通信 基本和linux上的socket编程一致,稍微有点区别 以下是我测验可以使用的代码, 客户端 // 广播处理回复消息回调 typedef void(*handMulticastRsp)(char* rspstr, int len); // 发送组播消息 // buff 发送内容 // len 发送内容…

Linux操作系统应用软件编程

今天是学习嵌入式相关内容的第二十四天 b -- block -- 块设备文件 --- 硬盘(存储设备) c -- character -- 字符设备文件 --- 鼠标 (输入输出设备) d -- directory -- 目录文件 - -- regular -- 普通文件 ---…

十、计算机视觉-腐蚀操作

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 一、什么是腐蚀二、如何实现腐蚀三、腐蚀的原理 一、什么是腐蚀 在我们生活中常会见到腐蚀,比如金属表面受到氧化或其他化学物质的侵蚀,导致…

【办公类-16-07-04】合并版“2023下学期 中班户外游戏(有场地和无场地版,一周一次)”(python 排班表系列)

背景需求: 把 无场地版(贴周计划用) 和 有场地版(贴教室墙壁上用) 组合在一起,一个代码生成两套。 【办公类-16-07-02】“2023下学期 周计划-户外游戏 每班1周五天相同场地,6周一次循环”&…

基于RHEL8部署Zabbix6.0,监控不再困难!

📢📢📢📣📣📣 哈喽!大家好,我是【IT邦德】,江湖人称jeames007,10余年DBA及大数据工作经验 一位上进心十足的【大数据领域博主】!😜&am…

Linux是什么

文章目录 Linux是什么Linux之前Unix发展史MulticsUnicsUnixUNIX分支--BSDUNIX分支--System VMinixGUN计划GPLXFree86Linux 开源软件和闭源软件开源软件闭源软件/专利软件(copyright) Linux的内核版本Linux发行版 Linux是什么 Linux到底是操作系统还是应用程序呢?Li…

利用nbsp设置空格

想要实现上面效果&#xff0c;一开始直接<el-col :span"8" >{{ item.name }} </el-col> 或者<el-col :span"8" >{{ item.name }}</el-col>或者<el-col :span"8" >{{ item.name }}</el-col> 都无…

基于RBAC的权限管理的理论实现和权限管理的实现

权限管理的理论 首先需要两个页面支持&#xff0c;分别是角色管理和员工管理&#xff0c;其中角色管理对应的是角色和权限的配合&#xff0c;员工管理则是将登录的员工账号和员工所处的角色进行对应&#xff0c;即通过新增角色这个概念&#xff0c;让权限和员工并不直接关联&a…

【前端】前端三要素之DOM

写在前面&#xff1a;本文仅包含DOM内容&#xff0c;JavaScript传送门在这里&#xff0c;BOM传送门在这里。 本文内容是假期中刷的黑马Pink老师视频&#xff08;十分感谢Pink老师&#xff09;&#xff0c;原文保存在个人的GitLab中&#xff0c;如果需要写的网页内容信息等可以评…

ArcGIS中查看栅格影像最大值最小值的位置

如果只是想大概获取栅格影像中最大值最小值的位置进行查看&#xff0c;可以不用编写程序获取具体的行列信息&#xff0c;只需要利用分类工具即可。 假设有一幅灰度影像数据&#xff0c;如下图所示。 想要查看最大值2116的大概位置在哪里&#xff0c;可以右击选择图层属性&…

缩小ppt文件大小的办法

之前用别人模版做了个PPT&#xff0c;100多M,文件存在卡顿问题 解决办法&#xff1a; 1.找到ppt中哪个文件过大&#xff0c;针对解决 2.寻找视频/音频文件&#xff0c;减少体积 3.字体文件是不是过多的问题。 一、文件寻找的内容步骤&#xff1a; 步骤&#xff1a; 1.把p…

linux系统内核升级

1.查看旧版本内核 2.导入密钥 rpm --import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org 3.安装yum源 rpm -Uvh http://www.elrepo.org/elrepo-release-7.0-2.el7.elrepo.noarch.rpm4.启用elrepo-kernel仓库并安装最新内核版本 yum --enablerepoelrepo-kernel install …

据库异常sql耗尽CPU资源

问题描述 核心系统出现数据库卡顿&#xff0c;严重影响前端业务响应&#xff0c;节点一数据库服务器CPU几乎耗尽&#xff0c;多次重启数据库依然没有效果&#xff0c;仔细诊断初步判定业务SQL执行效率不佳所致&#xff0c;特别是SQL_ID为1hwgwzgw0vfrc的SQL&#xff0c;半小时…