Golang 读取kubernets数据库etcd

文章目录

    • 1.背景
    • 2.环境准备
    • 3. Go访问etcd代码
    • 4. 访问结果

1.背景

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

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

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

Golang 读取kubernets数据库etcd_第1张图片
Golang 读取kubernets数据库etcd_第2张图片

2.环境准备

  • 操作系统ubuntu 22
  • k8s环境minikube v1.26.1
  • node节点信息
NAME STATUS ROLES IP VERSION
minikube Ready control-plane,master 192.168.49.2 v1.23.8
minikube-m02 Ready none 192.168.49.3 v1.23.8
minikube-m03 Ready none 192.168.49.4 v1.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所有键名
Golang 读取kubernets数据库etcd_第3张图片过滤键名
Golang 读取kubernets数据库etcd_第4张图片
TODO
优化对象数据展示

你可能感兴趣的:(Golang,K8S,数据库,golang,etcd)