talos

Форк
0
/
loadbalancer.go 
72 строки · 1.8 Кб
1
// This Source Code Form is subject to the terms of the Mozilla Public
2
// License, v. 2.0. If a copy of the MPL was not distributed with this
3
// file, You can obtain one at http://mozilla.org/MPL/2.0/.
4

5
package vm
6

7
import (
8
	"fmt"
9
	"os"
10
	"os/exec"
11
	"strconv"
12
	"strings"
13
	"syscall"
14

15
	"github.com/siderolabs/gen/xslices"
16

17
	"github.com/siderolabs/talos/pkg/provision"
18
)
19

20
const (
21
	lbPid = "lb.pid"
22
	lbLog = "lb.log"
23
)
24

25
// CreateLoadBalancer creates load balancer.
26
func (p *Provisioner) CreateLoadBalancer(state *State, clusterReq provision.ClusterRequest) error {
27
	pidPath := state.GetRelativePath(lbPid)
28

29
	logFile, err := os.OpenFile(state.GetRelativePath(lbLog), os.O_APPEND|os.O_CREATE|os.O_RDWR, 0o666)
30
	if err != nil {
31
		return err
32
	}
33

34
	defer logFile.Close() //nolint:errcheck
35

36
	controlPlaneIPs := xslices.Map(clusterReq.Nodes.ControlPlaneNodes(), func(req provision.NodeRequest) string { return req.IPs[0].String() })
37
	ports := xslices.Map(clusterReq.Network.LoadBalancerPorts, strconv.Itoa)
38

39
	args := []string{
40
		"loadbalancer-launch",
41
		"--loadbalancer-addr", clusterReq.Network.GatewayAddrs[0].String(),
42
		"--loadbalancer-upstreams", strings.Join(controlPlaneIPs, ","),
43
	}
44

45
	if len(ports) > 0 {
46
		args = append(args, "--loadbalancer-ports", strings.Join(ports, ","))
47
	}
48

49
	cmd := exec.Command(clusterReq.SelfExecutable, args...)
50
	cmd.Stdout = logFile
51
	cmd.Stderr = logFile
52
	cmd.SysProcAttr = &syscall.SysProcAttr{
53
		Setsid: true, // daemonize
54
	}
55

56
	if err = cmd.Start(); err != nil {
57
		return err
58
	}
59

60
	if err = os.WriteFile(pidPath, []byte(strconv.Itoa(cmd.Process.Pid)), os.ModePerm); err != nil {
61
		return fmt.Errorf("error writing LB PID file: %w", err)
62
	}
63

64
	return nil
65
}
66

67
// DestroyLoadBalancer destroys load balancer.
68
func (p *Provisioner) DestroyLoadBalancer(state *State) error {
69
	pidPath := state.GetRelativePath(lbPid)
70

71
	return StopProcessByPidfile(pidPath)
72
}
73

Использование cookies

Мы используем файлы cookie в соответствии с Политикой конфиденциальности и Политикой использования cookies.

Нажимая кнопку «Принимаю», Вы даете АО «СберТех» согласие на обработку Ваших персональных данных в целях совершенствования нашего веб-сайта и Сервиса GitVerse, а также повышения удобства их использования.

Запретить использование cookies Вы можете самостоятельно в настройках Вашего браузера.