Kubernetes 外部 etcd 集群的快速 Docker Compose 部署指南

2024-08-26 06:20

本文主要是介绍Kubernetes 外部 etcd 集群的快速 Docker Compose 部署指南,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

一、背景

在高可用 Kubernetes 部署中,需要单独部署外部 etcd 集群,而不是使用 kubeadm 默认在 master 节点上部署的 etcd。以下是关于这一配置场景的详细记录。

二、etcd简介

etcd 是一个高可用的分布式键值存储系统,主要用于存储和管理配置信息、服务发现信息以及其他重要的元数据。etcd 是由 CoreOS 开发的,基于 Raft 共识算法来保证数据的一致性和可靠性。

2.1 etcd 关键特点

  • 分布式:etcd 运行在多个节点上,通过 Raft 协议确保数据一致性。
  • 高可用性:即使部分节点出现故障,etcd 也能继续提供服务。
  • 一致性保证:使用 Raft 协议来确保数据的一致性,支持强一致性读写。
  • 键值存储:数据以键值对的形式存储,适合存储配置和元数据。
  • 支持事务:支持原子操作,如事务操作来保证数据的正确性。

2.2 etcd 主要功能

  • 分布式键值存储:etcd 是一个高可用的分布式键值存储系统,支持高效的键值对存储和读取,并提供强一致性保证。
  • 一致性保证:etcd 使用 Raft 协议确保数据一致性,即使部分节点故障,数据仍然保持一致。
  • 高可用性:etcd 通过数据复制到多个节点提供高可用性和容错能力,只要大多数节点正常,数据依然可用。
  • 事务支持:etcd 支持原子操作和事务,确保对多个键值对的更改安全一致。
  • 观察和通知:etcd 支持事件监听和观察功能,客户端可以订阅键值变化,适合动态配置更新。
  • 持久化存储:etcd 将数据持久化到磁盘,确保在节点重启或故障时数据不丢失。
  • 分布式锁:etcd 提供分布式锁,支持节点间的协调和同步,常用于确保资源唯一性或任务协调。
  • 范围查询:etcd 支持对键值对的范围查询,便于批量检索数据。
  • API 接口:etcd 提供 HTTP/gRPC API,支持基本的 CRUD 操作、事务和观察功能。

这些功能使 etcd 成为一个强大且可靠的分布式键值存储系统,适合用于需要高一致性和高可用性的场景,特别是在 Kubernetes 这样的集群管理系统中。

2.3 etcd 在 Kubernetes 中使用场景

K8S-3主3从-单独etcd集群.png

在 Kubernetes (K8S) 集群中,etcd 扮演着至关重要的角色。它主要用于存储和管理 Kubernetes 的所有集群状态信息和配置数据。以下是 etcd 在 Kubernetes 中的一些关键使用场景:

  • 集群状态存储:Kubernetes 的所有集群状态、配置信息、资源定义等都存储在 etcd 中。包括 Pod、Service、ConfigMap、Secret 等对象的状态和配置都被存储在 etcd 中。

  • 高可用性配置:提供高可用性和容错能力,保证即使在集群中的一些节点失效的情况下,Kubernetes 也能继续运行和提供服务。

  • 数据一致性保证: 使用 Raft 协议确保数据的一致性,这对于 Kubernetes 来说是非常重要的,因为它需要确保所有操作和状态在集群中的一致性。

  • 服务发现:Kubernetes 的服务发现机制依赖于 etcd 存储服务的状态和信息。etcd 记录服务的 IP 地址和端口信息,允许其他组件进行服务发现。

  • 动态配置管理:Kubernetes 使用 etcd 来管理配置变化,比如部署新的应用版本或调整资源配置。etcd 的事务支持使得配置更改能够被安全地提交和应用。

  • 审计和恢复:etcd 的持久化存储允许 Kubernetes 在发生故障或恢复操作时能够重建集群状态。etcd 的备份和恢复机制是确保 Kubernetes 集群数据安全的重要手段。

三、使用docker-compose快速部署etcd

  • 参考官方文档:https://github.com/etcd-io/etcd/releases

3.1 etcd单节点部署

PS: 请勿在K8S 集群中的机器上 使用docker-compose 去部署etcd ,可能会存在子网冲突; 在条件允许的情况下,我们还是申请机器去单独部署etcd

3.1.1 环境准备

机器IP主机名etcd版本docker 版本docker-compose版本
172.22.33.213etcdv3.3.820.10.18v2.10.2

3.1.2 创建etcd 工作目录,编写docker-compose 文件

  • ETCD_NAME 每个节点的 etcd 服务名称
  • ETCD_ADVERTISE_CLIENT_URLS 填写每个 etcd 容器所在节点对外提供服务的 IP
  • ETCD_INITIAL_ADVERTISE_PEER_URLS 填写每个 etcd 容器所在节点对外提供服务的 IP
  • ETCD_INITIAL_CLUSTER: ETCD 集群配置包含所有节点的名称和 ETCD_INITIAL_ADVERTISE_PEER_URLS 地址,我这里目前就一个节点
  • ETCD_INITIAL_CLUSTER_STATE:
    • new: 用于首次创建全新 etcd 集群,节点将根据初始配置启动集群。
    • existing: 用于扩展、重启或恢复已有的集群,节点将尝试加入现有集群,而不是重新初始化
$ mkdir -p /home/application/etcd/{data,config}$ cat  >> /home/application/etcd/docker-compose.yaml << EOF
version: '3'services:etcd:container_name: etcdimage: quay.srebro.site/coreos/etcd:v3.3.8environment:- ETCD_NAME=etcd- ETCD_DATA_DIR=/var/etcd- ETCD_LISTEN_CLIENT_URLS=http://0.0.0.0:2379- ETCD_ADVERTISE_CLIENT_URLS=http://172.22.33.213:2379- ETCD_LISTEN_PEER_URLS=http://0.0.0.0:2380- ETCD_INITIAL_ADVERTISE_PEER_URLS=http://172.22.33.213:2380- ETCD_INITIAL_CLUSTER_TOKEN=etcd-cluster- ETCD_INITIAL_CLUSTER=etcd=http://172.22.33.213:2380- ETCD_INITIAL_CLUSTER_STATE=new- ETCD_LOGGER=zap- ETCD_LOG_LeveL=info volumes:- /home/application/etcd/data:/var/etcd- "/etc/localtime:/etc/localtime:ro"ports:- 2379:2379- 2380:2380restart: alwaysnetworks:default:name: etcd-tierdriver: bridge
EOF

3.1.3 创建并启动 etcd 服务

$ cd /home/application/etcd/
$ docker-compose up -d
$ docker-compose ps
NAME                COMMAND                 SERVICE             STATUS              PORTS
etcd                "/usr/local/bin/etcd"   etcd                running             0.0.0.0:2379-2380->2379-2380/tcp, :::2379-2380->2379-2380/tcp

3.1.4 etcd 服务可用性测试

为了测试 etcd 服务的可用性,需要安装 etcd 客户端工具用于验证测试。

$ wget https://github.com/etcd-io/etcd/releases/download/v3.5.15/etcd-v3.5.15-linux-amd64.tar.gz
$ tar -xf etcd-v3.5.15-linux-amd64.tar.gz
$ cp etcd-v3.5.15-linux-amd64/etcdctl /usr/local/bin
$ chmod +x  /usr/local/bin/etcdctl#使用 etcdctl 工具快速检查指定的 etcd 节点(或节点集)的健康状态$ etcdctl --endpoints=172.22.33.213:2379 --write-out=table endpoint health+--------------------+--------+------------+-------+
|      ENDPOINT      | HEALTH |    TOOK    | ERROR |
+--------------------+--------+------------+-------+
| 172.22.33.213:2379 |   true | 3.035915ms |       |
+--------------------+--------+------------+-------+#使用 etcdctl 工具查看指定 etcd 节点(或节点集)当前的详细状态信息$ etcdctl  --endpoints=172.22.33.213:2379 --write-out=table endpoint status
+--------------------+------------------+---------+---------+-----------+------------+-----------+------------+--------------------+--------+
|      ENDPOINT      |        ID        | VERSION | DB SIZE | IS LEADER | IS LEARNER | RAFT TERM | RAFT INDEX | RAFT APPLIED INDEX | ERRORS |
+--------------------+------------------+---------+---------+-----------+------------+-----------+------------+--------------------+--------+
| 172.22.33.213:2379 | 8e9e05c52164694d |   3.3.8 |   26 MB |      true |      false |         2 |     659422 |                  0 |        |
+--------------------+------------------+---------+---------+-----------+------------+-----------+------------+--------------------+--------+#使用 etcdctl 工具验证测试 member$ etcdctl  --endpoints=172.22.33.213:2379 --write-out=table member list
+------------------+---------+------+-----------------------+---------------------------+------------+
|        ID        | STATUS  | NAME |      PEER ADDRS       |       CLIENT ADDRS        | IS LEARNER |
+------------------+---------+------+-----------------------+---------------------------+------------+
| 8e9e05c52164694d | started | etcd | http://localhost:2380 | http://172.22.33.213:2379 |      false |
+------------------+---------+------+-----------------------+---------------------------+------------+# etcdctl 工具验证测试数据读写
$ etcdctl  --endpoints=172.22.33.213:2379  put srebro.cn yyds
OK
$ etcdctl  --endpoints=172.22.33.213:2379 get srebro.cn
srebro.cn
yyds

3.2 etcd集群部署

PS: 请勿在K8S 集群中的机器上 使用docker-compose 去部署etcd集群 ,可能会存在子网冲突; 在条件允许的情况下,我们还是申请机器去单独部署etcd集群

3.2.1 环境准备

机器IP主机名etcd版本docker 版本docker-compose版本
172.22.33.210etcd-01v3.3.820.10.18v2.10.2
172.22.33.211etcd-02v3.3.820.10.18v2.10.2
172.22.33.212etcd-03v3.3.820.10.18v2.10.2

3.2.2 修改主机名,添加hosts解析

在每台主机上执行

设置主机名:
$ hostnamectl set-hostname etcd-01
$ hostnamectl set-hostname etcd-02
$ hostnamectl set-hostname etcd-03#在所有节点添加hosts:
$ cat >> /etc/hosts << EOF
172.22.33.210 etcd-01
172.22.33.212 etcd-02
172.22.33.212 etcd-03
EOF

3.2.3 创建etcd 工作目录,编写docker-compose 文件

172.22.33.210 etcd-01 主机上
每个节点内容不一样,需要分别编写。

mkdir -p /home/application/etcd/{data,config}cat  >> /home/application/etcd/docker-compose.yaml << EOF
version: '3'services:etcd:container_name: etcdimage: quay.srebro.site/coreos/etcd:v3.3.8environment:- ETCD_NAME=etcd01- ETCD_DATA_DIR=/var/etcd- ETCD_LISTEN_CLIENT_URLS=http://0.0.0.0:2379- ETCD_ADVERTISE_CLIENT_URLS=http://172.22.33.210:2379- ETCD_LISTEN_PEER_URLS=http://0.0.0.0:2380- ETCD_INITIAL_ADVERTISE_PEER_URLS=http://172.22.33.210:2380- ETCD_INITIAL_CLUSTER_TOKEN=etcd-cluster- ETCD_INITIAL_CLUSTER=etcd01=http://172.22.33.210:2380,etcd02=http://172.22.33.211:2380,etcd03=http://172.22.33.212:2380- ETCD_INITIAL_CLUSTER_STATE=new- ETCD_LOGGER=zap- ETCD_LOG_LeveL=info      volumes:- /home/application/etcd/data:/var/etcd- "/etc/localtime:/etc/localtime:ro"ports:- 2379:2379- 2380:2380restart: alwaysnetworks:default:name: etcd-tierdriver: bridge
EOF

172.22.33.211 etcd-02 主机上
每个节点内容不一样,需要分别编写。

mkdir -p /home/application/etcd/{data,config}cat  >> /home/application/etcd/docker-compose.yaml << EOF
version: '3'services:etcd:container_name: etcdimage: quay.srebro.site/coreos/etcd:v3.3.8environment:- ETCD_NAME=etcd02- ETCD_DATA_DIR=/var/etcd- ETCD_LISTEN_CLIENT_URLS=http://0.0.0.0:2379- ETCD_ADVERTISE_CLIENT_URLS=http://172.22.33.211:2379- ETCD_LISTEN_PEER_URLS=http://0.0.0.0:2380- ETCD_INITIAL_ADVERTISE_PEER_URLS=http://172.22.33.211:2380- ETCD_INITIAL_CLUSTER_TOKEN=etcd-cluster- ETCD_INITIAL_CLUSTER=etcd01=http://172.22.33.210:2380,etcd02=http://172.22.33.211:2380,etcd03=http://172.22.33.212:2380- ETCD_INITIAL_CLUSTER_STATE=new- ETCD_LOGGER=zap- ETCD_LOG_LeveL=info      volumes:- /home/application/etcd/data:/var/etcd- "/etc/localtime:/etc/localtime:ro"ports:- 2379:2379- 2380:2380restart: alwaysnetworks:default:name: etcd-tierdriver: bridge
EOF

172.22.33.212 etcd-03 主机上
每个节点内容不一样,需要分别编写。

mkdir -p /home/application/etcd/{data,config}cat  >> /home/application/etcd/docker-compose.yaml << EOF
version: '3'services:etcd:container_name: etcdimage: quay.srebro.site/coreos/etcd:v3.3.8environment:- ETCD_NAME=etcd03- ETCD_DATA_DIR=/var/etcd- ETCD_LISTEN_CLIENT_URLS=http://0.0.0.0:2379- ETCD_ADVERTISE_CLIENT_URLS=http://172.22.33.212:2379- ETCD_LISTEN_PEER_URLS=http://0.0.0.0:2380- ETCD_INITIAL_ADVERTISE_PEER_URLS=http://172.22.33.212:2380- ETCD_INITIAL_CLUSTER_TOKEN=etcd-cluster- ETCD_INITIAL_CLUSTER=etcd01=http://172.22.33.210:2380,etcd02=http://172.22.33.211:2380,etcd03=http://172.22.33.212:2380- ETCD_INITIAL_CLUSTER_STATE=new- ETCD_LOGGER=zap- ETCD_LOG_LeveL=info      volumes:- /home/application/etcd/data:/var/etcd- "/etc/localtime:/etc/localtime:ro"ports:- 2379:2379- 2380:2380restart: alwaysnetworks:default:name: etcd-tierdriver: bridgeEOF

3.2.4 创建并启动 etcd 服务

每台机器依次启动etcd 服务

$ cd /home/application/etcd/
$ docker-compose up -d
$ docker-compose ps
NAME                COMMAND                 SERVICE             STATUS              PORTS
etcd                "/usr/local/bin/etcd"   etcd                running             0.0.0.0:2379-2380->2379-2380/tcp, :::2379-2380->2379-2380/tcp

3.2.5 etcd 集群服务可用性测试

为了测试 etcd 集群服务的可用性,需要安装 etcd 客户端工具用于验证测试。

$ wget https://github.com/etcd-io/etcd/releases/download/v3.5.15/etcd-v3.5.15-linux-amd64.tar.gz
$ tar -xf etcd-v3.5.15-linux-amd64.tar.gz
$ cp etcd-v3.5.15-linux-amd64/etcdctl /usr/local/bin
$ chmod +x  /usr/local/bin/etcdctl#使用 etcdctl 工具快速检查指定的 etcd 节点(或节点集)的健康状态$ etcdctl --endpoints=172.22.33.210:2379,172.22.33.211:2379,172.22.33.212:2379 --write-out=table endpoint health+--------------------+--------+------------+-------+
|      ENDPOINT      | HEALTH |    TOOK    | ERROR |
+--------------------+--------+------------+-------+
| 172.22.33.210:2379 |   true | 3.035915ms |       |
| 172.22.33.211:2379 |   true | 3.035915ms |       |
| 172.22.33.212:2379 |   true | 3.035915ms |       |
+--------------------+--------+------------+-------+#使用 etcdctl 工具查看指定 etcd 节点(或节点集)当前的详细状态信息$ etcdctl --endpoints=172.22.33.210:2379,172.22.33.211:2379,172.22.33.212:2379 --write-out=table endpoint status
+--------------------+------------------+---------+---------+-----------+------------+-----------+------------+--------------------+--------+
|      ENDPOINT      |        ID        | VERSION | DB SIZE | IS LEADER | IS LEARNER | RAFT TERM | RAFT INDEX | RAFT APPLIED INDEX | ERRORS |
+--------------------+------------------+---------+---------+-----------+------------+-----------+------------+--------------------+--------+
| 172.22.33.210:2379 | 8e9e05c52164694d |   3.3.8 |   26 MB |      true |      false |         2 |     659422 |                  0 |        |
| 172.22.33.211:2379 | 0e95c521fdoi69ac |   3.3.8 |   26 MB |      false|     false |          2 |     659422 |                  0 |        |
| 172.22.33.212:2379 | pe9e05dfbrt64680 |   3.3.8 |   26 MB |      false|     false |          2 |     659422 |                  0 |        |
+--------------------+------------------+---------+---------+-----------+------------+-----------+------------+--------------------+--------+#使用 etcdctl 工具验证测试 member$ etcdctl  --endpoints=172.22.33.210:2379,172.22.33.211:2379,172.22.33.212:2379 --write-out=table member list
+------------------+---------+------+-----------------------+---------------------------+------------+
|        ID        | STATUS  | NAME |      PEER ADDRS       |       CLIENT ADDRS        | IS LEARNER |
+------------------+---------+------+-----------------------+---------------------------+------------+
| 8e9e05c52164694d | started | etcd | http://localhost:2380 | http://172.22.33.210:2379 |      true |
| 0e95c521fdoi69ac | started | etcd | http://localhost:2380 | http://172.22.33.211:2379 |      false|
| pe9e05dfbrt64680 | started | etcd | http://localhost:2380 | http://172.22.33.212:2379 |      false|
+------------------+---------+------+-----------------------+---------------------------+------------+# etcdctl 工具验证测试数据读写
$ etcdctl  --endpoints=172.22.33.210:2379,172.22.33.211:2379,172.22.33.212:2379  put srebro.cn hello
OK
$ etcdctl  --endpoints=172.22.33.210:2379,172.22.33.211:2379,172.22.33.212:2379 get srebro.cn
srebro.cn
hello

四、kubeadm 使用集群外etcd,部署K8S集群

kubeadm 安装过程省略,直接贴上kubeadm-init.yaml 配置文件;主要查看etcd 那块的配置;

另外需要注意,ETCD 集群 与 apiservice 之间通信,是否采用TLS 加密,我上面部署的etcd集群实则是没有采用TLS 加密的

apiVersion: kubeadm.k8s.io/v1beta3
bootstrapTokens:
- groups:- system:bootstrappers:kubeadm:default-node-tokentoken: 35sesk.5tm3tqc66tzlse8cttl: 24h0m0susages:- signing- authentication
kind: InitConfiguration
localAPIEndpoint:advertiseAddress: 172.22.33.220bindPort: 6443
nodeRegistration:criSocket: unix:///var/run/cri-dockerd.sockimagePullPolicy: IfNotPresentname: k8s-master01taints:- effect: NoSchedulekey: node-role.kubernetes.io/master
---
apiServer:certSANs:- kubernetes- kubernetes.default- kubernetes.default.svc- kubernetes.default.svc.cluster.local- 172.22.33.220- 112.11.11.11- k8s.srebro.cntimeoutForControlPlane: 4m0s
apiVersion: kubeadm.k8s.io/v1beta3
certificatesDir: /etc/kubernetes/pki
clusterName: kubernetes
controlPlaneEndpoint: 172.22.33.220:6443
controllerManager: {}
dns: {}
etcd:external:endpoints:- "http://172.22.33.210:2379"- "http://172.22.33.211:2379"- "http://172.22.33.212:2379"
imageRepository: registry.aliyuncs.com/google_containers
kind: ClusterConfiguration
kubernetesVersion: v1.24.9
networking:dnsDomain: cluster.localpodSubnet: 10.244.0.0/16serviceSubnet: 10.96.0.0/12
scheduler: {}
  • 不使用TLS 加密 ,需要配置如下内容:

image-20240825162139075

  • 如果需要使用TLS 加密 ,需要配置如下内容:

image-20240825162058429

五、参考

  • https://cloud.tencent.com/developer/article/2394695

来源于srebro.cn
© 版权声明
文章版权归作者所有,未经允许请勿转载。

这篇关于Kubernetes 外部 etcd 集群的快速 Docker Compose 部署指南的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1107792

相关文章

Python正则表达式匹配和替换的操作指南

《Python正则表达式匹配和替换的操作指南》正则表达式是处理文本的强大工具,Python通过re模块提供了完整的正则表达式功能,本文将通过代码示例详细介绍Python中的正则匹配和替换操作,需要的朋... 目录基础语法导入re模块基本元字符常用匹配方法1. re.match() - 从字符串开头匹配2.

通过Docker容器部署Python环境的全流程

《通过Docker容器部署Python环境的全流程》在现代化开发流程中,Docker因其轻量化、环境隔离和跨平台一致性的特性,已成为部署Python应用的标准工具,本文将详细演示如何通过Docker容... 目录引言一、docker与python的协同优势二、核心步骤详解三、进阶配置技巧四、生产环境最佳实践

Nginx部署HTTP/3的实现步骤

《Nginx部署HTTP/3的实现步骤》本文介绍了在Nginx中部署HTTP/3的详细步骤,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学... 目录前提条件第一步:安装必要的依赖库第二步:获取并构建 BoringSSL第三步:获取 Nginx

JavaScript中的高级调试方法全攻略指南

《JavaScript中的高级调试方法全攻略指南》什么是高级JavaScript调试技巧,它比console.log有何优势,如何使用断点调试定位问题,通过本文,我们将深入解答这些问题,带您从理论到实... 目录观点与案例结合观点1观点2观点3观点4观点5高级调试技巧详解实战案例断点调试:定位变量错误性能分

Java使用jar命令配置服务器端口的完整指南

《Java使用jar命令配置服务器端口的完整指南》本文将详细介绍如何使用java-jar命令启动应用,并重点讲解如何配置服务器端口,同时提供一个实用的Web工具来简化这一过程,希望对大家有所帮助... 目录1. Java Jar文件简介1.1 什么是Jar文件1.2 创建可执行Jar文件2. 使用java

Python实现精确小数计算的完全指南

《Python实现精确小数计算的完全指南》在金融计算、科学实验和工程领域,浮点数精度问题一直是开发者面临的重大挑战,本文将深入解析Python精确小数计算技术体系,感兴趣的小伙伴可以了解一下... 目录引言:小数精度问题的核心挑战一、浮点数精度问题分析1.1 浮点数精度陷阱1.2 浮点数误差来源二、基础解决

Java实现在Word文档中添加文本水印和图片水印的操作指南

《Java实现在Word文档中添加文本水印和图片水印的操作指南》在当今数字时代,文档的自动化处理与安全防护变得尤为重要,无论是为了保护版权、推广品牌,还是为了在文档中加入特定的标识,为Word文档添加... 目录引言Spire.Doc for Java:高效Word文档处理的利器代码实战:使用Java为Wo

使用docker搭建嵌入式Linux开发环境

《使用docker搭建嵌入式Linux开发环境》本文主要介绍了使用docker搭建嵌入式Linux开发环境,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面... 目录1、前言2、安装docker3、编写容器管理脚本4、创建容器1、前言在日常开发全志、rk等不同

从入门到精通详解Python虚拟环境完全指南

《从入门到精通详解Python虚拟环境完全指南》Python虚拟环境是一个独立的Python运行环境,它允许你为不同的项目创建隔离的Python环境,下面小编就来和大家详细介绍一下吧... 目录什么是python虚拟环境一、使用venv创建和管理虚拟环境1.1 创建虚拟环境1.2 激活虚拟环境1.3 验证虚

从基础到高级详解Python数值格式化输出的完全指南

《从基础到高级详解Python数值格式化输出的完全指南》在数据分析、金融计算和科学报告领域,数值格式化是提升可读性和专业性的关键技术,本文将深入解析Python中数值格式化输出的相关方法,感兴趣的小伙... 目录引言:数值格式化的核心价值一、基础格式化方法1.1 三种核心格式化方式对比1.2 基础格式化示例