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

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

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

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

准备工作

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

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

Kubernetes 安装Etcd

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

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

Service 设置DNS和暴露端口

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

---
apiVersion: v1
kind: Service
metadata:name: etcdnamespace: etcdannotations:# Create endpoints also if the related pod isn't readyservice.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: v1
kind: Service
metadata:name: etcd-clientnamespace: etcd
spec:ports:- name: httpnodePort: 30453port: 2379targetPort: 2379protocol: TCPtype: NodePortselector:component: etcd

创建这两个Service:kubectl apply -f resources/services.yml -n etcd

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

Kubernetes Service学习笔记和实践练习

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

配置Etcd节点Pod

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

---
apiVersion: apps/v1
kind: StatefulSet
metadata:name: etcdlabels:component: etcd
spec: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.etcd
etcd-1.etcd
etcd-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=""for i in $(seq 0 $((${CLUSTER_SIZE} - 1))); doPEERS="${PEERS}${PEERS:+,}${SET_NAME}-${i}=http://${SET_NAME}-${i}.${SET_NAME}:2380"doneexec etcd --name ${HOSTNAME} \--listen-peer-urls http://${IP}:2380 \--listen-client-urls http://${IP}:2379,http://127.0.0.1:2379 \--advertise-client-urls http://${HOSTNAME}.${SET_NAME}:2379,http://${MINIKUBE_IP}:${MINIKUBE_PORT} \--initial-advertise-peer-urls http://${HOSTNAME}.${SET_NAME}:2380 \--initial-cluster-token etcd-cluster-1 \--initial-cluster ${PEERS} \--initial-cluster-state new \--data-dir /var/run/etcd/default.etcd

StatefulSet的创建命令为:

cat resources/etcd.yml.tmpl | resources/config.bash | kubectl apply -n etcd -f -

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

创建Etcd集群所使用的 yaml 资源声明文件和具体的操作步骤都已经放到了Github上,大家可以按照里面的命令进行操作。链接地址:https://github.com/kevinyan815/LearningKubernetes/tree/master/etcd

测试安装成果

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

用etcdctl 测试成果

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

给Etcd集群做个Web UI

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

Web UI我使用了 e3w 这个项目

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

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

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

---
apiVersion: apps/v1
kind: Deployment
metadata:name: e3w-deploymentnamespace: etcdlabels:app: e3w
spec: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: Service
apiVersion: v1
metadata:name: e3w-servicenamespace: etcd
spec:type: NodePortselector:app: etcd-client-e3wports:- protocol: TCPtargetPort: e3w-server-portnodePort: 30081port: 80

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

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

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

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

apiVersion: v1
kind: ConfigMap
metadata:name: e3w-configmapnamespace: etcdlabels:config: e3w.ini
data: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 & WebUI Pod

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

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

节点状态界面

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

键值管理界面

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

Etcd Web UI服务的 yaml 定义文件我也放到了GitHub上,链接地址:https://github.com/kevinyan815/LearningKubernetes/tree/master/e3w

总结

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

好了今天文章的内容就这么多,求关注,求三连,下期再见吧。拜拜~

用Kubernetes搭建Etcd集群和WebUI相关推荐

  1. Kubernetes 搭建 ES 集群(存储使用 local pv)

    推荐阅读 Helm3(K8S 资源对象管理工具)视频教程:https://edu.csdn.net/course/detail/32506 Helm3(K8S 资源对象管理工具)博客专栏:https: ...

  2. (通俗易懂~)Docker搭建Etcd集群

    (通俗易懂~)基于Docker的Etcd集群环境搭建 闲言碎语 Etcd简介 准备环境 第一步,下载Etc镜像 第二步,创建自定义Docker网络 第三步,创建并启动Etcd镜像节点 验证结果 完结撒 ...

  3. Kubernetes的ETCD集群备份、恢复

    首先,我们使用Kubernetes的都知道,etcd是k8s的核心所在,会记录各个pod的状态信息.所以重要性极为重要. etcd是kubernetes集群极为重要的一块服务,存储了kubernete ...

  4. Kubernetes 搭建 ES 集群(存储使用 cephfs)

    推荐阅读 Helm3(K8S 资源对象管理工具)视频教程:https://edu.csdn.net/course/detail/32506 Helm3(K8S 资源对象管理工具)博客专栏:https: ...

  5. 二进制搭建kubernetes多master集群【三、配置k8s master及高可用】

    前面两篇文章已经配置好了etcd和flannel的网络,现在开始配置k8s master集群. etcd集群配置参考:二进制搭建kubernetes多master集群[一.使用TLS证书搭建etcd集 ...

  6. etcd集群搭建和使用中常见的报错信息(热key探测系列教程)

    etcd的下载地址:https://github.com/etcd-io/etcd/releases 当前最新的v3.4.9,我之前用的时候包括目前京东热key线上都是用的3.4.6,下面主要是看一下 ...

  7. yum安装etcd集群

       前一篇文章介绍了如何yum安装简单的kubernetes集群,其中etcd是单点部署.本篇我们来搭建etcd集群,方便日后搭建kubernetes HA集群架构. 1,环境配置说明 etcd1 ...

  8. 使用kubeadm安装kubernetes高可用集群

    kubeadm安装kubernetes高可用集群搭建  第一步:首先搭建etcd集群 yum install -y etcd 配置文件 /etc/etcd/etcd.confETCD_NAME=inf ...

  9. Etcd教程 — 第二章 Etcd集群静态发现

    Etcd教程 - 第二章 Etcd集群静态发现 一.Etcd集群安装方式 二.Etcd集群静态发现 2.1 静态启动的方式 ※2.2 单机搭建Etcd集群 2.2.1 安装 goreman工具 2.2 ...

最新文章

  1. C# System.Guid.NewGuid() 格式化
  2. 支持字母数字下划线和中文的正则
  3. web复习day03:request
  4. python和docker交互_jupyter notebook 连接服务器docker中python环境
  5. An Introduction to Hashing in the Era of Machine Learning
  6. RPC与其实现方式概念笔记
  7. 高性能IO设计的Reactor和Proactor模式(转)
  8. 关闭窗口(window.close)
  9. oracle中spool导出数据小结
  10. json 文档拆分工具_如何把PDF多页文档拆为单页?快看高手私藏实用的技巧
  11. c++语言取整为什么要加0.5_蛋鸡饲料要加石粉,那你知道为什么加?要加什么石粉?我来告诉你...
  12. [JZOJ P1327] [DP]订货
  13. linux 文件与目录操作
  14. anaconda 卸载_Windows安装Anaconda使用教程
  15. 简单有用的jar包下载方法及地址
  16. 如何用数据驱动的广告效果
  17. 使用rsync实现文件同步
  18. java scp发送文件到服务器,Java实现往远程服务器传输文件
  19. 【华人学者风采】钱煦 加州大学圣地亚哥分校
  20. 【洛谷】P1001 A+B Problem

热门文章

  1. 内存泄露部分检测工具
  2. nginx unit
  3. 私有方法,私有属性在继承中的应用
  4. ZOJ2724_Windows Message Queue(STL/优先队列)
  5. Recurrent Neural Network系列1--RNN(循环神经网络)概述
  6. 状压DP UVA 10817 Headmaster's Headache
  7. Openfire性能优化与压力测试小结
  8. nginx 参数、变量和例子
  9. mac下使用Charles抓chrome包
  10. android: 记录及回复lisView的位置