利用kubernetes中的leader选举机制来完成自己的HA应用

种地  金牌会员 | 2022-8-20 05:25:51 | 显示全部楼层 | 阅读模式
打印 上一主题 下一主题

主题 810|帖子 810|积分 2430

Backgroud

前一章中,对kubernetes的选举原理进行了深度剖析,下面就通过一个example来实现一个,利用kubernetes提供的选举机制完成的高可用应用。
对于此章需要提前对一些概念有所了解后才可以继续看下去

  • leader election mechanism
  • RBCA
  • Pod runtime mechanism
Implementation

代码实现

如果仅仅是使用Kubernetes中的锁,实现的代码也只有几行而已。
[code]package mainimport (        "context"        "flag"        "fmt"        "os"        "os/signal"        "syscall"        "time"        metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"        clientset "k8s.io/client-go/kubernetes"        "k8s.io/client-go/rest"        "k8s.io/client-go/tools/clientcmd"        "k8s.io/client-go/tools/leaderelection"        "k8s.io/client-go/tools/leaderelection/resourcelock"        "k8s.io/klog/v2")func buildConfig(kubeconfig string) (*rest.Config, error) {        if kubeconfig != "" {                cfg, err := clientcmd.BuildConfigFromFlags("", kubeconfig)                if err != nil {                        return nil, err                }                return cfg, nil        }        cfg, err := rest.InClusterConfig()        if err != nil {                return nil, err        }        return cfg, nil}func main() {        klog.InitFlags(nil)        var kubeconfig string        var leaseLockName string        var leaseLockNamespace string        var id string        // 初始化客户端的部分        flag.StringVar(&kubeconfig, "kubeconfig", "", "absolute path to the kubeconfig file")        flag.StringVar(&id, "id", "", "the holder identity name")        flag.StringVar(&leaseLockName, "lease-lock-name", "", "the lease lock resource name")        flag.StringVar(&leaseLockNamespace, "lease-lock-namespace", "", "the lease lock resource namespace")        flag.Parse()        if leaseLockName == "" {                klog.Fatal("unable to get lease lock resource name (missing lease-lock-name flag).")        }        if leaseLockNamespace == "" {                klog.Fatal("unable to get lease lock resource namespace (missing lease-lock-namespace flag).")        }        config, err := buildConfig(kubeconfig)        if err != nil {                klog.Fatal(err)        }        client := clientset.NewForConfigOrDie(config)        run := func(ctx context.Context) {                // 实现的业务逻辑,这里仅仅为实验,就直接打印了                klog.Info("Controller loop...")                for {                        fmt.Println("I am leader, I was working.")                        time.Sleep(time.Second * 5)                }        }        // use a Go context so we can tell the leaderelection code when we        // want to step down        ctx, cancel := context.WithCancel(context.Background())        defer cancel()        // 监听系统中断        ch := make(chan os.Signal, 1)        signal.Notify(ch, os.Interrupt, syscall.SIGTERM)        go func() {
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

种地

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表