diff --git a/fs/etc/s6-overlay/s6-rc.d/haproxy/run b/fs/etc/s6-overlay/s6-rc.d/haproxy/run index b6367ac7..14f98f88 100644 --- a/fs/etc/s6-overlay/s6-rc.d/haproxy/run +++ b/fs/etc/s6-overlay/s6-rc.d/haproxy/run @@ -23,4 +23,5 @@ fi echo "Memory limit for HAProxy: ${MEMLIMIT}MiB" +# if master socket is changed, that needs to be aligned in pkg/haproxy/process/interface.go exec /usr/local/sbin/haproxy -W -db -m "${MEMLIMIT}" -S /var/run/haproxy-master.sock,level,admin -f /etc/haproxy/haproxy.cfg -f /etc/haproxy/haproxy-aux.cfg diff --git a/pkg/haproxy/process/interface.go b/pkg/haproxy/process/interface.go index be0f4272..60012507 100644 --- a/pkg/haproxy/process/interface.go +++ b/pkg/haproxy/process/interface.go @@ -13,6 +13,9 @@ import ( var logger = utils.GetLogger() +// MUST be the same as in fs/etc/s6-overlay/s6-rc.d/haproxy/run +const MASTER_SOCKET_PATH = "/var/run/haproxy-master.sock" //nolint:stylecheck + type Process interface { Service(action string) (err error) UseAuxFile(useAuxFile bool) @@ -22,16 +25,9 @@ type Process interface { func New(env env.Env, osArgs utils.OSArgs, auxCfgFile string, api api.HAProxyClient) (p Process) { //nolint:ireturn switch { case osArgs.UseWiths6Overlay: - p = &s6Control{ - Env: env, - OSArgs: osArgs, - API: api, - } + p = newS6Control(api, env, osArgs) case osArgs.UseWithPebble: - p = &pebbleControl{ - Env: env, - OSArgs: osArgs, - } + p = newPebbleControl(env, osArgs) default: p = &directControl{ Env: env, diff --git a/pkg/haproxy/process/pebble.go b/pkg/haproxy/process/pebble.go index 91467f29..5f90d4d5 100644 --- a/pkg/haproxy/process/pebble.go +++ b/pkg/haproxy/process/pebble.go @@ -1,18 +1,42 @@ package process import ( + "context" "fmt" "os" "os/exec" + "github.com/haproxytech/client-native/v5/runtime" + "github.com/haproxytech/client-native/v5/runtime/options" "github.com/haproxytech/kubernetes-ingress/pkg/haproxy/api" "github.com/haproxytech/kubernetes-ingress/pkg/haproxy/env" "github.com/haproxytech/kubernetes-ingress/pkg/utils" ) type pebbleControl struct { - Env env.Env - OSArgs utils.OSArgs + Env env.Env + OSArgs utils.OSArgs + masterSocket runtime.Runtime + masterSocketValid bool + logger utils.Logger +} + +func newPebbleControl(env env.Env, osArgs utils.OSArgs) *pebbleControl { + pb := pebbleControl{ + Env: env, + OSArgs: osArgs, + logger: utils.GetLogger(), + } + + masterSocket, err := runtime.New(context.Background(), options.MasterSocket(MASTER_SOCKET_PATH, 1)) + if err != nil { + pb.logger.Error(err) + return &pb + } + pb.masterSocketValid = true + pb.masterSocket = masterSocket + + return &pb } func (d *pebbleControl) Service(action string) error { @@ -30,6 +54,15 @@ func (d *pebbleControl) Service(action string) error { // no need to stop it (pebble) return nil case "reload": + if d.masterSocketValid { + msg, err := d.masterSocket.Reload() + if err != nil { + d.logger.Error(err) + } + d.logger.Debug("Reload done") + d.logger.Debug(msg) + return err + } cmd = exec.Command("pebble", "signal", "SIGUSR2", "haproxy") cmd.Stdout = os.Stdout cmd.Stderr = os.Stderr diff --git a/pkg/haproxy/process/s6-overlay.go b/pkg/haproxy/process/s6-overlay.go index 38b67000..2c977749 100644 --- a/pkg/haproxy/process/s6-overlay.go +++ b/pkg/haproxy/process/s6-overlay.go @@ -1,19 +1,44 @@ package process import ( + "context" "fmt" "os" "os/exec" + "github.com/haproxytech/client-native/v5/runtime" + "github.com/haproxytech/client-native/v5/runtime/options" "github.com/haproxytech/kubernetes-ingress/pkg/haproxy/api" "github.com/haproxytech/kubernetes-ingress/pkg/haproxy/env" "github.com/haproxytech/kubernetes-ingress/pkg/utils" ) type s6Control struct { - API api.HAProxyClient - Env env.Env - OSArgs utils.OSArgs + API api.HAProxyClient + Env env.Env + OSArgs utils.OSArgs + masterSocket runtime.Runtime + masterSocketValid bool + logger utils.Logger +} + +func newS6Control(api api.HAProxyClient, env env.Env, osArgs utils.OSArgs) *s6Control { + sc := s6Control{ + API: api, + Env: env, + OSArgs: osArgs, + logger: utils.GetLogger(), + } + + masterSocket, err := runtime.New(context.Background(), options.MasterSocket(MASTER_SOCKET_PATH, 1)) + if err != nil { + sc.logger.Error(err) + return &sc + } + sc.masterSocketValid = true + sc.masterSocket = masterSocket + + return &sc } func (d *s6Control) Service(action string) error { @@ -31,6 +56,15 @@ func (d *s6Control) Service(action string) error { // no need to stop it (s6) return nil case "reload": + if d.masterSocketValid { + msg, err := d.masterSocket.Reload() + if err != nil { + d.logger.Error(err) + } + d.logger.Debug(msg) + return err + } + cmd = exec.Command("s6-svc", "-2", "/run/service/haproxy") cmd.Stdout = os.Stdout cmd.Stderr = os.Stderr