利用K8S Statefulset搭建Etcd集群 - 本地存储

2024-03-25 05:28

本文主要是介绍利用K8S Statefulset搭建Etcd集群 - 本地存储,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

目录

  • 概述
  • 测试环境
  • yaml配置
    • service.yaml
    • cluster.yaml
  • Q&A
  • 参考链接

概述

公司因项目需要使用K8S部署ETCD集群供其他业务调用,网上搜索了解了下,一般K8S搭建ETCD集群大部分都是使用Etcd Operator来搭建。但是公司的项目运行在离线ARM架构平台,直接使用网上Etcd Operator代码,他们提供的镜像都是x86_64架构,经过Opeartor编译等尝试,最后都以失败告终。最后在Github上面找到一位大佬的开源代码,经过一通折腾,总算成功部署上了,故而博文记录,用于备忘

测试环境

minikube
Client Version: v1.29.3
Kustomize Version: v5.0.4-0.20230601165947-6ce0bf390ce3
Server Version: v1.28.3

yaml配置

service.yaml

apiVersion: v1
kind: Service
metadata:name: etcdsrv
spec:clusterIP: NonepublishNotReadyAddresses: trueports:- name: etcd-client-portprotocol: TCPport: 2379targetPort: 2379selector:name: etcd-operator

cluster.yaml

apiVersion: apps/v1
kind: StatefulSet
metadata:name: etcd0
spec:replicas: 1selector:matchLabels:name: etcd-operatorserviceName: etcdsrvtemplate:metadata:labels:name: etcd-operatorspec:containers:- name: appimage: quay.io/coreos/etcd:v3.5.9imagePullPolicy: AlwaysvolumeMounts:- mountPath: /data/etcd_dataname: etcd-volumecommand:- /usr/local/bin/etcd- --data-dir- /data/etcd_data- --auto-compaction-retention- '1'- --quota-backend-bytes- '8589934592'- --listen-client-urls- http://0.0.0.0:2379- --advertise-client-urls- http://etcd0-0.etcdsrv:2379- --listen-peer-urls- http://0.0.0.0:2380- --initial-advertise-peer-urls- http://etcd0-0.etcdsrv:2380- --initial-cluster-token- etcd-cluster- --initial-cluster- etcd0=http://etcd0-0.etcdsrv:2380,etcd1=http://etcd1-0.etcdsrv:2380,etcd2=http://etcd2-0.etcdsrv:2380- --initial-cluster-state- new- --enable-pprof- --election-timeout- '5000'- --heartbeat-interval- '250'- --name- etcd0- --logger- zapvolumes:- name: etcd-volumehostPath:path: /var/tmp/etcd0type: Directory
---
apiVersion: apps/v1
kind: StatefulSet
metadata:name: etcd1
spec:replicas: 1selector:matchLabels:name: etcd-operatorserviceName: etcdsrv #该名字需要和Service的name字段一致template:metadata:labels:name: etcd-operatorspec:containers:- name: appimage: quay.io/coreos/etcd:v3.5.9imagePullPolicy: AlwaysvolumeMounts:- mountPath: /data/etcd_data #该目录名称注意要对应修改name: etcd-volumecommand:- /usr/local/bin/etcd- --data-dir- /data/etcd_data - --auto-compaction-retention- '1'- --quota-backend-bytes- '8589934592'- --listen-client-urls- http://0.0.0.0:2379- --advertise-client-urls- http://etcd1-0.etcdsrv:2379- --listen-peer-urls- http://0.0.0.0:2380- --initial-advertise-peer-urls- http://etcd1-0.etcdsrv:2380- --initial-cluster-token- etcd-cluster- --initial-cluster- etcd0=http://etcd0-0.etcdsrv:2380,etcd1=http://etcd1-0.etcdsrv:2380,etcd2=http://etcd2-0.etcdsrv:2380- --initial-cluster-state- new- --enable-pprof- --election-timeout- '5000'- --heartbeat-interval- '250'- --name- etcd1- --logger- zapvolumes:- name: etcd-volumehostPath:path: /var/tmp/etcd1type: Directory
---
apiVersion: apps/v1
kind: StatefulSet
metadata:name: etcd2
spec:replicas: 1selector:matchLabels:name: etcd-operatorserviceName: etcdsrvtemplate:metadata:labels:name: etcd-operatorspec:containers:- name: appimage: quay.io/coreos/etcd:v3.5.9imagePullPolicy: AlwaysvolumeMounts:- mountPath: /data/etcd_dataname: etcd-volumecommand:- /usr/local/bin/etcd- --data-dir- /data/etcd_data- --auto-compaction-retention- '1'- --quota-backend-bytes- '8589934592'- --listen-client-urls- http://0.0.0.0:2379- --advertise-client-urls- http://etcd2-0.etcdsrv:2379- --listen-peer-urls- http://0.0.0.0:2380- --initial-advertise-peer-urls- http://etcd2-0.etcdsrv:2380- --initial-cluster-token- etcd-cluster- --initial-cluster- etcd0=http://etcd0-0.etcdsrv:2380,etcd1=http://etcd1-0.etcdsrv:2380,etcd2=http://etcd2-0.etcdsrv:2380- --initial-cluster-state- new- --enable-pprof- --election-timeout- '5000'- --heartbeat-interval- '250'- --name- etcd2- --logger- zapvolumes:- name: etcd-volumehostPath:path: /var/tmp/etcd2type: Directory

Q&A

Q: 第一次因为不熟悉,在大佬的基础上修改了service.yaml的name字段,然后部署后,各个Pod找不到对应主机导致集群失败
A:
Statefulset的serviceName要和service.yaml文件中的name字段一致才会生成对应规则的pod域名。Statefulset Pod域名的规则如下

$(statefulset-name)-$(ordinal-index).$(service-name).$(namespace).svc.cluster.local

按照规则域名,要访问etcd0的Pod,全域名需要使用
etcd0-0.etcdsrv.default.svc.cluster.local

因为k8s内部的/etc/resolv.conf一般会包含对应的search域,所以同一命名空间的访问域名可以简写成"etcd0-0.etcdsrv";不同命名空间的需要带上对应的命名空间,也就是"etcd0-0.etcdsrv.命名空间"

下面是其中一个Pod的/etc/resolv.conf

#default.svc.cluster.local中就是default就是当前命名空间,其他命名空间同理
root@ubuntutest:/# cat /etc/resolv.conf 
nameserver 10.96.0.10
search default.svc.cluster.local svc.cluster.local cluster.local localdomain
options ndots:5
root@ubuntutest:/# 

Q: 部署好服务后,执行kubctl get pod 发现看不到对应的服务信息
A: 因为kubectl get pod默认是获取default命名空间的服务信息,因为在实际部署的时候,yaml文件里面指定了命名空间,所以执行kubectl的时候,需要带上命名空间
所以正确的命令应该是

[root@192 ~]#kubectl -n 命名空间 get pod

Q: 修改了cluster.yaml文件的数据存储路径,然后导致容器启动失败,启动失败的原因是找不到目录
A: 因为我是使用minikube 部署的,minikube是启动了一个k8s的容器做节点,部署时候的路径映射,是映射minikube 容器里的路径,而不是物理机,故而需要执行下面操作

minikube ssh #进入Minikube容器
mkdir -p /{etcd0,etcd1,etcd2} #创建目录

Q: minikube start 因为镜像拉取超时导致启动失败
A: 对于国内用户,执行minikube start命令的时候,加上–image-mirror-country=‘cn’,不然默认会拉取国外的仓库,从而导致启动失败,完整命令如下

minikube start --image-mirror-country='cn'

参考链接

k8s-club/etcd-operator
k8s-StatefulSet
minikube拉取镜像失败、安装慢、无法启动apiserver,一条命令解决

这篇关于利用K8S Statefulset搭建Etcd集群 - 本地存储的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

0基础租个硬件玩deepseek,蓝耘元生代智算云|本地部署DeepSeek R1模型的操作流程

《0基础租个硬件玩deepseek,蓝耘元生代智算云|本地部署DeepSeekR1模型的操作流程》DeepSeekR1模型凭借其强大的自然语言处理能力,在未来具有广阔的应用前景,有望在多个领域发... 目录0基础租个硬件玩deepseek,蓝耘元生代智算云|本地部署DeepSeek R1模型,3步搞定一个应

一文教你使用Python实现本地分页

《一文教你使用Python实现本地分页》这篇文章主要为大家详细介绍了Python如何实现本地分页的算法,主要针对二级数据结构,文中的示例代码简洁易懂,有需要的小伙伴可以了解下... 在项目开发的过程中,遇到分页的第一页就展示大量的数据,导致前端列表加载展示的速度慢,所以需要在本地加入分页处理,把所有数据先放

本地搭建DeepSeek-R1、WebUI的完整过程及访问

《本地搭建DeepSeek-R1、WebUI的完整过程及访问》:本文主要介绍本地搭建DeepSeek-R1、WebUI的完整过程及访问的相关资料,DeepSeek-R1是一个开源的人工智能平台,主... 目录背景       搭建准备基础概念搭建过程访问对话测试总结背景       最近几年,人工智能技术

如何在本地部署 DeepSeek Janus Pro 文生图大模型

《如何在本地部署DeepSeekJanusPro文生图大模型》DeepSeekJanusPro模型在本地成功部署,支持图片理解和文生图功能,通过Gradio界面进行交互,展示了其强大的多模态处... 目录什么是 Janus Pro1. 安装 conda2. 创建 python 虚拟环境3. 克隆 janus

Redis存储的列表分页和检索的实现方法

《Redis存储的列表分页和检索的实现方法》在Redis中,列表(List)是一种有序的数据结构,通常用于存储一系列元素,由于列表是有序的,可以通过索引来访问元素,因此可以很方便地实现分页和检索功能,... 目录一、Redis 列表的基本操作二、分页实现三、检索实现3.1 方法 1:客户端过滤3.2 方法

本地私有化部署DeepSeek模型的详细教程

《本地私有化部署DeepSeek模型的详细教程》DeepSeek模型是一种强大的语言模型,本地私有化部署可以让用户在自己的环境中安全、高效地使用该模型,避免数据传输到外部带来的安全风险,同时也能根据自... 目录一、引言二、环境准备(一)硬件要求(二)软件要求(三)创建虚拟环境三、安装依赖库四、获取 Dee

deepseek本地部署使用步骤详解

《deepseek本地部署使用步骤详解》DeepSeek是一个开源的深度学习模型,支持自然语言处理和推荐系统,本地部署步骤包括克隆仓库、创建虚拟环境、安装依赖、配置模型和数据、启动服务、调试与优化以及... 目录环境要求部署步骤1. 克隆 DeepSeek 仓库2. 创建虚拟环境3. 安装依赖4. 配置模型

DeepSeek模型本地部署的详细教程

《DeepSeek模型本地部署的详细教程》DeepSeek作为一款开源且性能强大的大语言模型,提供了灵活的本地部署方案,让用户能够在本地环境中高效运行模型,同时保护数据隐私,在本地成功部署DeepSe... 目录一、环境准备(一)硬件需求(二)软件依赖二、安装Ollama三、下载并部署DeepSeek模型选

5分钟获取deepseek api并搭建简易问答应用

《5分钟获取deepseekapi并搭建简易问答应用》本文主要介绍了5分钟获取deepseekapi并搭建简易问答应用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需... 目录1、获取api2、获取base_url和chat_model3、配置模型参数方法一:终端中临时将加

C++中使用vector存储并遍历数据的基本步骤

《C++中使用vector存储并遍历数据的基本步骤》C++标准模板库(STL)提供了多种容器类型,包括顺序容器、关联容器、无序关联容器和容器适配器,每种容器都有其特定的用途和特性,:本文主要介绍C... 目录(1)容器及简要描述‌php顺序容器‌‌关联容器‌‌无序关联容器‌(基于哈希表):‌容器适配器‌:(