talos

Форк
0
74 строки · 1.7 Кб
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 kubernetes
6

7
import (
8
	"context"
9
	"errors"
10
	"fmt"
11
	"strings"
12

13
	"github.com/blang/semver/v4"
14
	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
15
)
16

17
// DetectLowestVersion returns lowest Kubernetes components versions in the cluster.
18
//
19
//nolint:gocyclo
20
func DetectLowestVersion(ctx context.Context, cluster UpgradeProvider, options UpgradeOptions) (string, error) {
21
	k8sClient, err := cluster.K8sHelper(ctx)
22
	if err != nil {
23
		return "", fmt.Errorf("error building kubernetes client: %w", err)
24
	}
25

26
	apps := map[string]struct{}{
27
		"kube-apiserver":          {},
28
		"kube-controller-manager": {},
29
		"kube-proxy":              {},
30
		"kube-scheduler":          {},
31
	}
32

33
	pods, err := k8sClient.CoreV1().Pods("kube-system").List(ctx, metav1.ListOptions{})
34
	if err != nil {
35
		return "", err
36
	}
37

38
	var version *semver.Version
39

40
	for _, pod := range pods.Items {
41
		app := pod.GetObjectMeta().GetLabels()["k8s-app"]
42
		if _, ok := apps[app]; !ok {
43
			continue
44
		}
45

46
		for _, container := range pod.Spec.Containers {
47
			if container.Name != app {
48
				continue
49
			}
50

51
			idx := strings.LastIndex(container.Image, ":")
52
			if idx == -1 {
53
				continue
54
			}
55

56
			v, err := semver.ParseTolerant(strings.TrimLeft(container.Image[idx+1:], "v"))
57
			if err != nil {
58
				options.Log("failed to parse %s container version %s", app, err)
59

60
				continue
61
			}
62

63
			if version == nil || v.LT(*version) {
64
				version = &v
65
			}
66
		}
67
	}
68

69
	if version == nil {
70
		return "", errors.New("failed to detect lowest Kubernetes version")
71
	}
72

73
	return version.String(), nil
74
}
75

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

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

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

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