added etcd support

This commit is contained in:
ston1th 2020-11-15 18:39:16 +01:00
commit 85a8ba23bd
21 changed files with 767 additions and 247 deletions

View file

@ -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)
}
/*