k8s中安装consul集群

news2024/11/26 18:48:00

一、准备知识

headless services一般结合StatefulSet来部署有状态的应用,比如kafka集群,mysql集群,zk集群等,也包括本文要部署的consul集群。

0、consul集群

consul集群的分布式协议算法采用的是raft协议,这意味着必然有leader、follow节点,每个节点对应的状态不一样,涉及到选举过程,各个参与选举或者加入集群的节点地址需要固定或通过类似dns、vip的方式访问到。

这就要求我们部署有状态服务,而不能使用无状态服务。另外需要创建Headless Service。

1、有状态服务

StatefulSet下的Pod有DNS地址,通过解析Pod的DNS可以返回Pod的IP。

在这里插入图片描述

StatefulSet会为关联的Pod保持一个不变的Pod Name,格式是{StatefulSet name}-{pod序号}
在这里插入图片描述
StatefulSet会为关联的Pod分配一个dnsName。
域名格式是:{pod-name}.{svc}.{namespace}.svc.cluster.local。

2、Headless Services

Headless Services是一种特殊的service,其spec:clusterIP表示为None,这样在实际运行时就不会被分配ClusterIP。也被称为无头服务。

第一种是vip的方式,即虚拟IP,通过虚拟ip的方式绑定到该service代理的某一个pod上。
这种是我们一般实现service的通常方式。

第二种方式是DNS的方式,对于k8s的服务注册与发现机制,不同应用pod之间互访可以通过{svc}.{namespace}.svc.cluster.local进行访问。这个访问类似VIP的方式,后面绑定的是一堆pod地址。
通过负载均衡机制进行访问。如果需要访问到特定的pod,就需要headless机制,此时可以通过 {pod-name}.{svc}.{namespace}.svc.cluster.local的定位到该pod。

比如本文consul的三个pod节点地址见下表,namespace=“default”

pod-nameserviceName访问地址
consul-0consulconsul-0.consul.default.svc.cluster.local
consul-1consulconsul-1.consul.default.svc.cluster.local
consul-2consulconsul-2.consul.default.svc.cluster.local

3、数据持久化

对consul节点的数据、配置和日志等进行持久化。

  • 搭建NFS
    略。

本文使用的NFS搭建在192.168.80.170上,目录是/srv/nfs/disk

  • 创建PVC
    创建一个名称为defalut-resources的pvc
    在这里插入图片描述
kind: PersistentVolumeClaim
apiVersion: v1
metadata:
  name: defalut-resources
  namespace: default
spec:
  accessModes:
    - ReadWriteMany
  resources:
    requests:
      storage: 10Gi
  storageClassName: managed-nfs-storage
  volumeMode: Filesystem
  • 自动创建PV
    上面的创建pvc会自动创建pv,名称为pvc-e5c5a6c9-d083-407a-86d7-25bf26e62ad4,它是一个随机值且唯一。
    在这里插入图片描述
    查看其yaml:
kind: PersistentVolume
apiVersion: v1
metadata:
  name: pvc-e5c5a6c9-d083-407a-86d7-25bf26e62ad4
spec:
  capacity:
    storage: 10Gi
  nfs:
    server: 192.168.80.170
    path: >-
      /srv/nfs/disk/default-defalut-resources-pvc-e5c5a6c9-d083-407a-86d7-25bf26e62ad4
  accessModes:
    - ReadWriteMany
  persistentVolumeReclaimPolicy: Delete
  storageClassName: managed-nfs-storage
  volumeMode: Filesystem
status:
  phase: Bound

验证:

在根目录下,会创建一个目录“default-defalut-resources-pvc-e5c5a6c9-d083-407a-86d7-25bf26e62ad4”。
在这里插入图片描述

4、反亲和性podAntiAffinity

pod会基于topologyKey进行反亲和,如下述配置表示,标签k8s-app为consul的pod不会被调度到同一个node节点。

	affinity:
        podAntiAffinity:
          requiredDuringSchedulingIgnoredDuringExecution:
            - labelSelector:
                matchExpressions:
                  - key: k8s-app
                    operator: In
                    values:
                      - consul
              topologyKey: kubernetes.io/hostname

这个很有必要,也适用于其他有状态的服务部署。

二、目标

搭建三个server节点的consul集群,对内供Pod上的服务注册,对外提供UI管理。

三、搭建consul集群

1、完整的创建有状态服务yaml

apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: consul
  namespace: default
spec:
  serviceName: consul
  replicas: 3
  selector:
    matchLabels:
      k8s-app: consul
  template: 
    metadata:
      labels:
        k8s-app: consul
    spec:
      affinity:
        podAntiAffinity:
          requiredDuringSchedulingIgnoredDuringExecution:
            - labelSelector:
                matchExpressions:
                  - key: k8s-app
                    operator: In
                    values:
                      - consul
              topologyKey: kubernetes.io/hostname
      terminationGracePeriodSeconds: 10
      containers:
      - name: consul
        image: consul:latest
        imagePullPolicy: IfNotPresent
        args:
             - "agent"
             - "-server"
             - "-bootstrap-expect=3"
             - "-ui"
             - "-config-file=/consul/config"
             - "-data-dir=/consul/data"
             - "-log-file=/consul/log"
             - "-bind=0.0.0.0"
             - "-client=0.0.0.0"
             - "-advertise=$(PODIP)"
             - "-retry-join=consul-0.consul.$(NAMESPACE).svc.cluster.local"
             - "-retry-join=consul-1.consul.$(NAMESPACE).svc.cluster.local"
             - "-retry-join=consul-2.consul.$(NAMESPACE).svc.cluster.local"
             - "-domain=cluster.local"
             - "-disable-host-node-id"
        volumeMounts:
            - name: nfs
              mountPath: /consul/data
              subPathExpr: data/$(PODNAME)
            - name: nfs
              mountPath: /consul/config
              subPathExpr: config/$(PODNAME)
        env:
            - name: PODIP
              valueFrom:
                fieldRef:
                  fieldPath: status.podIP
            - name: NAMESPACE
              valueFrom:
                fieldRef:
                  fieldPath: metadata.namespace
            - name: PODNAME
              valueFrom:
                fieldRef:
                  fieldPath: metadata.name
        resources:
          limits:
            cpu: "2G"
            memory: "2Gi"
          requests:
            cpu: "200m"
            memory: "1Gi"
        lifecycle:
          preStart:
            exec:
              command:
              - /bin/sh
              - -c
              - consul reload
          preStop:
            exec:
              command:
              - /bin/sh
              - -c
              - consul leave
        ports:
            - containerPort: 8500
              name: ui-port
            - containerPort: 8400
              name: alt-port
            - containerPort: 53
              name: udp-port
            - containerPort: 8443
              name: https-port
            - containerPort: 8080
              name: http-port
            - containerPort: 8301
              name: serflan
            - containerPort: 8302
              name: serfwan
            - containerPort: 8600
              name: consuldns
            - containerPort: 8300
              name: server
      volumes:
        - name: nfs
          persistentVolumeClaim:
            claimName: defalut-resources

2、创建services

kind: Service
apiVersion: v1
metadata:
  name: consul
  namespace: default
  labels:
    app: consul
spec:
  ports:
    - name: http
      protocol: TCP
      port: 8500
      targetPort: 8500
    - name: https
      protocol: TCP
      port: 8443
      targetPort: 8443
    - name: rpc
      protocol: TCP
      port: 8400
      targetPort: 8400
    - name: serflan-tcp
      protocol: TCP
      port: 8301
      targetPort: 8301
    - name: serflan-udp
      protocol: UDP
      port: 8301
      targetPort: 8301
    - name: serfwan-tcp
      protocol: TCP
      port: 8302
      targetPort: 8302
    - name: serfwan-udp
      protocol: UDP
      port: 8302
      targetPort: 8302
    - name: server
      protocol: TCP
      port: 8300
      targetPort: 8300
    - name: consuldns
      protocol: TCP
      port: 8600
      targetPort: 8600
  selector:
    k8s-app: consul
  clusterIP: None

---
apiVersion: v1
kind: Service
metadata:
  name: consul-dns
  namespace: default
  labels:
    app: consul
spec:
  selector:
    k8s-app: consul
  ports:
    - name: dns-tcp
      protocol: TCP
      port: 53
      targetPort: dns-tcp
    - name: dns-udp
      protocol: UDP
      port: 53
      targetPort: dns-udp

---
apiVersion: v1
kind: Service
metadata:
  name: consul-ui
  namespace: default
  labels:
    app: consul
spec:
  selector:
    k8s-app: consul
  ports:
    - name: http
      port: 80
      targetPort: 8500

3、创建一个nodeport类型的service

这样,我们可以通过ip地址+端口的方式直接访问consul ui。

kind: Service
apiVersion: v1
metadata:
  name: consul-ui-ip
  namespace: default
  labels:
    app: consul
spec:
  ports:
    - name: consul-ui-ip
      protocol: TCP
      port: 8500
      targetPort: 8500
  selector:
    k8s-app: consul
  type: NodePort
  sessionAffinity: None

四、验证

1、日志

这里以第一个节点为例,从日志里可以看出,node name是 consul-0,consul的版本是1.11.1。我们没有指定datacenter的名称,默认是dc1。
在这里插入图片描述

  • leader节点是10.43.128.1
  • follow节点是10.37.0.3和10.39.0.4
    在这里插入图片描述

2、命令

  • 命名空间是default
// 查看service,注意 headless service
kubectl get svc -n default

// 针对consul ui 增加NodePort对外的访问地址
[admin@jenkins]$ kubectl get svc -n default
NAME                   TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S) AGE
consul                 ClusterIP   None             <none>        8500/TCP,8443/TCP,8400/TCP,8301/TCP,8301/UDP,8302/TCP,8302/UDP,8300/TCP,8600/TCP 2d20h
consul-dns             ClusterIP   10.107.173.90    <none>        53/TCP,53/UDP 2d19h
consul-ui              ClusterIP   10.111.174.132   <none>        80/TCP 2d19h

consul-ui-ip           NodePort    10.102.74.43     <none>        8500:30487/TCP 2d17h
// 三个Pod节点启动OK
kubectl get pod -n default

[admin@jenkins]$ kubectl get pod -n default
NAME                                      READY   STATUS    RESTARTS   AGE
consul-0                                  1/1     Running   0          2d17h
consul-1                                  1/1     Running   0          2d17h
consul-2                                  1/1     Running   0          2d17h
// 查看consul集群的成员列表
kubectl exec -n default consul-0 -- consul members
kubectl exec -n default consul-1 -- consul members
kubectl exec -n default consul-2 -- consul members


[admin@jenkins]$ kubectl exec -n default consul-0 -- consul members
Node      Address           Status  Type    Build   Protocol  DC   Partition  Segment
consul-0  10.43.128.1:8301  alive   server  1.11.1  2         dc1  default    <all>
consul-1  10.37.0.3:8301    alive   server  1.11.1  2         dc1  default    <all>
consul-2  10.39.0.4:8301    alive   server  1.11.1  2         dc1  default    <all>

[admin@jenkins]$ kubectl exec -n default consul-1 -- consul members
Node      Address           Status  Type    Build   Protocol  DC   Partition  Segment
consul-0  10.43.128.1:8301  alive   server  1.11.1  2         dc1  default    <all>
consul-1  10.37.0.3:8301    alive   server  1.11.1  2         dc1  default    <all>
consul-2  10.39.0.4:8301    alive   server  1.11.1  2         dc1  default    <all>

[admin@jenkins]$ kubectl exec -n default consul-2 -- consul members
Node      Address           Status  Type    Build   Protocol  DC   Partition  Segment
consul-0  10.43.128.1:8301  alive   server  1.11.1  2         dc1  default    <all>
consul-1  10.37.0.3:8301    alive   server  1.11.1  2         dc1  default    <all>
consul-2  10.39.0.4:8301    alive   server  1.11.1  2         dc1  default    <all>

3、consul server node

consul的data和config持久化到本地了。
在这里插入图片描述
在这里插入图片描述

五、遇到的问题

三个consul节点加入集群失败

  • 报错信息:
    agent: grpc: addrConn.createTransport failed to connect to {dc1-10.43.128.1:8300 0 consul-0.dc1 }. Err :connection error: desc = “transport: Error while dialing dial tcp ->10.43.128.1:8300: operation was canceled”. Reconnecting…

  • 解决办法:

# 在启动consul容器的时候,增加以下语句
        lifecycle:
          preStart:
            exec:
              command:
              - /bin/sh
              - -c
              - consul reload
          preStop:
            exec:
              command:
              - /bin/sh
              - -c
              - consul leave

六、对内访问

java服务接入consul示例:

consul_acl_token=xxxxxx
consul_service_ip=10.43.128.1或10.37.0.3或10.39.0.4

java -Dspring.cloud.consul.config.acl-token=$consul_acl_token \
-Dspring.cloud.consul.discovery.acl-token=$consul_acl_token \
-Dserver.ip=${LOCAL_IP} -Xms${Xms} -Xmx${Xmx} \
-XX:+HeapDumpOnOutOfMemoryError \
-DCONFIG_SERVICE_HOST=${consul_service_ip} \
-DCONFIG_SERVICE_ENABLED=true  -jar xxx.jar

七、UI界面

  • 访问地址:http://{ip}:30487

在这里插入图片描述

  • 查看leader节点和follow节点
    在这里插入图片描述

至此,三个server节点组成的consul集群就搭建完成了。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

UI彩虹外链网盘系统整站源码/PHP网盘与外链分享程序/整站+模版文件

源码简介&#xff1a; 全新UI彩虹外链网盘系统源码&#xff0c;它是PHP网盘与外链分享程序&#xff0c;提供了整站模版文件&#xff0c;前后端美化模板。 彩虹外链网盘美化模板是一款专为PHP网盘和外链分享程序设计的模板。它具备多种功能&#xff0c;包括支持所有格式文件的…

记录本地与服务器之间数据传输方法(上传、下载文件)

文章目录 一、使用scp命令实现参数说明示例说明 二、使用工具实现windows系统苹果系统如有启发&#xff0c;可点赞收藏哟~ 一、使用scp命令实现 scp 是 secure copy &#xff08;安全复制&#xff09;的缩写, scp 是基于 ssh 登陆进行安全的远程文件拷贝命令。相当于 cp 命令 …

ChatGPT进阶:提示工程的神秘面纱与实战指南

文章目录 一、提示工程的概念与原理二、提示工程的实践方法三、提示工程的挑战与展望四、实战案例分析总结《ChatGPT进阶&#xff1a;提示工程入门》内容简介作者简介陈颢鹏&#xff1a;李子菡&#xff1a; 目录获取方式 在人工智能领域&#xff0c;对话系统已经成为了一个热门…

数智赋能 锦江汽车携手苏州金龙打造高质量盛会服务

作为一家老牌客运公司&#xff0c;成立于1956年的上海锦江汽车服务有限公司&#xff08;以下简称锦江汽车&#xff09;&#xff0c;拥有1200多辆大巴和5000多辆轿车&#xff0c;是上海乃至长三角地区规模最大的专业旅游客运公司。面对客运市场的持续萎缩&#xff0c;锦江汽车坚…

不用再羡慕“SpaceX“ 民营星际荣耀打造国产可回收火箭双曲线二号

大家好&#xff0c;我是极智视界&#xff0c;欢迎关注我的公众号&#xff0c;获取我的更多前沿科技分享 邀您加入我的知识星球「极智视界」&#xff0c;星球内有超多好玩的项目实战源码和资源下载&#xff0c;链接&#xff1a;https://t.zsxq.com/0aiNxERDq 大家似乎习惯了对马…

PDF不小心关闭没保存?这4个方法教你拯救文件!

“我刚刚在查看一个PDF文件&#xff0c;但是一不小心我就把它关闭了&#xff0c;而且我还忘记保存了。这可怎么办呢&#xff1f;PDF不小心关闭没保存应该怎么解决呢&#xff1f;还有办法恢复吗&#xff1f;” PDF文档是我们日常工作和学习中常用的文件格式&#xff0c;但有时候…

QQ录屏保存到哪了?教你快速找到保存位置

qq录屏是许多用户常用的屏幕录制工具&#xff0c;可是一旦录制结束&#xff0c;许多人不清楚如何找到和管理录制的视频文件。那么&#xff0c;您知道qq录屏保存到哪了吗&#xff1f;本文将深入研究qq录制视频功能&#xff0c;以帮助您了解如何存储和管理这些重要的录制视频文件…

【Android Gradle】之一小时 Gradle及 wrapper 入门

&#x1f604;作者简介&#xff1a; 小曾同学.com,一个致力于测试开发的博主⛽️&#xff0c;主要职责&#xff1a;测试开发、CI/CD 如果文章知识点有错误的地方&#xff0c;还请大家指正&#xff0c;让我们一起学习&#xff0c;一起进步。 &#x1f60a; 座右铭&#xff1a;不…

【算法萌新闯力扣】:合并两个有序链表

力扣题目&#xff1a;合并两个有序链表 开篇 今天是备战蓝桥杯的第24天及算法村开营第2天。根据算法村的讲义&#xff0c;来刷链表的相关题目。今天要分享的是合并两个有序链表。 题目链接: 21.合并两个有序链表 题目描述 代码思路 通过创建一个新链表&#xff0c;然后遍历…

DEM分析

一、实验名称&#xff1a; DEM分析 二、实验目的&#xff1a; 通过本实验练习&#xff0c;掌握DEM的建立与应用基本方法。 三、实验内容和要求&#xff1a; 实验内容&#xff1a; 利用ARCGIS软件相关分析工具及实验数据&#xff0c;创建DEM&#xff0c;并计算相应坡度的区…

Android 单元测试初体验

Android 单元测试初体验 前言一、单元测试是什么&#xff1f;二、简单使用1.依赖2.单元测试代码简单模版及解释 总结 前言 当初在学校学安卓的时候&#xff0c;老师敢教学进度&#xff0c;翻到单元测试这一章节的时候提了两句&#xff0c;没有把单元测试当重点讲&#xff0c;只…

文章解读与仿真程序复现思路——电力自动化设备EI\CSCD\北大核心《考虑碳排放分摊的综合能源服务商交易策略》

这篇文章的标题表明它将讨论一个关于综合能源服务商交易策略的主题&#xff0c;而在这个策略中&#xff0c;特别考虑了碳排放分摊的因素。以下是对标题中各关键词的解读&#xff1a; 综合能源服务商&#xff1a; 这指的是在能源领域提供多种服务的企业或组织&#xff0c;可能涵…

https到底把什么加密了?

首先直接说结论&#xff0c; https安全通信模式&#xff0c;是使用TLS加密传输所有的http协议。再重复一遍&#xff0c;是所有&#xff01; 通常将TLS加密传输http这个通信过程称为https&#xff0c;如果使用协议封装的逻辑结构来表达就是&#xff1a; IP TCP TLS 【 HTTP 】…

算法效率的度量

算法效率的度量通常是通过时间复杂度和空间复杂度来描述的。 一、时间复杂度 算法中所有语句的执行次数之和为T(n)&#xff0c;它是算法问题规模n的函数&#xff0c;时间复杂度主要分析T(n)的数量级。 分类 1. 最好时间复杂度&#xff1a;最好情况下&#xff0c;算法的时间…

python subprocess

查看python官方文档&#xff1a;最全 p subprocess.Popen([rpng2bdf.exe,[r-o .\tst\myfont.bdf -f myfont -e 65 tst\*.png]],stdoutsubprocess.PIPE,stderr subprocess.PIPE) out,err p.communicate() print(out) 注意&#xff0c;如何将shell命令分解为参数序列可能并…

HT97226 免输出电容立体声耳机放大器的应用与曲线

HT97226应用&#xff1a; ・耳机 ・多媒体音频接口 ・机顶盒 ・ 蓝光/DVD播放器 ・LCD电视 ・音频消费电子产品 HT97226应用图于曲线&#xff1a; HT97226是一款差分输入/单端输入、可直接输出驱动的耳机放大器。5V供…

CentOS添加开机启动

1.编写项目启动脚本&#xff08;run.sh&#xff09; #!/bin/bash-切换到程序所在路径 cd /home/cavs_install/app/cavs-admin/target/ # 等待其他组件启动完毕后再启动本项目&#xff08;如果不需要等待&#xff0c;本步骤可省略&#xff09; sleep 300 # 实际启动命令 nohup …

Python Xorbits库:实现无限可能的编程旅程

概要 Python Xorbits是一个强大而多功能的开源Python库&#xff0c;为开发者提供了实现创新和复杂计算的能力。它提供了各种功能和工具&#xff0c;帮助开发者在编程旅程中探索无限可能。本文将详细介绍Python Xorbits的用途和使用教程&#xff0c;帮助读者了解和掌握这个令人…

网络运维与网络安全 学习笔记2023.11.27

网络运维与网络安全 学习笔记 第二十八天 今日目标 OSPF基本原理、OSPF单区域配置、OSPF多区域配置 特殊区域之Stub、特殊区域之NSSA OSPF基本原理 项目背景 随着企业的发展&#xff0c;网络的规模越来越大&#xff0c;网段的数量越来越多&#xff0c;公司内部的路由器的…

聚观早报 |智界S7首发无人代客泊车;仰望U9内饰公开

【聚观365】11月27日消息 智界S7首发无人代客泊车 仰望U9内饰公开 微信医保码上线四周年 梦饷科技与纳维凯尔达成战略合作 百度地图升级AI向导功能 智界S7首发无人代客泊车 在11月9日的华为智慧出行解决方案发布暨智界S7新品预售发布会上&#xff0c;余承东宣布&#xff…