added raft over tls
This commit is contained in:
parent
b0d13076e0
commit
585baea183
16 changed files with 563 additions and 300 deletions
|
|
@ -4,20 +4,45 @@ 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/raft"
|
||||
"git.giftfish.de/ston1th/vipman/pkg/vip"
|
||||
"k8s.io/klog"
|
||||
"k8s.io/klog/klogr"
|
||||
)
|
||||
|
||||
var (
|
||||
configFile string
|
||||
version string
|
||||
)
|
||||
|
||||
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")
|
||||
|
|
@ -26,8 +51,95 @@ func main() {
|
|||
if err != nil {
|
||||
klog.Fatalf("Initialization failed: %s", err)
|
||||
}
|
||||
c, err := cluster.InitCluster(cluster.Callbacks{
|
||||
Leader: func(ctx context.Context, kv *cluster.KV) {
|
||||
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)
|
||||
}
|
||||
log := klogr.New()
|
||||
go func() {
|
||||
err = c.Start(log, cfg)
|
||||
if err != nil {
|
||||
klog.Fatalf("Initialization failed: %s", err)
|
||||
}
|
||||
}()
|
||||
go func() {
|
||||
sig := make(chan os.Signal)
|
||||
signal.Notify(sig, syscall.SIGHUP)
|
||||
for {
|
||||
<-sig
|
||||
c.Stepdown()
|
||||
}
|
||||
}()
|
||||
sigs := make(chan os.Signal)
|
||||
signal.Notify(sigs, syscall.SIGINT, syscall.SIGTERM)
|
||||
<-sigs
|
||||
c.Stop()
|
||||
DeleteIPs(n, cfg.VirtualIPs)
|
||||
}
|
||||
|
||||
/*
|
||||
c, err := raft.NewCluster(cluster.Callbacks{
|
||||
Leader: func(ctx context.Context, kv cluster.KV) {
|
||||
ticker := time.NewTicker(time.Second * 10)
|
||||
for {
|
||||
s := kv.Get("state")
|
||||
|
|
@ -47,7 +159,7 @@ func main() {
|
|||
}
|
||||
}
|
||||
},
|
||||
Follower: func(ctx context.Context, kv *cluster.KV) {
|
||||
Follower: func(ctx context.Context, kv cluster.KV) {
|
||||
ticker := time.NewTicker(time.Second * 2)
|
||||
for {
|
||||
s := kv.Get("state")
|
||||
|
|
@ -63,18 +175,4 @@ func main() {
|
|||
}
|
||||
},
|
||||
})
|
||||
if err != nil {
|
||||
klog.Fatalf("Initialization failed: %s", err)
|
||||
}
|
||||
log := klogr.New()
|
||||
go func() {
|
||||
err = c.StartRaftCluster(log, cfg)
|
||||
if err != nil {
|
||||
klog.Fatalf("Initialization failed: %s", err)
|
||||
}
|
||||
}()
|
||||
sigs := make(chan os.Signal)
|
||||
signal.Notify(sigs, syscall.SIGINT, syscall.SIGTERM)
|
||||
<-sigs
|
||||
c.Stop()
|
||||
}
|
||||
*/
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue