一、什麼是etcd
Etcd是一種分布式鍵值對數據庫,是由CoreOS開發的開源軟件,在Kubernetes、OpenStack等眾多雲計算平台上都被廣泛應用。Etcd採用Go語言編寫,提供了一種可靠的方式來存儲一些關鍵的數據,並且可以通過RESTful API方便地訪問和修改這些數據。Etcd在一個集群中維護了多個節點,所有節點都是平等的,支持讀寫分離和多租戶,同時也支持快照和複製等功能。
二、為什麼需要可視化工具
Etcd提供了一個可靠高效的存儲方式,但是對於用戶來說,直接在命令行維護和管理Etcd還是比較麻煩的,特別是在集群規模變大之後。因此,一些第三方開發者和組織提供了一些可視化的工具來方便管理和維護Etcd。
三、etcd可視化工具介紹
1. Etcd Web
Etcd Web是一個基於Web界面的Etcd管理工具,它提供了一套可視化的交互界面,使得開發者可以方便地查看和修改Etcd中的數據,以及進行用戶管理和集群狀態管理等操作。Etcd Web基於AngularJS和Bootstrap開發,並且使用了Restful接口來與Etcd集群進行通訊。
//etcd web代碼示例
<!DOCTYPE html>
<html ng-app="etcdWebApp">
<head>
<title>Etcd Web</title>
<link href="//maxcdn.bootstrapcdn.com/bootstrap/3.2.0/css/bootstrap.min.css" rel="stylesheet" type="text/css" />
<link href="//maxcdn.bootstrapcdn.com/font-awesome/4.1.0/css/font-awesome.min.css" rel="stylesheet" type="text/css" />
<link href="https://cdnjs.cloudflare.com/ajax/libs/angular-ui-tree/2.22.5/angular-ui-tree.min.css" rel="stylesheet" />
<link href="css/app.css" rel="stylesheet" type="text/css" />
<script src="//ajax.googleapis.com/ajax/libs/angularjs/1.2.26/angular.min.js"></script>
<script src="//ajax.googleapis.com/ajax/libs/angularjs/1.2.26/angular-route.min.js"></script>
<script src="//ajax.googleapis.com/ajax/libs/angularjs/1.2.26/angular-animate.min.js"></script>
<script src="//angular-ui.github.io/bootstrap/ui-bootstrap-tpls-0.11.2.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/angular-ui-tree/2.22.5/angular-ui-tree.min.js"></script>
<script src="js/app.js"></script>
</head>
<body ng-controller="mainController">
<div class="navbar navbar-default navbar-fixed-top" role="navigation">
<div class="container">
<div class="navbar-header">
<button type="button" class="navbar-toggle" data-toggle="collapse" data-target=".navbar-collapse">
<span class="sr-only">Toggle navigation</span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
</button>
<a class="navbar-brand" href="#">Etcd Web</a>
</div>
<div class="navbar-collapse collapse">
<ul class="nav navbar-nav">
<li ng-class="{ active: isRootPath() }"><a ng-href="/">Home</a></li>
<li ng-class="{ active: isNodePath() }"><a ng-href="#!/nodes">Nodes</a></li>
<li ng-class="{ active: isConfigPath() }"><a ng-href="#!/config">Config</a></li>
<li ng-class="{ active: isUsersPath() }"><a ng-href="#!/users">Users</a></li>
<li ng-class="{ active: isStatusPath() }"><a ng-href="#!/status">Status</a></li>
</ul>
</div>
</div>
</div>
<div ng-view></div>
</body>
</html>
2. Etcd-UI
Etcd-UI是一個基於Web界面的Etcd管理工具,它提供了多種視圖方式來查看和修改Etcd中的數據,支持直接操作JSON格式的數據,同時也支持摺疊式視圖和樹形視圖等操作。Etcd-UI使用Go語言編寫,並且提供了跨平台的可執行文件和Docker鏡像。
//etcd-UI代碼示例
package main
import (
"net/http"
"net/url"
"github.com/coreos/etcd/client"
"github.com/coreos/etcd/clientv3"
"go.etcd.io/etcd/clientv3/concurrency"
"go.etcd.io/etcd/clientv3/namespace"
"go.etcd.io/etcd/clientv3/naming/endpoints"
"go.etcd.io/etcd/clientv3/txn"
)
func main() {
// connect to etcd
endpoints, err := endpoints.NewEndpoints("http://127.0.0.1:2379")
if err != nil {
log.Fatal(err)
}
cfg := clientv3.Config{
Endpoints: []string{"http://127.0.0.1:2379"},
}
c, err := clientv3.New(cfg)
if err != nil {
log.Fatal(err)
}
kvs := client.NewKeysAPI(c)
kv := clientv3.NewKV(c)
lease := clientv3.NewLease(c)
watch := clientv3.NewWatcher(c)
txn := clientv3.NewKV(c).Txn(context.Background())
// create a mutex
session, err := concurrency.NewSession(c)
if err != nil {
log.Fatal(err)
}
mutex := concurrency.NewMutex(session, "/my_lock")
// use a namespace
ns := namespace.NewKV(clientv3.NewKV(c), "/my_prefix")
// use a transaction
txn.If(
clientv3.Compare(clientv3.Value("key"), "=", "old_value"),
).Then(
clientv3.OpPut("key", "new_value"),
).Else(
clientv3.OpGet("key"),
)
// watch a key
watcher := watch.Watch(context.Background(), "key", clientv3.WithPrefix())
// grant a lease
resp, err := lease.Grant(context.Background(), 10)
if err != nil {
log.Fatal(err)
}
leaseID := resp.ID
// write to etcd
_, err = kvs.Set(context.Background(), "key", "value", nil)
if err != nil {
log.Fatal(err)
}
// read from etcd
resp, err = kvs.Get(context.Background(), "key", nil)
if err != nil {
log.Fatal(err)
}
for _, pair := range resp.Node.Nodes {
log.Printf("%s: %s\n", pair.Key, pair.Value)
}
// use a transaction
_, err = kv.Txn(context.Background()).If(
clientv3.Compare(clientv3.CreateRevision("key"), ">", 0),
).Then(
clientv3.OpGet("key"),
).Commit()
if err != nil {
log.Fatal(err)
}
// revoke a lease
_, err = lease.Revoke(context.Background(), leaseID)
if err != nil {
log.Fatal(err)
}
}
3. Heptio Gimbal
Heptio Gimbal是一種初級的代理負載均衡器,它使用etcd作為後端存儲來管理和維護代理規則和服務發現等功能。Gimbal支持HTTP請求的負載均衡和路由,可以在多個集群之間進行負載均衡,並且支持HTTPS Termination。
//Heptio Gimbal代碼示例
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: gimbal-proxy
spec:
replicas: 1
template:
metadata:
labels:
app: gimbal-proxy
spec:
containers:
- name: proxy
image: heptio/gimbal-proxy:0.2.1
args: ["--config", "/etc/gimbal/config.yaml"]
volumeMounts:
- name: config-volume
mountPath: /etc/gimbal/
ports:
- name: http
containerPort: 80
- name: https
containerPort: 443
resources:
requests:
cpu: 100m
memory: 256Mi
volumes:
- name: config-volume
configMap:
name: gimbal-proxy-config
items:
- key: config.yaml
path: config.yaml
---
apiVersion: v1
kind: ConfigMap
metadata:
name: gimbal-proxy-config
data:
config.yaml: |
services:
- name: serviceA
protocol: http
endpoints:
- labelSelector:
matchLabels:
app: serviceA
port: 8080
- name: serviceB
protocol: http
endpoints:
- labelSelector:
matchLabels:
app: serviceB
port: 9090
listeners:
- name: http
protocol: http
bindAddr: ":80"
routes:
- prefix: /serviceA
service: serviceA
- prefix: /serviceB
service: serviceB
- name: https
protocol: http
bindAddr: ":443"
certPath: /etc/gimbal/certs/tls.crt
keyPath: /etc/gimbal/certs/tls.key
routes:
- prefix: /serviceA
service: serviceA
- prefix: /serviceB
service: serviceB
四、結論
Etcd可視化工具的出現,極大地方便了Etcd集群的管理和維護,開發者可以根據自己的需求選擇不同的工具,以方便更加高效地進行Etcd開發和調試。
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/155458.html
微信掃一掃
支付寶掃一掃