利用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

相关文章

利用Python快速搭建Markdown笔记发布系统

《利用Python快速搭建Markdown笔记发布系统》这篇文章主要为大家详细介绍了使用Python生态的成熟工具,在30分钟内搭建一个支持Markdown渲染、分类标签、全文搜索的私有化知识发布系统... 目录引言:为什么要自建知识博客一、技术选型:极简主义开发栈二、系统架构设计三、核心代码实现(分步解析

python连接本地SQL server详细图文教程

《python连接本地SQLserver详细图文教程》在数据分析领域,经常需要从数据库中获取数据进行分析和处理,下面:本文主要介绍python连接本地SQLserver的相关资料,文中通过代码... 目录一.设置本地账号1.新建用户2.开启双重验证3,开启TCP/IP本地服务二js.python连接实例1.

Redis分片集群的实现

《Redis分片集群的实现》Redis分片集群是一种将Redis数据库分散到多个节点上的方式,以提供更高的性能和可伸缩性,本文主要介绍了Redis分片集群的实现,具有一定的参考价值,感兴趣的可以了解一... 目录1. Redis Cluster的核心概念哈希槽(Hash Slots)主从复制与故障转移2.

使用Python开发一个简单的本地图片服务器

《使用Python开发一个简单的本地图片服务器》本文介绍了如何结合wxPython构建的图形用户界面GUI和Python内建的Web服务器功能,在本地网络中搭建一个私人的,即开即用的网页相册,文中的示... 目录项目目标核心技术栈代码深度解析完整代码工作流程主要功能与优势潜在改进与思考运行结果总结你是否曾经

使用Python实现快速搭建本地HTTP服务器

《使用Python实现快速搭建本地HTTP服务器》:本文主要介绍如何使用Python快速搭建本地HTTP服务器,轻松实现一键HTTP文件共享,同时结合二维码技术,让访问更简单,感兴趣的小伙伴可以了... 目录1. 概述2. 快速搭建 HTTP 文件共享服务2.1 核心思路2.2 代码实现2.3 代码解读3.

MySQL双主搭建+keepalived高可用的实现

《MySQL双主搭建+keepalived高可用的实现》本文主要介绍了MySQL双主搭建+keepalived高可用的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,... 目录一、测试环境准备二、主从搭建1.创建复制用户2.创建复制关系3.开启复制,确认复制是否成功4.同

C# WinForms存储过程操作数据库的实例讲解

《C#WinForms存储过程操作数据库的实例讲解》:本文主要介绍C#WinForms存储过程操作数据库的实例,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、存储过程基础二、C# 调用流程1. 数据库连接配置2. 执行存储过程(增删改)3. 查询数据三、事务处

在java中如何将inputStream对象转换为File对象(不生成本地文件)

《在java中如何将inputStream对象转换为File对象(不生成本地文件)》:本文主要介绍在java中如何将inputStream对象转换为File对象(不生成本地文件),具有很好的参考价... 目录需求说明问题解决总结需求说明在后端中通过POI生成Excel文件流,将输出流(outputStre

SpringBoot配置Ollama实现本地部署DeepSeek

《SpringBoot配置Ollama实现本地部署DeepSeek》本文主要介绍了在本地环境中使用Ollama配置DeepSeek模型,并在IntelliJIDEA中创建一个Sprin... 目录前言详细步骤一、本地配置DeepSeek二、SpringBoot项目调用本地DeepSeek前言随着人工智能技

Oracle存储过程里操作BLOB的字节数据的办法

《Oracle存储过程里操作BLOB的字节数据的办法》该篇文章介绍了如何在Oracle存储过程中操作BLOB的字节数据,作者研究了如何获取BLOB的字节长度、如何使用DBMS_LOB包进行BLOB操作... 目录一、缘由二、办法2.1 基本操作2.2 DBMS_LOB包2.3 字节级操作与RAW数据类型2.