如何使用 Helm 在 Kubernetes 上部署高可用 ETCD 集群?
摘要:# ETCD 集群部署指南 (v3.6.4) > 基于 Kubernetes + Helm 部署高可用 ETCD 集群 ## 目录 - [一、常规部署步骤](#一常规部署步骤) - [二、检查集群状态
# ETCD 集群部署指南 (v3.6.4)
> 基于 Kubernetes + Helm 部署高可用 ETCD 集群
---
## 目录
- [一、常规部署步骤](#一常规部署步骤)
- [二、检查集群状态](#二检查集群状态)
- [三、集群数据验证](#三集群数据验证)
- [四、values.yaml 配置详解](#四valuesyaml-配置详解)
- [五、LoadBalancer 创建](#五loadbalancer-创建)
- [六、监控配置](#六监控配置)
- [七、ArgoCD 管理](#七argocd-管理)
---
## 一、常规部署步骤
### 1.1 添加 Helm 仓库
```bash
# 添加 Bitnami 仓库(维护最完善的 etcd Helm Chart)
helm repo add bitnami https://charts.bitnami.com/bitnami
# 更新仓库索引
helm repo update
```
### 1.2 创建命名空间和 Secret
```bash
# 创建命名空间
kubectl create ns etcd-dev
# 创建密码 Secret(替代 values.yaml 中的明文密码)
kubectl create secret generic etcd-rbac-secret -n etcd-dev \
--from-literal=password=运维配置
```
### 1.3 拉取 Chart 并部署
```bash
# 拉取 charts 至本地
helm pull bitnami/etcd --untar
# 备份默认 values.yaml 文件,创建自定义 etcd-values.yaml
# 建议在执行部署升级命令之前添加 --dry-run --debug 参数验证 values.yaml 文件正确性
# 部署命令
helm install etcd ./etcd -f ./etcd/values.yaml -n etcd-dev
# 升级命令
helm upgrade etcd ./etcd -f ./etcd/values.yaml -n etcd-dev
```
---
## 二、检查集群状态
### 2.1 查看 Pod 和 Service 状态
```bash
# 查看 pod, svc 状态
kubectl get pods -n etcd-dev
kubectl get svc -n etcd-dev
```
### 2.2 进入 Pod 检查集群
```bash
# 进入 pod,使用 etcdctl 命令查看
kubectl exec -it etcd-0 -n etcd-dev -- /bin/sh
# 查看集群成员
etcdctl member list
# 检查集群健康状态(高可用核心验证)
etcdctl --user=root:认证密码 endpoint health \
--endpoints=http://etcd-0.etcd-headless.etcd-dev.svc.cluster.local:2379,http://etcd-1.etcd-headless.etcd-dev.svc.cluster.local:2379,http://etcd-2.etcd-headless.etcd-dev.svc.cluster.local:2379
```
---
## 三、集群数据验证
### 3.1 写入测试数据
```bash
# 在 etcd-0 POD 节点创建数据
etcdctl --user root:认证密码 put a 1
```
### 3.2 在所有节点验证
```bash
# 在所有 POD 节点查询,都能查询到说明集群正常
etcdctl --user root:认证密码 get a
# 预期输出
# a
# 1
```
---
## 四、values.yaml 配置详解
### 4.1 镜像配置
```yaml
# 1. 镜像仓库修改,原 docker.io 镜像地址不可用
image:
registry: public.ecr.aws
repository: bitnami/etcd
tag: 3.6.4-debian-12-r3
```
### 4.2 RBAC 认证配置
```yaml
# 2. rbac 认证账号密钥配置
auth:
rbac:
create: true
allowNoneAuthentication: false
