当前位置: 首页 > news >正文

k8s下部署consul and etcd

在 Kubernetes (K8s) 环境下,EtcdConsul 的部署方式和角色定位有显著区别。

  • Etcd:通常是 K8s 集群的底层依赖(控制平面核心)。在 K8s 中部署 Etcd 主要是为了支撑 K8s 本身(独立部署以提升性能)或作为底层存储供你的 Go 应用直接调用。
  • Consul:通常作为应用层组件运行在 K8s 之上。在 K8s 中部署 Consul 主要是为了构建服务网格(Service Mesh)、实现跨集群服务发现或作为配置中心。

以下是两者在 K8s 环境下的详细部署与使用指南。


🗄️ Etcd:K8s 的基石与独立集群部署

Etcd 在 K8s 中有两种存在形式:

  1. 内置 Etcd(默认):Kubeadm 等工具会自动以静态 Pod 的方式在 Master 节点上部署 Etcd。这对大多数场景已经足够。
  2. 独立 Etcd 集群(生产级推荐):将 Etcd 部署在独立的服务器或独立的 K8s 集群上,与 K8s Master 分离。这能避免业务负载影响 K8s 控制平面的稳定性。

场景:部署独立 Etcd 集群供 K8s 使用

如果你希望 K8s 使用外部的独立 Etcd 集群(例如为了更高的高可用性或性能隔离),你需要先部署 Etcd,然后修改 K8s API Server 的配置。

部署步骤(基于二进制/虚拟机模式,这是生产环境独立部署的标准方式):

  1. 准备 Etcd 节点:准备 3 台独立的服务器(或虚拟机),安装 Etcd 二进制文件。
  2. 配置 Etcd 集群
    在每台 Etcd 节点上配置 etcd.service,核心参数包括:
    • --name:节点名称。
    • --initial-advertise-peer-urls:节点间通信地址。
    • --listen-client-urls:对外服务地址。
    • --advertise-client-urls:客户端访问地址。
    • --initial-cluster:集群所有节点列表。
  3. 生成证书:Etcd 对安全要求极高,必须配置 TLS 证书(CA、Server、Client 证书)。
  4. 连接 K8s
    修改 K8s Master 节点上的 API Server 配置(通常在 /etc/kubernetes/manifests/kube-apiserver.yaml),将默认的本地 Etcd 地址替换为你的独立集群地址:
    spec:containers:- command:- kube-apiserver# 指向独立 Etcd 集群的 VIP 或 IP 列表- --etcd-servers=https://192.168.1.10:2379,https://192.168.1.11:2379,https://192.168.1.12:2379- --etcd-cafile=/etc/kubernetes/pki/etcd/ca.crt- --etcd-certfile=/etc/kubernetes/pki/apiserver-etcd-client.crt- --etcd-keyfile=/etc/kubernetes/pki/apiserver-etcd-client.key
    

场景:在 K8s 内部部署 Etcd 供业务使用

如果你的 Go 应用需要 Etcd 做注册中心,且不想依赖外部设施,可以在 K8s 内部署一个业务专用的 Etcd 集群(注意:不要与 K8s 系统共用的那个 Etcd 混用)。

  • 推荐工具:使用 Bitnami Etcd Helm ChartEtcd Operator
  • Helm 部署示例
    # 添加 Bitnami 仓库
    helm repo add bitnami https://charts.bitnami.com/bitnami
    # 安装 Etcd 集群(3副本)
    helm install my-etcd bitnami/etcd --set replicaCount=3
    
    部署后,你的 Go 应用通过 Service 域名(如 my-etcd.default.svc.cluster.local:2379)即可访问。

🏛️ Consul:云原生服务网格部署

Consul 在 K8s 中通常以 StatefulSet 形式运行,并配合 DaemonSet (Client 模式) 来注入 Sidecar 代理,从而实现服务网格功能。

部署方式:使用官方 Helm Chart(推荐)

HashiCorp 官方提供了功能强大的 Helm Chart,可以一键部署包含 Server、Client、Connect Inject(注入器)和 UI 的完整环境。

1. 准备配置文件 (values.yaml)
为了生产级使用,你需要开启 TLS、ACL(权限控制)和 Gossip 加密。

# consul-values.yaml
global:name: consuldatacenter: dc1# 开启 TLS 加密tls:enabled: trueenableAutoEncrypt: true# 开启 ACL 权限acls:manageSystemACLs: true# Gossip 协议加密gossipEncryption:autoGenerate: trueserver:replicas: 3 # 生产环境至少 3 个storage: 10GistorageClass: standard # 需提前准备好 StorageClassui:enabled: trueservice:type: ClusterIP# 开启 Connect 注入,实现服务网格
connectInject:enabled: true# 默认不注入,需在 Pod 注解中显式开启default: false 

2. 执行部署

# 添加 HashiCorp 仓库
helm repo add hashicorp https://helm.releases.hashicorp.com
helm repo update# 创建命名空间
kubectl create namespace consul# 安装 Consul
helm install consul hashicorp/consul --namespace consul -f consul-values.yaml

如何在 Go 应用中使用(集成)

部署完成后,Consul 并不会自动接管所有流量,你需要通过注解来让 Go 应用接入 Consul 网格。

1. 服务注册与 Sidecar 注入
在你的 Go 应用 Deployment YAML 中添加注解,Consul 会自动注入 Envoy Sidecar 并注册服务。

apiVersion: apps/v1
kind: Deployment
metadata:name: my-go-app
spec:template:metadata:annotations:# 开启 Connect 注入"consul.hashicorp.com/connect-inject": "true"# 定义服务名"consul.hashicorp.com/connect-service": "user-service"# 定义服务端口"consul.hashicorp.com/connect-service-port": "8080"spec:containers:- name: appimage: my-go-app:latestports:- containerPort: 8080

2. 服务调用
一旦注入成功,你的 Go 应用访问其他服务时,流量会自动经过本地 Sidecar 代理,享受 mTLS 加密和可观测性。

  • 代码无需修改:如果你的应用使用 DNS 名称访问(例如 http://order-service),Consul DNS 模块会自动解析到健康的实例 IP。

📌 总结:K8s 环境下选型与部署对比

特性 Etcd in K8s Consul in K8s
主要角色 K8s 的数据库 (后端存储) 应用的服务网格 (流量治理)
部署形态 1. 静态 Pod (内置)2. 独立集群 (外部)3. StatefulSet (业务用) 1. Server (StatefulSet)2. Client (DaemonSet/Sidecar)
部署工具 Kubeadm (内置), Helm/Operator (业务用) Helm Chart (官方首选)
Go 应用交互 使用 clientv3 直接连接 IP/域名 通过 Sidecar 代理,或使用 consul-api
核心价值 强一致性数据存储,K8s 运行基础 零代码侵入的流量管理、安全、监控

建议:

  • Etcd:除非你有极高的并发写入需求或极特殊的运维要求,否则不要在 K8s 内部署 Etcd 给业务用(容易抢占 K8s 系统资源)。建议使用外部独立 Etcd 集群或云厂商提供的托管 Etcd 服务。
  • Consul:如果你需要服务网格、多数据中心同步或复杂的配置管理,直接在 K8s 上用 Helm 部署 Consul 是最佳实践。
http://www.jsqmd.com/news/673448/

相关文章:

  • mini3d三角形光栅化算法:从顶点到像素的完整转换过程
  • 从零开始掌握哔哩下载姬:你的B站视频下载与管理终极指南
  • EPLAN高手都在用的‘拖拽大法’:一个手势搞定符号库、项目打开和文件导入
  • 5步搞定明日方舟全自动化:MAA助手终极指南
  • 如何在Orwell Dev-C++中配置GCC
  • 别再只写#ifdef __cplusplus了!聊聊这个宏在C++11/17/20下的实战用法与坑
  • 在Ubuntu 20.04上搞定lidar_imu_calib编译报错:一个C++14编译选项的避坑实录
  • 模块化3D高斯喷洒框架:GauStudio架构深度解析与技术创新
  • 金三银四创作之星最后10天怎么冲?普通技术博主的参赛选题、发文节奏与提分实战方案
  • ITK-SNAP医学图像分割:从新手到专家的实战指南
  • CDecrypt:终极Wii U游戏文件解密工具完整指南
  • JMeter 线程组
  • Magpie:为Windows用户重新定义窗口缩放体验的开源解决方案
  • Serverless Components开发工作流:从本地调试到Registry发布全流程
  • Fedora 40 一键安装 Oracle 19C 单机
  • OpenCVE数据源集成揭秘:MITRE、NVD、RedHat等多源数据聚合
  • 如何使用League Akari:英雄联盟智能管家的完整指南
  • SCons完整指南:从简单程序到复杂项目的构建自动化
  • Go 结构体
  • Windows递归创建目录命令(递归创建目录脚本)mkdir
  • 用Lua给ESP8266写个‘心跳’:手把手教你连接巴法云MQTT/TCP(附完整代码)
  • 编写程序实现非遗手作个体户低成本记账核算工具,极简收支录入+成本利润自动测算,适配小作坊零门槛使用。
  • Blender-Python脚本(材质篇)
  • ComfyUI图像处理工作流优化:WAS Node Suite 210+节点深度解析
  • 【flutter for open harmony】第三方库 Flutter 鸿蒙实战:get_it 依赖注入 + 模块化架构优化,项目秒变企业级✨
  • 告别内核自带驱动:深度折腾RTL8188EUS无线网卡,从编译到稳定上网的避坑全记录
  • 保姆级教程:用VMware 16 Pro在Windows电脑上免费体验macOS Monterey 12(附Darwin.iso工具下载)
  • 软件测试之基础篇(理论)
  • Flink状态存储选型实战:为什么生产环境更偏爱RocksDB?
  • GBFR Logs终极指南:如何用免费工具将你的《碧蓝幻想:Relink》战斗效率提升200%