added etcd support
This commit is contained in:
parent
59d44932a4
commit
85a8ba23bd
21 changed files with 767 additions and 247 deletions
|
|
@ -1,19 +1,17 @@
|
|||
package main
|
||||
|
||||
import (
|
||||
"context"
|
||||
"flag"
|
||||
"os"
|
||||
"os/exec"
|
||||
"os/signal"
|
||||
"path/filepath"
|
||||
"syscall"
|
||||
"time"
|
||||
|
||||
"git.giftfish.de/ston1th/vipman/pkg/cluster"
|
||||
"git.giftfish.de/ston1th/vipman/pkg/config"
|
||||
"git.giftfish.de/ston1th/vipman/pkg/controller"
|
||||
"git.giftfish.de/ston1th/vipman/pkg/etcd"
|
||||
"git.giftfish.de/ston1th/vipman/pkg/raft"
|
||||
"git.giftfish.de/ston1th/vipman/pkg/vip"
|
||||
"github.com/go-logr/logr"
|
||||
"k8s.io/klog/v2"
|
||||
"k8s.io/klog/v2/klogr"
|
||||
)
|
||||
|
|
@ -21,105 +19,40 @@ import (
|
|||
var (
|
||||
configFile string
|
||||
version string
|
||||
log logr.Logger
|
||||
)
|
||||
|
||||
func AddIPs(n *vip.Network, cidrs []string) error {
|
||||
for _, cidr := range cidrs {
|
||||
err := n.AddIP(cidr)
|
||||
if err != nil {
|
||||
klog.Infof("error adding ip %s to interface %s: %s", cidr, n.Interface(), err)
|
||||
}
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func DeleteIPs(n *vip.Network, cidrs []string) error {
|
||||
for _, cidr := range cidrs {
|
||||
err := n.DeleteIP(cidr)
|
||||
if err != nil {
|
||||
klog.Infof("error deleting ip %s from interface %s: %s", cidr, n.Interface(), err)
|
||||
}
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func main() {
|
||||
klog.InitFlags(nil)
|
||||
flag.StringVar(&configFile, "config", "vipman.yaml", "vipman config file")
|
||||
flag.Parse()
|
||||
log = klogr.New().WithName("main")
|
||||
log.Info("starting vipman", "version", version)
|
||||
cfg, err := config.ParseFile(configFile)
|
||||
if err != nil {
|
||||
klog.Fatalf("Initialization failed: %s", err)
|
||||
klog.Fatalf("init failed: %s", err)
|
||||
}
|
||||
n, err := vip.NewNetworkWithLabel(cfg.Interface, cfg.IPLabel)
|
||||
if err != nil {
|
||||
klog.Fatalf("Initialization failed: %s", err)
|
||||
}
|
||||
cc := cfg.Cluster.Raft
|
||||
|
||||
c, err := raft.NewCluster(cluster.Callbacks{
|
||||
Leader: func(ctx context.Context, _ cluster.KV) {
|
||||
t := time.NewTicker(time.Second * 10)
|
||||
if cfg.LeaderHook != "" {
|
||||
if !filepath.IsAbs(cfg.LeaderHook) {
|
||||
klog.Infof("error running leaderHook %s: path is not absolute", cfg.LeaderHook)
|
||||
} else {
|
||||
go func() {
|
||||
err := exec.CommandContext(ctx, cfg.LeaderHook).Run()
|
||||
if err != nil {
|
||||
klog.Infof("error running leaderHook %s: %s", cfg.LeaderHook, err)
|
||||
}
|
||||
}()
|
||||
}
|
||||
}
|
||||
for {
|
||||
klog.Infof("[%s] leading", cc.ID)
|
||||
AddIPs(n, cfg.VirtualIPs)
|
||||
select {
|
||||
case <-ctx.Done():
|
||||
t.Stop()
|
||||
DeleteIPs(n, cfg.VirtualIPs)
|
||||
klog.Infof("[%s] leading canceled", cc.ID)
|
||||
return
|
||||
case <-t.C:
|
||||
}
|
||||
}
|
||||
},
|
||||
Follower: func(ctx context.Context, _ cluster.KV) {
|
||||
t := time.NewTicker(time.Second * 10)
|
||||
if cfg.FollowerHook != "" {
|
||||
if !filepath.IsAbs(cfg.FollowerHook) {
|
||||
klog.Infof("error running followerHook %s: path is not absolute", cfg.FollowerHook)
|
||||
} else {
|
||||
go func() {
|
||||
err := exec.CommandContext(ctx, cfg.FollowerHook).Run()
|
||||
if err != nil {
|
||||
klog.Infof("error running FollowerHook %s: %s", cfg.FollowerHook, err)
|
||||
}
|
||||
}()
|
||||
}
|
||||
}
|
||||
for {
|
||||
klog.Infof("[%s] following", cc.ID)
|
||||
//DeleteIPs(n, cfg.VirtualIPs)
|
||||
select {
|
||||
case <-ctx.Done():
|
||||
t.Stop()
|
||||
klog.Infof("[%s] following canceled", cc.ID)
|
||||
return
|
||||
case <-t.C:
|
||||
}
|
||||
}
|
||||
},
|
||||
})
|
||||
if err != nil {
|
||||
klog.Fatalf("Initialization failed: %s", err)
|
||||
var c cluster.Cluster
|
||||
if cfg.Cluster.Raft != nil {
|
||||
log.Info("creating cluster", "mode", "raft")
|
||||
c = raft.NewCluster(klogr.New().WithName("raft"))
|
||||
} else if cfg.Cluster.Etcd != nil {
|
||||
log.Info("creating cluster", "mode", "etcd")
|
||||
c = etcd.NewCluster(klogr.New().WithName("etcd"))
|
||||
}
|
||||
callbacks, err := controller.NewVIPController(cfg)
|
||||
if err != nil {
|
||||
klog.Fatalf("init failed: %s", err)
|
||||
}
|
||||
err = c.SetCallbacks(callbacks)
|
||||
if err != nil {
|
||||
klog.Fatalf("init failed: %s", err)
|
||||
}
|
||||
log := klogr.New()
|
||||
go func() {
|
||||
err = c.Start(log, cfg)
|
||||
err = c.Start(cfg)
|
||||
if err != nil {
|
||||
klog.Fatalf("Initialization failed: %s", err)
|
||||
klog.Fatalf("init failed: %s", err)
|
||||
}
|
||||
}()
|
||||
go func() {
|
||||
|
|
@ -133,8 +66,9 @@ func main() {
|
|||
sigs := make(chan os.Signal)
|
||||
signal.Notify(sigs, syscall.SIGINT, syscall.SIGTERM)
|
||||
<-sigs
|
||||
log.Info("stopping vipman")
|
||||
c.Stop()
|
||||
DeleteIPs(n, cfg.VirtualIPs)
|
||||
//DeleteIPs(n, cfg.VirtualIPs)
|
||||
}
|
||||
|
||||
/*
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue