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: 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 是最佳实践。
posted @ 2026-04-20 22:33  干炸小黄鱼  阅读(40)  评论(0)    收藏  举报