惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

B
Blog RSS Feed
博客园_首页
N
News | PayPal Newsroom
有赞技术团队
有赞技术团队
The Hacker News
The Hacker News
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
The Cloudflare Blog
S
SegmentFault 最新的问题
Jina AI
Jina AI
人人都是产品经理
人人都是产品经理
P
Privacy & Cybersecurity Law Blog
AI
AI
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
Schneier on Security
Schneier on Security
博客园 - 三生石上(FineUI控件)
月光博客
月光博客
量子位
Forbes - Security
Forbes - Security
爱范儿
爱范儿
云风的 BLOG
云风的 BLOG
SecWiki News
SecWiki News
Last Week in AI
Last Week in AI
酷 壳 – CoolShell
酷 壳 – CoolShell
T
Tor Project blog
Recorded Future
Recorded Future
A
About on SuperTechFans
J
Java Code Geeks
The Register - Security
The Register - Security
PCI Perspectives
PCI Perspectives
H
Hacker News: Front Page
V2EX - 技术
V2EX - 技术
S
Secure Thoughts
V
Vulnerabilities – Threatpost
Hacker News: Ask HN
Hacker News: Ask HN
MongoDB | Blog
MongoDB | Blog
N
Netflix TechBlog - Medium
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
Scott Helme
Scott Helme
T
The Exploit Database - CXSecurity.com
Y
Y Combinator Blog
AWS News Blog
AWS News Blog
D
Darknet – Hacking Tools, Hacker News & Cyber Security
IT之家
IT之家
T
The Blog of Author Tim Ferriss
G
Google Developers Blog
C
CERT Recently Published Vulnerability Notes
L
LangChain Blog
F
Full Disclosure
Application and Cybersecurity Blog
Application and Cybersecurity Blog
The GitHub Blog
The GitHub Blog

博客园 - 干炸小黄鱼

timex 处理时间戳 gorm-gen go 雪花算法 golang每日一库--协程池库ants golang每日一库--json解析库gjson python高级编程-asyncio python高级编程-condition python高级编程-event python装饰器-自动重试 EAP系统 go实现实现 SECS/GEM 协议 设备通信协议 SECS go项目使用Jenkins进行CICD go操作ES mongo db聚合查询 go如何使用mongodb Apache ShardingSphere paxos and raft (分布式一致性算法) go使用zookeeper分布式锁以及和redis差异 go使用 seata 示例 Alibaba 分布式事务 Seata go中使用saga go中使用TCC示例 分布式事务TCC 熔断器 Hystrix OR Sentinel Consul OR Etcd 【力扣hot100】双指针-盛水最多的容器 【力扣hot100】滑动窗口-最小覆盖子串 shell脚本合集 分布式id生成器 springboot通用CURD Python PB级检索系统架构设计 rancher 在三台机器搭建k8s集群 python ssh clinet 数据库排序Null值字段靠后/靠前 常规web项目 docker-compose 例子 手搓一个验证码 使用itertools 中的groupby 对字典数组进行分组后排序 使用开源库 geoip2 获取某ip的经纬度地理信息 python中 apscheduler.schedulers.blocking.BlockingScheduler 定时执行任务 简单的python web项目的docker-compose.yml 示例 python和sliver交互 golang sliver二次开发自定义命令(格式乱后面再调) pydantic做参数校验 基于rancher部署k8s 地理位置相关基础数据 flask migrate时报错 Can't locate revision identified by '3d80e4c025df'
k8s下部署consul and etcd
干炸小黄鱼 · 2026-04-20 · via 博客园 - 干炸小黄鱼

在 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: consul
  datacenter: dc1
  # 开启 TLS 加密
  tls:
    enabled: true
    enableAutoEncrypt: true
  # 开启 ACL 权限
  acls:
    manageSystemACLs: true
  # Gossip 协议加密
  gossipEncryption:
    autoGenerate: true

server:
  replicas: 3 # 生产环境至少 3 个
  storage: 10Gi
  storageClass: standard # 需提前准备好 StorageClass

ui:
  enabled: true
  service:
    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: app
        image: my-go-app:latest
        ports:
        - 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 是最佳实践。