使用Kubernetes搭建Etcd集群和WebUI教程指南

如题所述

第1个回答  2024-09-05

今天用这篇文章带大家在自己的电脑上搭建一个KubernetesEtcd集群,Kubernetes本身的功能就依赖Etcd实现,不过并不会开放给我们的程序使用,所以需要自己单独搭建。

Etcd现在是分布式服务架构中的重要组件,它由CNCF孵化托管,在微服务和Kubernates集群中不仅可以作为服务注册与发现,还是一个用于配置共享的分布式键值存储,采用raft算法,实现分布式系统数据的可用性和一致性。

一般用Go语言开发的gRPC服务会使用Etcd实现服务发现和注册。此外一些重要的配置也会存储在Etcd里通过让程序监听Key的变更来实现无需重启应用的配置更新。

关于为什么要使用Etcd我们不做过多介绍,现在切入正题。安装Etcd的方式比较多,如果想直接把Etcd集群安装在机器上而不是Kubernetes里可以通过goreman工具。不过因为我电脑上安装了Minikube,所以想尽量把所有东西都运行在Kubernetes里这样未来换电脑也就不用发愁需要安装那么多工具集了。除了演示在Kubernetes里安装运行Etcd集群外,还会安装一个Etcd的WebUI服务,让我们能够通过浏览器查询和设置Etcd的Key-Value,这个EtcdWebUI服务同样是运行在Kubernetes里,相信通过今天文章的学习你也一定感受到Kubernetes的便捷和学到不少知识。

准备工作

在开始跟着文章里的步骤安装Etcd前,需要先确保自己的电脑里安装了Minikube这个单节点Kubernetes集群。我以前的文章里有详细介绍过安装步骤,我把他放在这里供大家参考。

Minikube-运行在笔记本上的Kubernetes集群

Kubernetes安装Etcd

在Kubernetes里安装Etcd的方法有两种,一种是原始的通过StatefulSet控制器,也就是有状态应用来编排Etcd的节点,这种需要配置Pod使用的镜像,配置文件和启动命令。通过无头服务,在集群内部为Pod提供名称到IP的映射,以及NodePort类型的服务向集群外暴露客户端端口。还有一种是使用coreos提供EtcdOperator直接安装,很多细节都为我们直接处理好了。

在这里我们使用第一种用StatefulSet创建Etcd节点和Service对外暴露客户端端口的安装方式。

Service设置DNS和暴露端口

首先我们来创建为Etcd集群的Pod提供Pod名称到IP映射的无头服务。

---apiVersion:v1kind:Servicemetadata:name:etcdnamespace:etcdannotations:#Createendpointsalsoiftherelatedpodisn'treadyservice.alpha.kubernetes.io/tolerate-unready-endpoints:"true"spec:ports:-port:2379name:client-port:2380name:peerclusterIP:Noneselector:component:etcd

这里要创建的无头服务的名称是etcd。因为StatefulSet编排的Pod名称永远是PodName-序号,到时候集群内部各个Etcd节点配置的通信方式就可以用"PodName-序号.etcd:2380"这种形式来代替使用"节点IP:2380"。

2380是Etcd服务端的端口,而对外提供服务的客户端端口是2379,因此还需要有一个NodePort类型的Service向集群外部暴露客户端对2379端口的访问。

---apiVersion:v1kind:Servicemetadata:name:etcd-clientnamespace:etcdspec:ports:-name:httpnodePort:30453port:2379targetPort:2379protocol:TCPtype:NodePortselector:component:etcd

创建这两个Service:kubectlapply-fresources/services.yml-netcd

关于KubernetesService和StatefulSet的作用原理、各种配置的详细解释可以参考我公众号里以前的文章:

KubernetesService学习笔记和实践练习

深入理解StatefulSet,用Kubernetes编排有状态应用

配置Etcd节点Pod

我们通过StatefulSet编排创建3个Etcd节点的Pod,创建出来后上面的那两个Service会根据Pod的标签component=etcd找到它们,把节点加入到自己的服务端点列表中。

---apiVersion:apps/v1kind:StatefulSetmetadata:name:etcdlabels:component:etcdspec:serviceName:etcdreplicas:3selector:matchLabels:component:etcdtemplate:metadata:name:etcdlabels:component:etcdspec:volumes:-name:etcd-storageemptyDir:{}containers:-name:etcdimage:quay.io/coreos/etcd:latestports:-containerPort:2379name:client-containerPort:2380name:peervolumeMounts:-name:etcd-storagemountPath:/var/run/etcd/default.etcd

Pod的启动命令里要配置上每个节点点的IP和端口,上面说了无头服务的配置可以通过PodName-序号.etcd的方式解析出IP,这里对应的就是:

etcd-0.etcdetcd-1.etcdetcd-2.etcd

不过为了灵活性,我参考了国外一位网友分享的方式通过启动时执行shell脚本的方式,动态根据Etcd集群节点数量来设置启动命令里的PeersUrl等配置

env:-name:CLUSTER_SIZEvalue:"3"-name:SET_NAMEvalue:"etcd"-name:MINIKUBE_IPvalue:"$MINIKUBE_IP"-name:MINIKUBE_PORTvalue:"$MINIKUBE_PORT"command:-/bin/sh--ecx-|IP=$(hostname-i)PEERS=""foriin$(seq0$((${CLUSTER_SIZE}-1)));doPEERS="${PEERS}${PEERS:+,}${SET_NAME}-${i}=http://${SET_NAME}-${i}.${SET_NAME}:2380"doneexecetcd--name${HOSTNAME}\--listen-peer-urlshttp://${IP}:2380\--listen-client-urlshttp://${IP}:2379,http://127.0.0.1:2379\--advertise-client-urlshttp://${HOSTNAME}.${SET_NAME}:2379,http://${MINIKUBE_IP}:${MINIKUBE_PORT}\--initial-advertise-peer-urlshttp://${HOSTNAME}.${SET_NAME}:2380\--initial-cluster-tokenetcd-cluster-1\--initial-cluster${PEERS}\--initial-cluster-statenew\--data-dir/var/run/etcd/default.etcd

StatefulSet的创建命令为:

catresources/etcd.yml.tmpl|resources/config.bash|kubectlapply-netcd-f-

提供了一个shell脚本来设置MINIKUBEIP和MINIKUBE_IP和MINIKUBEIP和MINIKUBE_PORT这两个在容器里无法获得的环境变量。

创建Etcd集群所使用的yaml资源声明文件和具体的操作步骤都已经放到了Github上,大家可以按照里面的命令进行操作。

链接地址:https://github.com/kevinyan815/LearningKubernetes/tree/master/etcd

测试安装成果

测试安装是否成功也简单,观测Pod在Kubernetes里都正常启动起来后我们往Etcd里set一个键值,看能不能再查询出来就行了。

接下来我们在说说怎么给Etcd做个WebUI,毕竟一些为应用程序预准备的配置如果要用命令行一条条set进去的话也太麻烦了。

给Etcd集群做个WebUI

做这个WebUI,说来话长,花的时间比上面搭建Etcd集群多多了,大概花了两三天反复尝试才搞定。

WebUI我使用了e3w这个项目

项目地址:https://github.com/soyking/e3w

原本这个项目是有提供docker镜像和docker-compose容器编排运行的,不过我实在不想再在我电脑上安装这么多工具集了就一直想把它改造成能在Kubernetes里运行的方式。

看了下这个项目的源码,启动的时候会去读取/app/conf目录下的config.default.ini配置文件,WebUI服务的端口号默认配置的是8080,有了这两个信息后我们就可以通过Deployment创建Pod来放置WebUI服务,通过Service暴露WebUI服务供集群外部访问的端口了。

---apiVersion:apps/v1kind:Deploymentmetadata:name:e3w-deploymentnamespace:etcdlabels:app:e3wspec:replicas:1selector:matchLabels:app:etcd-client-e3wtemplate:metadata:labels:app:etcd-client-e3wspec:containers:-name:e3w-app-containerimage:soyking/e3w:latestports:-name:e3w-server-portcontainerPort:8080---kind:ServiceapiVersion:v1metadata:name:e3w-servicenamespace:etcdspec:type:NodePortselector:app:etcd-client-e3wports:-protocol:TCPtargetPort:e3w-server-portnodePort:30081port:80

至于配置文件,我的设想是把配置放到ConfigMap里,再把ConfigMap里的配置项作为文件挂载在原来配置文件的路径上。这样做的好处有两个:

不需要单独在机器上创建一个具体路径的配置文件,减少了Pod对宿主机上hostPath的依赖。

不需要按照e3w项目里推荐的自定义方式那样修改项目里的配置文件重新打Docker镜像才能连接上自己的Etcd集群。

下面ConfigMap里的e3w-config.default.ini就是我们要作为文件挂载到容器里的配置项。

apiVersion:v1kind:ConfigMapmetadata:name:e3w-configmapnamespace:etcdlabels:config:e3w.inidata:e3w-config.default.ini:|[app]port=8080auth=false[etcd]root_key=rootdir_value=addr=etcd-0.etcd.etcd.svc.cluster.local:2379,etcd-1.etcd.etcd.svc.cluster.local:2379,etcd-2.etcd.etcd.svc.cluster.local:2379username=password=cert_file=key_file=ca_file=

不过,在这一步上实属费了不少时间,主要是把ConfigMap的一个配置项作为文件挂载到容器里除了需要在volumeMounts.MountPath上配置完整的目录和文件名外还需要用上subPath这个配置。

spec:containers:volumeMounts:-name:e3w-configmap-volumemountPath:/app/conf/config.default.inisubPath:config.default.inivolumes:-name:e3w-configmap-volumeconfigMap:name:e3w-configmapitems:-key:e3w-config.default.inipath:config.default.ini

这又是一个小知识点,关于Volume挂载时subPath的应用场景等后面再说(大家想听的话下篇就安排,记得点赞啊)。

配置文件搞定后,再看一下Pod运行的状态,就不再是Error了。

上面创建的Etcd集群里的三个基点和e3w的WebUI服务都能正常运行。

通过WebUI我们可以查看Etcd集群的运行状态

以及更方便地通过UI界面管理Key-Value:

整体上感觉这个WebUI服务体验上还不错,很多功能都有。

EtcdWebUI服务的yaml定义文件我也放到了GitHub上,链接地址:github.com/kevinyan815…

总结

今天的文章,感觉前面安装Etcd集群的内容没有什么新鲜的知识,都是以前讲过的知识点的实际应用。在介绍安装EtcdWebUI服务时倒是用到了两个新的知识点,我们通过将configMap的某一个配置项作为配置文件挂载到容器里的方式既避免了修改e3w项目源代代码重新打Docker镜像,也避免了在宿主机上单独管理配置文件的麻烦。

作者:kevinyan著作权归作者所有。

logo设计

创造品牌价值

¥500元起

APP开发

量身定制,源码交付

¥2000元起

商标注册

一个好品牌从商标开始

¥1480元起

公司注册

注册公司全程代办

¥0元起

    官方电话官方服务
      官方网站八戒财税知识产权八戒服务商企业需求数字市场

相关了解……

你可能感兴趣的内容

大家正在搜

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 非常风气网