0
点赞
收藏
分享

微信扫一扫

F5 对接 etcd 实现服务发现

作者:熊平

职务:F5 软件架构师


概述

企业的数字化转型离不开应用的现代化,分布式和微服务架构是未来应用架构转型的主要形态。大多数现代应用都使用某种服务注册中心(service registry),etcd 是一种广泛使用的注册中心和分布式键值存储设施,业界最为知名的软件平台Kubernetes 也使用 etcd 作为重要的组件。


本文是“利用 F5 交付现代应用”系列的第七篇,对接 etcd。简要介绍 etcd 以及 raft 一致性算法,并将详细演示如何通过 MSDA-etcd 插件赋予 F5 服务发现的能力。


虽然文中演示基于 etcdv3,但我们同样为 etcdv2 提供了类似的插件,操作方面体验也基本一致。


etcd 简介

etcd (https://etcd.io)是一种高度一致的分布式键值存储,它提供了一种可靠的方式来存储需要由分布式系统或计算机集群访问的数据。它在网络分区期间优雅地处理领导选举,并且可以容忍机器故障,即使在领导节点中也是如此。


和众多的新兴分布式协调设施一样(https://raft.github.io/#implementations),etcd 通过 RAFT 一致性算法(consensus algorithm)确保数据的一致性。Raft(https://raft.github.io)是一种易于理解的共识算法。它在容错性和性能方面与 Paxos 相当。不同之处在于,它被分解为相对独立的子问题,并且清晰地解决了实际系统所需的所有主要部分。

F5 对接 etcd 实现服务发现_服务发现

编辑搜图

Raft 算法模拟(图片来自https://raft.github.io)


ectd 特点鲜明

  1. 接口简单,使用标准的
  2. 键值存储,将数据存储在分层组织的目录中,如标准文件系统中
  3. 监控变化,观察特定键或目录的更改,并对值的更改作出反应



通过


有很多工具和客户端库可以管理和访问etcd(​​​https://etcd.io/docs/v3.4/integrations/​​ ),我们可以使用 etcd 自带的 etcdctl 命令行工具简单演示一下。


使用 put 和 get 命令访问etcd:


F5 对接 etcd 实现服务发现_服务发现_02


put和get 命令访问etcd(图片来自 https://etcd.io/docs/v3.4/demo/)


使用 delete 命令删除键值:

删除键值(图片来自 https://etcd.io/docs/v3.4/demo/)​


使用 watch 命令监控变化:

F5 对接 etcd 实现服务发现_微服务_03

编辑搜图

watch 特定键值(图片来自 https://etcd.io/docs/v3.4/demo/)


由于 Kubernetes 也使用 etcd 作为分布式键值存储,我们也可以通过 etcdctl 直接查看 kubernetes 中的对象,例如,通过下列命令可以直接查看 hello-minikube 的 endpoints信息:

F5 对接 etcd 实现服务发现_服务发现_04

编辑搜图

使用 etcdctl 直接查看 k8s endpoints


如果希望了解更多操作实践,可以访问 etcd 的演示网站:

​​http://play.etcd.io/play​​。

F5 对接 etcd 实现服务发现

1

融入微服务架构,F5 支持服务发现和服务注册

为了支持企业应用的微服务化改造,我们在F5的InnovateF5创新孵化平台的支持下,开发了一组BIG-IP的插件,对接业界主流的各种服务注册中心,将BIG-IP融入企业的微服务架构。为企业提供更加稳定、高效、智能的应用交付服务。企业可以采用统一的平台交付传统应用和现代化应用,实现应用架构平滑稳定地转型。

F5 对接 etcd 实现服务发现_f5_05

编辑搜图

统一应用交付平台


到目前为止,我们已经实现的插件如下,其中 MSDA 代表服务发现插件,MSRA 代表服务注册插件:

F5 对接 etcd 实现服务发现_服务发现_06

编辑搜图

插件项目


接下来我们将演示如何使用 MSDA-etcdv3 与 etcdv3 版本的对接实现服务的自动发现。


2

F5 BIG-IP对接etcd操作实践

2.1 部署 ectd 集群


参考 etcd 官方文档安装 etcd 集群,出于演示的目的,亦可使用集成在 Kubernetes 中的 etcd 集群。

etcd 官方文档安装 etcd 集群链接

​​https://etcd.io/docs/v3.5/install/​​


2.2 安装 MSDA-etcd3 插件

通过 F5 管理界面直接导入 iApp LX 软件安装包,在 TMUI 界面中,选择 iApps >> Package Management LX >> import,选择f5-iapplx-msda-etcdv3 rpm文件:

F5 对接 etcd 实现服务发现_etcd_07

编辑搜图导入rpm安装包


安装完成后,可以见到 f5-iapplx-msda-etcdv3 的 iapp 模板:编辑搜图

F5 对接 etcd 实现服务发现_f5_08

iApps LX 模板


如果没有条件使用TMUI图形界面,可以参考下列文档通过Restful API 安装 rpm 安装包:

01.将 RPM 复制到安装目录

如果目标系统与生成系统相同,只需复制文件。对于远程设备,您需要使用安全复制命令。确保RPM位于目标系统上的 /var/config/rest/downloads 目录中。

scp f5-iapplx-msda-etcdv3-0.0.2-0003.noarch.rpm root@{Mgmt-IP}:/var/config/rest/downloads/


02.安装 rpm 文件包

复制后,您现在可以通过

curl -u user:pass -X POST http://localhost:8100/mgmt/shared/iapp/package-management-tasks -d '{ "operation":"INSTALL","packageFilePath": "/var/config/rest/downloads/ f5-iapplx-msda-etcdv3-0.0.2-0003.noarch.rpm"}'


2.3 配置 Applications LX 应用


为了配置 F5 使用 MSDA-etcdv3 自动发现 etcd 上的服务,需要准备的信息如下:

1

Etcd 端点信息,即 etcd 集群的访问入口

2

认证信息,通常采用证书认证

3

Etcd 相关服务的路径

4

F5 上的相关配置,例如:pool 名称、负载均衡算法以及健康检查方式等。


在实际部署环境中,etcd 通常使用证书认证,因此首先导出认证相关的证书,并以 base64 保存。以 kubernetes 内置的etcd 为例:

$ cat /etc/kubernetes/pki/etcd/ca.crt | base64 -w 0 > etcd-ca-b64

$ cat /etc/kubernetes/pki/etcd/server.crt | base64 -w 0 > etcd-servercrt-b64

$ sudo cat /etc/kubernetes/pki/etcd/server.key | base64 -w 0 > etcd-serverkey-b64


上述信息准备就绪后,即可通过 Applications LX 配置 MSDA-etcdv3 的相关信息:进入菜单 iApps >> Application Services >> Applications LX >> Create


F5 对接 etcd 实现服务发现_f5_09

编辑搜图

选择模板新建应用服务

输入名称,例如 msda-dtcdv3-demo,选择模板 msdaetcdv3,点击“next”;


F5 对接 etcd 实现服务发现_微服务_10

编辑搜图

输入相关字段信息

填写表格中的相关信息:etcd 端点信息、认证证书、etcd 中监控的服务名称以及 F5 中的 pool 名称、负载均衡算法以及健康检测方式。


完成输入后,点击“deploy”,完成部署,状态显示为绿色。

F5 对接 etcd 实现服务发现_键值_11

编辑搜图

完成部署


观察 F5 pool信息,BIG-IP已经自动建立了名为“etcdv3SamplePool”的 pool,并且自动配置好发现的相关服务成员:


F5 对接 etcd 实现服务发现_服务发现_12

编辑搜图

自动生成


2.4 操作插入、更新、删除 etcd 记录


接下来我们通过

01.配置环境变量,简化命令输入

root@k8smaster:/# root@k8smaster:/# export ETCDCTL_API=3root@k8smaster:/# export ETCDCTL_DIAL_TIMEOUT=3sroot@k8smaster:/# export ETCDCTL_CACERT=/etc/kubernetes/pki/etcd/ca.crtroot@k8smaster:/# export ETCDCTL_CERT=/etc/kubernetes/pki/etcd/server.crtroot@k8smaster:/# export ETCDCTL_KEY=/etc/kubernetes/pki/etcd/server.keyroot@k8smaster:/#


02.检查相关服务信息

root@k8smaster:/# root@k8smaster:/# etcdctl get /msdademo/http/msdademo/http10.1.10.66:8080, 10.1.10.77:8080, 10.1.10.99:8080root@k8smaster:/#

03.修改服务的键值信息,增加10.1.10.88:8080

root@k8smaster:/# root@k8smaster:/# etcdctl put /msdademo/http "10.1.10.66:8080, 10.1.10.77:8080, 10.1.10.88:8080, 10.1.10.99:8080"OKroot@k8smaster:/# root@k8smaster:/# etcdctl get /msdademo/http/msdademo/http10.1.10.66:8080, 10.1.10.77:8080, 10.1.10.88:8080, 10.1.10.99:8080root@k8smaster:/#


04.检查 F5 上 pool 配置,自动新增了10.1.10.88:8080的 member

新增

05.修改服务的键值信息,删除 10.1.10.99:8080

root@k8smaster:/# root@k8smaster:/# etcdctl put /msdademo/http "10.1.10.66:8080, 10.1.10.77:8080, 10.1.10.88:8080"OKroot@k8smaster:/# root@k8smaster:/# root@k8smaster:/# etcdctl get /msdademo/http/msdademo/http10.1.10.66:8080, 10.1.10.77:8080, 10.1.10.88:8080root@k8smaster:/# root@k8smaster:/#


06.检查 F5 上 pool 配置,自动删除了 10.1.10.99:8080 的 member

F5 对接 etcd 实现服务发现_服务发现_13

编辑搜图

删除member

07.删除服务的键/msdademo/http

root@k8smaster:/# root@k8smaster:/# etcdctl del /msdademo/http1root@k8smaster:/# root@k8smaster:/# etcdctl get /msdademo/httproot@k8smaster:/#


08.检查 F5 上 pool 配置,自动删除了所有 member

F5 对接 etcd 实现服务发现_f5_14


删除所有 member

09.修改服务的键值信息,增加 3 个 member

root@k8smaster:/# root@k8smaster:/# etcdctl put /msdademo/http "10.1.10.66:8080, 10.1.10.77:8080, 10.1.10.99:8080"OKroot@k8smaster:/# root@k8smaster:/# etcdctl get /msdademo/http/msdademo/http10.1.10.66:8080, 10.1.10.77:8080, 10.1.10.99:8080root@k8smaster:/#


10.检查 F5 上 pool 配置,自动新建了所有 member



总结


通过以上演示可以发现,MSDA 插件赋予 F5 设备自动发现的能力,可以主动与 etcd 进行沟通,观察相关服务的变化,并且快速更新 F5 上的相关配置,提高了效率,减少了摩擦。


大多数企业都面临应用架构转型的挑战,而使用注册中心的微服务架构是未来的主要应用架构之一。使用 F5 应用交付设施,配合 MSDA 可以让企业平滑地进行架构的迁移,确保业务系统的稳定运行,实现“架构无关”的部署模型,提高了团队效能、降低运维成本。


举报

相关推荐

0 条评论