Golang 读取kubernets数据库etcd

4 篇文章 0 订阅

1.背景

参考链接:
- 1. [译]走进Kubernetes集群的大脑:Etcd
- 2. Kubernetes架构图

最近学习K8S架构,参考了一些资料,了解到几个组件都通过apiserver对接,etcd作为apiserver后端数据库,了解下工作原理。用go写了简单的客户端读取etcd内容

图片来源以上两个参考链接

在这里插入图片描述
在这里插入图片描述

2.环境准备

  • 操作系统ubuntu 22
  • k8s环境minikube v1.26.1
  • node节点信息
NAMESTATUSROLESIPVERSION
minikubeReadycontrol-plane,master192.168.49.2v1.23.8
minikube-m02Readynone192.168.49.3v1.23.8
minikube-m03Readynone192.168.49.4v1.23.8

获取etcd根证书,服务器证书和私钥

# 先查看etcd证书路径
kubectl describe pods --namespace kube-system etcd-minikube | grep etcd-certs: -A 3
#   etcd-certs:
#     Type:          HostPath (bare host directory volume)
#     Path:          /var/lib/minikube/certs/etcd
#     HostPathType:  DirectoryOrCreate
# 登录进控制节点机器拷贝证书出来
minikube ssh -n minikube
# docker@minikube:
cd /var/lib/minikube/certs/etcd
# 拷贝ca.crt server.crt server.key 到真实机器
scp ca.crt 用户名@本机IP

3. Go访问etcd代码

参考链接1中使用 etcdctl 访问,这里学习下go操作etcd方法,所以自己码了个代码
上一步证书放到程序目录

package main

import (
	"context"
	"crypto/tls"
	"crypto/x509"
	"flag"
	"fmt"
	"io/ioutil"
	"strings"
	"time"

	clientv3 "go.etcd.io/etcd/client/v3"
)

func checkErr(err error) {
	if err != nil {
		panic(err)
	}
}

func main() {
	listName := flag.Bool("list-name", false, "查看所有存储键名")
	prefix := flag.String("prefix", "", "列出给定字符开头的内容")
	endPoint := flag.String("endpoint", "https://192.168.49.2:2379", "etcd服务地址")
	flag.Parse()

	// 使用etcd根证书认证
	caCert, err := ioutil.ReadFile("ca.crt")
	checkErr(err)
	caCertPool := x509.NewCertPool()
	caCertPool.AppendCertsFromPEM(caCert)
	serverCert, err := tls.LoadX509KeyPair("server.crt", "server.key")
	checkErr(err)

	client, err := clientv3.New(clientv3.Config{
		Endpoints:   []string{*endPoint},
		DialTimeout: 5 * time.Second,
		TLS: &tls.Config{
			RootCAs:      caCertPool,
			Certificates: []tls.Certificate{serverCert},
		},
	})

	checkErr(err)
	defer client.Close()

	ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second)
	resp, err := client.Get(ctx, "", clientv3.WithPrefix())
	checkErr(err)
	cancel()

	for _, r := range resp.Kvs {
		if *listName {
			fmt.Println(string(r.Key))
			continue
		}
		if strings.Contains(string(r.Key), *prefix) {
			fmt.Println(string(r.Key))
			fmt.Println("-------------------------------------------------------------------------------")
			fmt.Println(string(r.Value))
			fmt.Println("-------------------------------------------------------------------------------")
			fmt.Println()
		}
	}
	checkErr(err)
}

4. 访问结果

获取etcd所有键名
在这里插入图片描述过滤键名
在这里插入图片描述
TODO
优化对象数据展示

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值