在 Kubernetes (K8s) 环境下,Etcd 和 Consul 的部署方式和角色定位有显著区别。
- Etcd:通常是 K8s 集群的底层依赖(控制平面核心)。在 K8s 中部署 Etcd 主要是为了支撑 K8s 本身(独立部署以提升性能)或作为底层存储供你的 Go 应用直接调用。
- Consul:通常作为应用层组件运行在 K8s 之上。在 K8s 中部署 Consul 主要是为了构建服务网格(Service Mesh)、实现跨集群服务发现或作为配置中心。
以下是两者在 K8s 环境下的详细部署与使用指南。
🗄️ Etcd:K8s 的基石与独立集群部署
Etcd 在 K8s 中有两种存在形式:
- 内置 Etcd(默认):Kubeadm 等工具会自动以静态 Pod 的方式在 Master 节点上部署 Etcd。这对大多数场景已经足够。
- 独立 Etcd 集群(生产级推荐):将 Etcd 部署在独立的服务器或独立的 K8s 集群上,与 K8s Master 分离。这能避免业务负载影响 K8s 控制平面的稳定性。
场景:部署独立 Etcd 集群供 K8s 使用
如果你希望 K8s 使用外部的独立 Etcd 集群(例如为了更高的高可用性或性能隔离),你需要先部署 Etcd,然后修改 K8s API Server 的配置。
部署步骤(基于二进制/虚拟机模式,这是生产环境独立部署的标准方式):
- 准备 Etcd 节点:准备 3 台独立的服务器(或虚拟机),安装 Etcd 二进制文件。
- 配置 Etcd 集群:
在每台 Etcd 节点上配置etcd.service,核心参数包括:--name:节点名称。--initial-advertise-peer-urls:节点间通信地址。--listen-client-urls:对外服务地址。--advertise-client-urls:客户端访问地址。--initial-cluster:集群所有节点列表。
- 生成证书:Etcd 对安全要求极高,必须配置 TLS 证书(CA、Server、Client 证书)。
- 连接 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 Chart 或 Etcd Operator。
- Helm 部署示例:
部署后,你的 Go 应用通过 Service 域名(如# 添加 Bitnami 仓库 helm repo add bitnami https://charts.bitnami.com/bitnami # 安装 Etcd 集群(3副本) helm install my-etcd bitnami/etcd --set replicaCount=3my-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 是最佳实践。
