k8s中安装consul集群

一、准备知识

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-resourcesnamespace: default
spec:accessModes:- ReadWriteManyresources:requests:storage: 10GistorageClassName: managed-nfs-storagevolumeMode: 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: 10Ginfs:server: 192.168.80.170path: >-/srv/nfs/disk/default-defalut-resources-pvc-e5c5a6c9-d083-407a-86d7-25bf26e62ad4accessModes:- ReadWriteManypersistentVolumeReclaimPolicy: DeletestorageClassName: managed-nfs-storagevolumeMode: 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-appoperator: Invalues:- consultopologyKey: kubernetes.io/hostname

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

二、目标

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

三、搭建consul集群

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

apiVersion: apps/v1
kind: StatefulSet
metadata:name: consulnamespace: default
spec:serviceName: consulreplicas: 3selector:matchLabels:k8s-app: consultemplate: metadata:labels:k8s-app: consulspec:affinity:podAntiAffinity:requiredDuringSchedulingIgnoredDuringExecution:- labelSelector:matchExpressions:- key: k8s-appoperator: Invalues:- consultopologyKey: kubernetes.io/hostnameterminationGracePeriodSeconds: 10containers:- name: consulimage: consul:latestimagePullPolicy: IfNotPresentargs:- "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: nfsmountPath: /consul/datasubPathExpr: data/$(PODNAME)- name: nfsmountPath: /consul/configsubPathExpr: config/$(PODNAME)env:- name: PODIPvalueFrom:fieldRef:fieldPath: status.podIP- name: NAMESPACEvalueFrom:fieldRef:fieldPath: metadata.namespace- name: PODNAMEvalueFrom:fieldRef:fieldPath: metadata.nameresources:limits:cpu: "2G"memory: "2Gi"requests:cpu: "200m"memory: "1Gi"lifecycle:preStart:exec:command:- /bin/sh- -c- consul reloadpreStop:exec:command:- /bin/sh- -c- consul leaveports:- containerPort: 8500name: ui-port- containerPort: 8400name: alt-port- containerPort: 53name: udp-port- containerPort: 8443name: https-port- containerPort: 8080name: http-port- containerPort: 8301name: serflan- containerPort: 8302name: serfwan- containerPort: 8600name: consuldns- containerPort: 8300name: servervolumes:- name: nfspersistentVolumeClaim:claimName: defalut-resources

2、创建services

kind: Service
apiVersion: v1
metadata:name: consulnamespace: defaultlabels:app: consul
spec:ports:- name: httpprotocol: TCPport: 8500targetPort: 8500- name: httpsprotocol: TCPport: 8443targetPort: 8443- name: rpcprotocol: TCPport: 8400targetPort: 8400- name: serflan-tcpprotocol: TCPport: 8301targetPort: 8301- name: serflan-udpprotocol: UDPport: 8301targetPort: 8301- name: serfwan-tcpprotocol: TCPport: 8302targetPort: 8302- name: serfwan-udpprotocol: UDPport: 8302targetPort: 8302- name: serverprotocol: TCPport: 8300targetPort: 8300- name: consuldnsprotocol: TCPport: 8600targetPort: 8600selector:k8s-app: consulclusterIP: None---
apiVersion: v1
kind: Service
metadata:name: consul-dnsnamespace: defaultlabels:app: consul
spec:selector:k8s-app: consulports:- name: dns-tcpprotocol: TCPport: 53targetPort: dns-tcp- name: dns-udpprotocol: UDPport: 53targetPort: dns-udp---
apiVersion: v1
kind: Service
metadata:name: consul-uinamespace: defaultlabels:app: consul
spec:selector:k8s-app: consulports:- name: httpport: 80targetPort: 8500

3、创建一个nodeport类型的service

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

kind: Service
apiVersion: v1
metadata:name: consul-ui-ipnamespace: defaultlabels:app: consul
spec:ports:- name: consul-ui-ipprotocol: TCPport: 8500targetPort: 8500selector:k8s-app: consultype: NodePortsessionAffinity: 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 2d19hconsul-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 reloadpreStop: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.4java -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.mzph.cn/news/175512.shtml

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

相关文章

【后端】数据字典自动生成枚举

前言 随着我老板给我灌溉的思想,逐渐开始利用代码来完成一些重复性且没有创造性的工作(我变懒啦),当我发现数据字典可以生成枚举从而大大减少开发时间的时候,我意识到事情的重要性。 数据字典 我一开始在网上找各种代码生成器的框架,然后突然意识到,这个不就是简单的…

2022年MathorCup大数据竞赛B题北京移动用户体验影响因素研究求解全过程文档及程序

2022年MathorCup高校数学建模挑战赛—大数据竞赛 B题 北京移动用户体验影响因素研究 原题再现&#xff1a; 移动通信技术飞速发展&#xff0c;给人们带来了极大便利&#xff0c;人们也越来越离不开移动通信技术带来的各种便捷。随着网络不断的建设&#xff0c;网络覆盖越来越…

XIAO ESP32S3之套件简绍

很高兴收到柴火创客空间寄来的XIAO ESP32S3开发套件。 一、套件介绍 1、电路板部分 一块XIAO ESP32S3主板、一块摄像头接口板&#xff08;可接SD卡&#xff09;&#xff0c;一根2.4G天线。 2、配件部分 一根USB-A转TypeC数据线、一个USB3.0转TypeC转接头、一个SD卡读卡器&am…

vue中keep-alive的使用

什么是keep-alive&#xff1f; keep-alive是一个内置组件&#xff0c;用于缓存和管理组件的状态。 当 keep-alive包裹一个组件时&#xff0c;这个组件的状态将会被缓存起来&#xff0c;而不是每次重新渲染。这在多个视图之间切换时特别有用&#xff0c;可以避免重复的创建和销…

vue项目通过HBuilder打包成apk,实现apk自动更新下载

vue 项目通过 HBuilder 打包成 apk&#xff0c;实现 apk 自动更新下载 1、vue 项目通过 HBuilder 打包成 apk vue 项目在终端执行 npm run build 打包成 dist 文件&#xff0c;生成的 dist 文件在 项目根目录下 在 HBuilder 中 新建一个项目 默认选择 5APP 的默认模板项目…

springboot+vue智能企业设备管理系统05k50

智能设备管理系统主要是为了提高工作人员的工作效率和更方便快捷的满足用户&#xff0c;更好存储所有数据信息及快速方便的检索功能&#xff0c;对系统的各个模块是通过许多今天的发达系统做出合理的分析来确定考虑用户的可操作性&#xff0c;遵循开发的系统优化的原则&#xf…

linux 命令 sudo、su 命令

sudo命令详解 1、初识sudo sudo是linux下常用的允许普通用户使用超级用户权限的工具&#xff0c;sudo 用来执行需要提升权限&#xff08;通常是作为 root 用户&#xff09;的命令&#xff0c;允许系统管理员让普通用户执行一些或者全部的root命令&#xff0c;如halt&#xff…

spring boot的redis连接数过多导致redis服务器压力过大的一次问题排查

一、背景 在今天上午的时候&#xff0c;突然收到大量的sentry报错&#xff0c;都是关于redis连接超时的警告。 首先想到的是去查看redis的监控&#xff0c;发现那个时间段&#xff0c;redis的请求数剧增&#xff0c;cpu使用率和带宽都陡增双倍。 下面的是redis监控的cpu情况 …

无代码未来:智能、可视化、自动化的融合

无代码是一个相对较新的概念&#xff0c;不同的人群对其界定可能存在一定的差异。 对于IT专业人士和开发人员而言&#xff0c;无代码通常是指使用可视化界面和拖拽操作来构建应用程序的工具和平台。 无代码平台通过提供预先构建的组件和模块&#xff0c;使得开发人员可以通过简…

基于CW32F030单片机的便携式多功能测试笔

一、产品背景 在日常的硬件调试工作中&#xff0c;我们最常使用的仪器仪表可能就是万用表了&#xff0c;虽然万用表号称“万用”&#xff0c;但大部分时候&#xff0c;我们需要使用到的功能无非是电压测量和通断测量。 作为调试的“得力干将”&#xff0c;万用表有时候也会存…

歌手荆涛演唱的《春节回家》,一种情感的表达和文化的传承

歌手荆涛演唱的《春节回家》&#xff0c;一种情感的表达和文化的传承 春节回家&#xff0c;是中国传统文化中最为重要的传统节日之一&#xff0c;也是亿万华夏儿女最为期待的日子。每当春节临近&#xff0c;无论身在何处&#xff0c;人们都会收拾行囊&#xff0c;踏上归途&…

【5G PHY】5G SS/PBCH块介绍(四)

博主未授权任何人或组织机构转载博主任何原创文章&#xff0c;感谢各位对原创的支持&#xff01; 博主链接 本人就职于国际知名终端厂商&#xff0c;负责modem芯片研发。 在5G早期负责终端数据业务层、核心网相关的开发工作&#xff0c;目前牵头6G算力网络技术标准研究。 博客…

策略算法与Actor-Critic网络

策略算法 教程链接 DataWhale强化学习课程JoyRL https://johnjim0816.com/joyrl-book/#/ch7/main 策略梯度 与前面的基于价值的算法不同&#xff0c;这类算法直接对策略本身进行近似优化。 在这种情况下&#xff0c;我们可以将策略描述成一个带有参数 θ θ θ的连续函数…

WebUI自动化学习(Selenium+Python+Pytest框架)002

新建项目 New Project 新建一个python代码文件 file-new-python file 会自动创建一个.py后缀的代码文件 注意:命名规则,包含字母、数字、下划线&#xff0c;不能以数字开头&#xff0c;不能跟python关键字或包名重复。 ********************华丽分割线********************…

【算法】20231128

这里写目录标题 一、55. 跳跃游戏二、274. H 指数三、125. 验证回文串 一、55. 跳跃游戏 给你一个非负整数数组 nums &#xff0c;你最初位于数组的 第一个下标 。数组中的每个元素代表你在该位置可以跳跃的最大长度。 判断你是否能够到达最后一个下标&#xff0c;如果可以&am…

【MATLAB源码-第91期】基于matlab的4QAM和4FSK在瑞利(rayleigh)信道下误码率对比仿真。

操作环境&#xff1a; MATLAB 2022a 1、算法描述 正交幅度调制&#xff08;QAM&#xff0c;Quadrature Amplitude Modulation&#xff09;是一种在两个正交载波上进行幅度调制的调制方式。这两个载波通常是相位差为90度&#xff08;π/2&#xff09;的正弦波&#xff0c;因此…

C语言第三十四弹--矩形逆置

C语言实现矩阵逆置 逆置结果如图 思路&#xff1a;通过观察逆置结果&#xff0c;首先发现行数和列数都发生了调换。其次观察逆置前后数字对应的下标&#xff0c;逆置前数字对应下标为:[x][j] 逆置后数字对应下标为&#xff1a;[y][x]。综上&#xff0c;就可以实现矩阵逆置。 …

3D点云目标检测:CT3D解读(未完)

CT3D 一、RPN for 3D Proposal Generation二、Proposal-to-point Encoding Module2.1、Proposal-to-point Embedding2.2、Self-attention Encoding 三、Channel-wise Decoding Module3.1、Standard Decoding3.2、Channel-wise Re-weighting3.3、Channel-wise Decoding Module 四…

Pinctrl子系统和GPIO子系统实验

驱动入口出口函数&#xff1a; static int __init led_init(void) {return 0; } static void __exit led_exit(void) { }module_init(led_init);module_exit(led_exit);MODULE_LICENSE("GPL");字符设备驱动那一套 先创建设备结构体 &#xff08;cdev&#xff09; 1…

控制台gbk乱码

引用IntelliJ IDEA中 统一设置编码为utf-8或GBK-CSDN博客 特别注意file coding 的文件path和java的编码格式 配置