diff --git a/.all-contributorsrc b/.all-contributorsrc index cce3afbd3..2f2d00bd5 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -751,6 +751,15 @@ "contributions": [ "doc" ] + }, + { + "login": "liuxu623", + "name": "刘旭", + "avatar_url": "https://avatars.githubusercontent.com/u/9653438?v=4", + "profile": "https://github.com/liuxu623", + "contributions": [ + "code" + ] } ], "contributorsPerLine": 7, diff --git a/.github/workflows/golangci-lint.yml b/.github/workflows/golangci-lint.yml index b94a8a1be..04b4448ca 100644 --- a/.github/workflows/golangci-lint.yml +++ b/.github/workflows/golangci-lint.yml @@ -22,7 +22,7 @@ jobs: with: go-version: 1.19 - name: golangci-lint - uses: golangci/golangci-lint-action@v3.4.0 + uses: golangci/golangci-lint-action@v3.6.0 with: version: v1.50.1 working-directory: ${{matrix.working-directory}} diff --git a/.github/workflows/kubernetes-auto-support.yaml b/.github/workflows/kubernetes-auto-support.yaml index 2c733ba1a..766365fe8 100644 --- a/.github/workflows/kubernetes-auto-support.yaml +++ b/.github/workflows/kubernetes-auto-support.yaml @@ -10,7 +10,7 @@ jobs: runs-on: ubuntu-latest if: github.repository == 'kubesphere/kubekey' steps: - - uses: actions/checkout@v2 + - uses: actions/checkout@v3 - name: Set up Go 1.19 uses: actions/setup-go@v3 diff --git a/.github/workflows/release.yaml b/.github/workflows/release.yaml index fd945beac..19ac80a0d 100644 --- a/.github/workflows/release.yaml +++ b/.github/workflows/release.yaml @@ -31,7 +31,7 @@ jobs: - name: Get Version id: get_version - run: echo ::set-output name=VERSION::${GITHUB_REF#refs/tags/} + run: echo "VERSION=${GITHUB_REF#refs/tags/}" >> $GITHUB_OUTPUT - name: Synchronize artifacts to OSS run: | rm -rf qsctl_v2.4.3_linux_amd64.tar.gz diff --git a/CONTRIBUTORS.md b/CONTRIBUTORS.md index f5390374e..cb04f2306 100644 --- a/CONTRIBUTORS.md +++ b/CONTRIBUTORS.md @@ -111,6 +111,7 @@ Contributions of any kind are welcome! Thanks goes to these wonderful contributo wenwenxiong
wenwenxiong

💻 柏喵Sakura
柏喵Sakura

💻 cui fliter
cui fliter

📖 + 刘旭
刘旭

💻 diff --git a/README.md b/README.md index a5b846017..3f058c8d7 100644 --- a/README.md +++ b/README.md @@ -395,6 +395,7 @@ Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/d wenwenxiong
wenwenxiong

💻 柏喵Sakura
柏喵Sakura

💻 cui fliter
cui fliter

📖 + 刘旭
刘旭

💻 diff --git a/README_zh-CN.md b/README_zh-CN.md index b4812fe70..753920d7a 100644 --- a/README_zh-CN.md +++ b/README_zh-CN.md @@ -412,6 +412,7 @@ kubectl completion bash >/etc/bash_completion.d/kubectl wenwenxiong
wenwenxiong

💻 柏喵Sakura
柏喵Sakura

💻 cui fliter
cui fliter

📖 + 刘旭
刘旭

💻 diff --git a/cmd/kk/apis/kubekey/v1alpha2/addons_types.go b/cmd/kk/apis/kubekey/v1alpha2/addons_types.go index 3a40b6317..5500317b1 100644 --- a/cmd/kk/apis/kubekey/v1alpha2/addons_types.go +++ b/cmd/kk/apis/kubekey/v1alpha2/addons_types.go @@ -36,6 +36,7 @@ type Chart struct { Version string `yaml:"version" json:"version,omitempty"` ValuesFile string `yaml:"valuesFile" json:"valuesFile,omitempty"` Values []string `yaml:"values" json:"values,omitempty"` + Wait bool `yaml:"wait" json:"wait,omitempty"` } type Yaml struct { diff --git a/cmd/kk/apis/kubekey/v1alpha2/cluster_types.go b/cmd/kk/apis/kubekey/v1alpha2/cluster_types.go index b3b3a2c94..1bd4f7799 100644 --- a/cmd/kk/apis/kubekey/v1alpha2/cluster_types.go +++ b/cmd/kk/apis/kubekey/v1alpha2/cluster_types.go @@ -173,9 +173,6 @@ func (cfg *ClusterSpec) GroupHosts() map[string][]*KubeHost { if len(roleGroups[Etcd]) == 0 && cfg.Etcd.Type == KubeKey { logger.Log.Fatal(errors.New("The number of etcd cannot be 0")) } - if len(roleGroups[Registry]) > 1 { - logger.Log.Fatal(errors.New("The number of registry node cannot be greater than 1.")) - } for _, host := range roleGroups[ControlPlane] { host.SetRole(Master) diff --git a/cmd/kk/apis/kubekey/v1alpha2/default.go b/cmd/kk/apis/kubekey/v1alpha2/default.go index 60232e01e..64701675f 100644 --- a/cmd/kk/apis/kubekey/v1alpha2/default.go +++ b/cmd/kk/apis/kubekey/v1alpha2/default.go @@ -41,9 +41,9 @@ const ( DefaultSSHTimeout = 30 DefaultEtcdVersion = "v3.5.6" DefaultEtcdPort = "2379" - DefaultDockerVersion = "20.10.8" - DefaultContainerdVersion = "1.6.4" - DefaultRuncVersion = "v1.1.1" + DefaultDockerVersion = "24.0.6" + DefaultContainerdVersion = "1.7.8" + DefaultRuncVersion = "v1.1.10" DefaultCrictlVersion = "v1.24.0" DefaultKubeVersion = "v1.23.10" DefaultCalicoVersion = "v3.26.1" diff --git a/cmd/kk/apis/kubekey/v1alpha2/network_types.go b/cmd/kk/apis/kubekey/v1alpha2/network_types.go index 4a9ed3747..af0b1b6f4 100644 --- a/cmd/kk/apis/kubekey/v1alpha2/network_types.go +++ b/cmd/kk/apis/kubekey/v1alpha2/network_types.go @@ -33,6 +33,7 @@ type CalicoCfg struct { VethMTU int `yaml:"vethMTU" json:"vethMTU,omitempty"` Ipv4NatOutgoing *bool `yaml:"ipv4NatOutgoing" json:"ipv4NatOutgoing,omitempty"` DefaultIPPOOL *bool `yaml:"defaultIPPOOL" json:"defaultIPPOOL,omitempty"` + EnableTypha *bool `yaml:"enableTypha" json:"enableTypha,omitempty"` } type FlannelCfg struct { @@ -183,6 +184,14 @@ func (c *CalicoCfg) EnableDefaultIPPOOL() bool { return *c.DefaultIPPOOL } +// Typha is used to determine whether to enable calico Typha +func (c *CalicoCfg) Typha() bool { + if c.EnableTypha == nil { + return false + } + return *c.EnableTypha +} + // EnableInit is used to determine whether to create default network func (h *HybridnetCfg) EnableInit() bool { if h.Init == nil { diff --git a/cmd/kk/pkg/addons/charts.go b/cmd/kk/pkg/addons/charts.go index 704929e10..176d3acff 100644 --- a/cmd/kk/pkg/addons/charts.go +++ b/cmd/kk/pkg/addons/charts.go @@ -93,6 +93,7 @@ func InstallChart(kubeConf *common.KubeConf, addon *kubekeyapiv1alpha2.Addon, ku client.Keyring = defaultKeyring() client.RepoURL = addon.Sources.Chart.Repo client.Version = addon.Sources.Chart.Version + client.Wait = addon.Sources.Chart.Wait //client.Force = true if client.Version == "" && client.Devel { diff --git a/cmd/kk/pkg/bootstrap/registry/certs.go b/cmd/kk/pkg/bootstrap/registry/certs.go index 794fb22a6..8b5918477 100644 --- a/cmd/kk/pkg/bootstrap/registry/certs.go +++ b/cmd/kk/pkg/bootstrap/registry/certs.go @@ -105,9 +105,13 @@ func (g *GenerateCerts) Execute(runtime connector.Runtime) error { var altName cert.AltNames - dnsList := []string{"localhost", g.KubeConf.Cluster.Registry.PrivateRegistry, runtime.GetHostsByRole(common.Registry)[0].GetName()} - ipList := []net.IP{net.IPv4(127, 0, 0, 1), net.IPv6loopback, netutils.ParseIPSloppy(runtime.GetHostsByRole(common.Registry)[0].GetInternalAddress())} + dnsList := []string{"localhost", RegistryCertificateBaseName} + ipList := []net.IP{net.IPv4(127, 0, 0, 1), net.IPv6loopback} + for _, h := range runtime.GetHostsByRole(common.Registry) { + dnsList = append(dnsList, h.GetName()) + ipList = append(ipList, netutils.ParseIPSloppy(h.GetInternalAddress())) + } altName.DNSNames = dnsList altName.IPs = ipList diff --git a/cmd/kk/pkg/bootstrap/registry/module.go b/cmd/kk/pkg/bootstrap/registry/module.go index e948e6f1c..284b88bac 100644 --- a/cmd/kk/pkg/bootstrap/registry/module.go +++ b/cmd/kk/pkg/bootstrap/registry/module.go @@ -250,18 +250,10 @@ func InstallHarbor(i *InstallRegistryModule) []task.Interface { } generateHarborConfig := &task.RemoteTask{ - Name: "GenerateHarborConfig", - Desc: "Generate harbor config", - Hosts: i.Runtime.GetHostsByRole(common.Registry), - Action: &action.Template{ - Template: templates.HarborConfigTempl, - Dst: "/opt/harbor/harbor.yml", - Data: util.Data{ - "Domain": i.KubeConf.Cluster.Registry.PrivateRegistry, - "Certificate": fmt.Sprintf("%s.pem", i.KubeConf.Cluster.Registry.PrivateRegistry), - "Key": fmt.Sprintf("%s-key.pem", i.KubeConf.Cluster.Registry.PrivateRegistry), - }, - }, + Name: "GenerateHarborConfig", + Desc: "Generate harbor config", + Hosts: i.Runtime.GetHostsByRole(common.Registry), + Action: new(GenerateHarborConfig), Parallel: true, Retry: 1, } diff --git a/cmd/kk/pkg/bootstrap/registry/tasks.go b/cmd/kk/pkg/bootstrap/registry/tasks.go index 6c76fb27d..e3b9e62a4 100644 --- a/cmd/kk/pkg/bootstrap/registry/tasks.go +++ b/cmd/kk/pkg/bootstrap/registry/tasks.go @@ -18,6 +18,9 @@ package registry import ( "fmt" + "github.com/kubesphere/kubekey/v3/cmd/kk/pkg/bootstrap/registry/templates" + "github.com/kubesphere/kubekey/v3/cmd/kk/pkg/core/action" + "github.com/kubesphere/kubekey/v3/cmd/kk/pkg/core/util" "path/filepath" "strings" @@ -212,6 +215,29 @@ func (g *SyncHarborPackage) Execute(runtime connector.Runtime) error { return nil } +type GenerateHarborConfig struct { + common.KubeAction +} + +func (g *GenerateHarborConfig) Execute(runtime connector.Runtime) error { + host := runtime.RemoteHost() + templateAction := action.Template{ + Template: templates.HarborConfigTempl, + Dst: "/opt/harbor/harbor.yml", + Data: util.Data{ + "Domain": host.GetName(), + "Certificate": fmt.Sprintf("%s.pem", RegistryCertificateBaseName), + "Key": fmt.Sprintf("%s-key.pem", RegistryCertificateBaseName), + "Password": templates.Password(g.KubeConf, RegistryCertificateBaseName), + }, + } + templateAction.Init(nil, nil) + if err := templateAction.Execute(runtime); err != nil { + return err + } + return nil +} + type StartHarbor struct { common.KubeAction } diff --git a/cmd/kk/pkg/bootstrap/registry/templates/harbor.go b/cmd/kk/pkg/bootstrap/registry/templates/harbor.go index 517a29d65..7e97a46d3 100644 --- a/cmd/kk/pkg/bootstrap/registry/templates/harbor.go +++ b/cmd/kk/pkg/bootstrap/registry/templates/harbor.go @@ -14,6 +14,9 @@ limitations under the License. package templates import ( + "github.com/kubesphere/kubekey/v3/cmd/kk/pkg/common" + "github.com/kubesphere/kubekey/v3/cmd/kk/pkg/registry" + "strings" "text/template" "github.com/lithammer/dedent" @@ -133,3 +136,14 @@ proxy: `))) ) + +func Password(kubeConf *common.KubeConf, domain string) string { + auths := registry.DockerRegistryAuthEntries(kubeConf.Cluster.Registry.Auths) + for repo, entry := range auths { + if strings.Contains(repo, domain) { + return entry.Password + } + } + + return "Harbor12345" +} \ No newline at end of file diff --git a/cmd/kk/pkg/container/docker.go b/cmd/kk/pkg/container/docker.go index cce726607..0beecff3f 100644 --- a/cmd/kk/pkg/container/docker.go +++ b/cmd/kk/pkg/container/docker.go @@ -89,7 +89,7 @@ func (p *DockerLoginRegistry) Execute(runtime connector.Runtime) error { if len(entry.Username) == 0 || len(entry.Password) == 0 { continue } - cmd := fmt.Sprintf("docker login --username '%s' --password '%s' %s", escapeSpecialCharacters(entry.Username), escapeSpecialCharacters(entry.Password), repo) + cmd := fmt.Sprintf("HOME=$HOME docker login --username '%s' --password '%s' %s", escapeSpecialCharacters(entry.Username), escapeSpecialCharacters(entry.Password), repo) if _, err := runtime.GetRunner().SudoCmd(cmd, false); err != nil { return errors.Wrapf(err, "login registry failed, cmd: %v, err:%v", cmd, err) } diff --git a/cmd/kk/pkg/etcd/tasks.go b/cmd/kk/pkg/etcd/tasks.go index 052991e55..0aeaccdd7 100644 --- a/cmd/kk/pkg/etcd/tasks.go +++ b/cmd/kk/pkg/etcd/tasks.go @@ -406,6 +406,7 @@ func (b *BackupETCD) Execute(runtime connector.Runtime) error { Data: util.Data{ "Hostname": runtime.RemoteHost().GetName(), "Etcdendpoint": fmt.Sprintf("https://%s:2379", runtime.RemoteHost().GetInternalAddress()), + "DataDir": b.KubeConf.Cluster.Etcd.DataDir, "Backupdir": b.KubeConf.Cluster.Etcd.BackupDir, "KeepbackupNumber": b.KubeConf.Cluster.Etcd.KeepBackupNumber + 1, "EtcdBackupScriptDir": b.KubeConf.Cluster.Etcd.BackupScriptDir, diff --git a/cmd/kk/pkg/etcd/templates/backup_script.go b/cmd/kk/pkg/etcd/templates/backup_script.go index c3a09ebee..9445aff12 100644 --- a/cmd/kk/pkg/etcd/templates/backup_script.go +++ b/cmd/kk/pkg/etcd/templates/backup_script.go @@ -32,7 +32,11 @@ set -o pipefail ETCDCTL_PATH='/usr/local/bin/etcdctl' ENDPOINTS='{{ .Etcdendpoint }}' +{{- if .DataDir }} +ETCD_DATA_DIR="{{ .DataDir }}" +{{- else }} ETCD_DATA_DIR="/var/lib/etcd" +{{- end }} BACKUP_DIR="{{ .Backupdir }}/etcd-$(date +%Y-%m-%d-%H-%M-%S)" KEEPBACKUPNUMBER='{{ .KeepbackupNumber }}' ETCDBACKUPSCIPT='{{ .EtcdBackupScriptDir }}' diff --git a/cmd/kk/pkg/files/file.go b/cmd/kk/pkg/files/file.go index 137463785..bba319b6c 100644 --- a/cmd/kk/pkg/files/file.go +++ b/cmd/kk/pkg/files/file.go @@ -320,9 +320,9 @@ func sha256sum(path string) (string, error) { } defer file.Close() - data, err := io.ReadAll(file) - if err != nil { + hasher := sha256.New() + if _, err := io.Copy(hasher, file); err != nil { return "", err } - return fmt.Sprintf("%x", sha256.Sum256(data)), nil + return fmt.Sprintf("%x", hasher.Sum(nil)), nil } diff --git a/cmd/kk/pkg/kubernetes/tasks.go b/cmd/kk/pkg/kubernetes/tasks.go index 26128da12..cc14106e5 100644 --- a/cmd/kk/pkg/kubernetes/tasks.go +++ b/cmd/kk/pkg/kubernetes/tasks.go @@ -45,7 +45,6 @@ import ( "github.com/kubesphere/kubekey/v3/cmd/kk/pkg/files" "github.com/kubesphere/kubekey/v3/cmd/kk/pkg/images" "github.com/kubesphere/kubekey/v3/cmd/kk/pkg/kubernetes/templates" - "github.com/kubesphere/kubekey/v3/cmd/kk/pkg/kubernetes/templates/v1beta2" "github.com/kubesphere/kubekey/v3/cmd/kk/pkg/utils" ) @@ -249,11 +248,11 @@ func (g *GenerateKubeadmConfig) Execute(runtime connector.Runtime) error { } } - _, ApiServerArgs := util.GetArgs(v1beta2.GetApiServerArgs(g.WithSecurityEnhancement, g.KubeConf.Cluster.Kubernetes.EnableAudit()), g.KubeConf.Cluster.Kubernetes.ApiServerArgs) - _, ControllerManagerArgs := util.GetArgs(v1beta2.GetControllermanagerArgs(g.KubeConf.Cluster.Kubernetes.Version, g.WithSecurityEnhancement), g.KubeConf.Cluster.Kubernetes.ControllerManagerArgs) - _, SchedulerArgs := util.GetArgs(v1beta2.GetSchedulerArgs(g.WithSecurityEnhancement), g.KubeConf.Cluster.Kubernetes.SchedulerArgs) + _, ApiServerArgs := util.GetArgs(templates.GetApiServerArgs(g.WithSecurityEnhancement, g.KubeConf.Cluster.Kubernetes.EnableAudit()), g.KubeConf.Cluster.Kubernetes.ApiServerArgs) + _, ControllerManagerArgs := util.GetArgs(templates.GetControllermanagerArgs(g.KubeConf.Cluster.Kubernetes.Version, g.WithSecurityEnhancement), g.KubeConf.Cluster.Kubernetes.ControllerManagerArgs) + _, SchedulerArgs := util.GetArgs(templates.GetSchedulerArgs(g.WithSecurityEnhancement), g.KubeConf.Cluster.Kubernetes.SchedulerArgs) - checkCgroupDriver, err := v1beta2.GetKubeletCgroupDriver(runtime, g.KubeConf) + checkCgroupDriver, err := templates.GetKubeletCgroupDriver(runtime, g.KubeConf) if err != nil { return err } @@ -273,8 +272,8 @@ func (g *GenerateKubeadmConfig) Execute(runtime connector.Runtime) error { } templateAction := action.Template{ - Template: v1beta2.KubeadmConfig, - Dst: filepath.Join(common.KubeConfigDir, v1beta2.KubeadmConfig.Name()), + Template: templates.KubeadmConfig, + Dst: filepath.Join(common.KubeConfigDir, templates.KubeadmConfig.Name()), Data: util.Data{ "IsInitCluster": g.IsInitConfiguration, "ImageRepo": strings.TrimSuffix(images.GetImage(runtime, g.KubeConf, "kube-apiserver").ImageRepo(), "/kube-apiserver"), @@ -296,12 +295,13 @@ func (g *GenerateKubeadmConfig) Execute(runtime connector.Runtime) error { "ExternalEtcd": externalEtcd, "NodeCidrMaskSize": g.KubeConf.Cluster.Kubernetes.NodeCidrMaskSize, "CriSock": g.KubeConf.Cluster.Kubernetes.ContainerRuntimeEndpoint, - "ApiServerArgs": v1beta2.UpdateFeatureGatesConfiguration(ApiServerArgs, g.KubeConf), + "ApiServerArgs": templates.UpdateFeatureGatesConfiguration(ApiServerArgs, g.KubeConf), "EnableAudit": g.KubeConf.Cluster.Kubernetes.EnableAudit(), - "ControllerManagerArgs": v1beta2.UpdateFeatureGatesConfiguration(ControllerManagerArgs, g.KubeConf), - "SchedulerArgs": v1beta2.UpdateFeatureGatesConfiguration(SchedulerArgs, g.KubeConf), - "KubeletConfiguration": v1beta2.GetKubeletConfiguration(runtime, g.KubeConf, g.KubeConf.Cluster.Kubernetes.ContainerRuntimeEndpoint, g.WithSecurityEnhancement), - "KubeProxyConfiguration": v1beta2.GetKubeProxyConfiguration(g.KubeConf), + "ControllerManagerArgs": templates.UpdateFeatureGatesConfiguration(ControllerManagerArgs, g.KubeConf), + "SchedulerArgs": templates.UpdateFeatureGatesConfiguration(SchedulerArgs, g.KubeConf), + "KubeletConfiguration": templates.GetKubeletConfiguration(runtime, g.KubeConf, g.KubeConf.Cluster.Kubernetes.ContainerRuntimeEndpoint, g.WithSecurityEnhancement), + "KubeProxyConfiguration": templates.GetKubeProxyConfiguration(g.KubeConf), + "IsV1beta3": versionutil.MustParseSemantic(g.KubeConf.Cluster.Kubernetes.Version).AtLeast(versionutil.MustParseSemantic("v1.22.0")), "IsControlPlane": host.IsRole(common.Master), "CgroupDriver": checkCgroupDriver, "BootstrapToken": bootstrapToken, diff --git a/cmd/kk/pkg/kubernetes/templates/v1beta2/kubeadm_config.go b/cmd/kk/pkg/kubernetes/templates/kubeadm_config.go similarity index 97% rename from cmd/kk/pkg/kubernetes/templates/v1beta2/kubeadm_config.go rename to cmd/kk/pkg/kubernetes/templates/kubeadm_config.go index bef97f247..17d75a0a5 100644 --- a/cmd/kk/pkg/kubernetes/templates/v1beta2/kubeadm_config.go +++ b/cmd/kk/pkg/kubernetes/templates/kubeadm_config.go @@ -14,7 +14,7 @@ limitations under the License. */ -package v1beta2 +package templates import ( "fmt" @@ -38,7 +38,7 @@ var ( dedent.Dedent(` {{- if .IsInitCluster -}} --- -apiVersion: kubeadm.k8s.io/v1beta2 +apiVersion: kubeadm.k8s.io/{{ if .IsV1beta3 }}v1beta3{{ else }}v1beta2{{ end }} kind: ClusterConfiguration etcd: {{- if .EtcdTypeIsKubeadm }} @@ -106,7 +106,7 @@ scheduler: {{ toYaml .SchedulerArgs | indent 4 }} --- -apiVersion: kubeadm.k8s.io/v1beta2 +apiVersion: kubeadm.k8s.io/{{ if .IsV1beta3 }}v1beta3{{ else }}v1beta2{{ end }} kind: InitConfiguration localAPIEndpoint: advertiseAddress: {{ .AdvertiseAddress }} @@ -128,7 +128,7 @@ kind: KubeletConfiguration {{- else -}} --- -apiVersion: kubeadm.k8s.io/v1beta2 +apiVersion: kubeadm.k8s.io/{{ if .IsV1beta3 }}v1beta3{{ else }}v1beta2{{ end }} kind: JoinConfiguration discovery: bootstrapToken: @@ -159,14 +159,10 @@ var ( FeatureGatesDefaultConfiguration = map[string]bool{ "RotateKubeletServerCertificate": true, //k8s 1.7+ "TTLAfterFinished": true, //k8s 1.12+ - "ExpandCSIVolumes": true, //k8s 1.14+ - "CSIStorageCapacity": true, //k8s 1.19+ } FeatureGatesSecurityDefaultConfiguration = map[string]bool{ "RotateKubeletServerCertificate": true, //k8s 1.7+ "TTLAfterFinished": true, //k8s 1.12+ - "ExpandCSIVolumes": true, //k8s 1.14+ - "CSIStorageCapacity": true, //k8s 1.19+ "SeccompDefault": true, //kubelet } diff --git a/cmd/kk/pkg/loadbalancer/tasks.go b/cmd/kk/pkg/loadbalancer/tasks.go index 4035f7455..c1087d57f 100644 --- a/cmd/kk/pkg/loadbalancer/tasks.go +++ b/cmd/kk/pkg/loadbalancer/tasks.go @@ -165,6 +165,7 @@ func (g *GetInterfaceName) Execute(runtime connector.Runtime) error { } cmd := fmt.Sprintf("ip route "+ "| grep ' %s ' "+ + "| grep 'proto kernel scope link src'"+ "| sed -e \"s/^.*dev.//\" -e \"s/.proto.*//\""+ "| uniq ", host.GetAddress()) interfaceName, err := runtime.GetRunner().SudoCmd(cmd, false) diff --git a/cmd/kk/pkg/pipelines/add_nodes.go b/cmd/kk/pkg/pipelines/add_nodes.go index 62b28f654..61dd067e0 100644 --- a/cmd/kk/pkg/pipelines/add_nodes.go +++ b/cmd/kk/pkg/pipelines/add_nodes.go @@ -46,13 +46,13 @@ func NewAddNodesPipeline(runtime *common.KubeRuntime) error { m := []module.Module{ &precheck.GreetingsModule{}, + &customscripts.CustomScriptsModule{Phase: "PreInstall", Scripts: runtime.Cluster.System.PreInstall}, &precheck.NodePreCheckModule{}, &confirm.InstallConfirmModule{}, &artifact.UnArchiveModule{Skip: noArtifact}, &os.RepositoryModule{Skip: noArtifact || !runtime.Arg.InstallPackages}, &binaries.NodeBinariesModule{}, &os.ConfigureOSModule{Skip: runtime.Cluster.System.SkipConfigureOS}, - &customscripts.CustomScriptsModule{Phase: "PreInstall", Scripts: runtime.Cluster.System.PreInstall}, ®istry.RegistryCertsModule{Skip: len(runtime.GetHostsByRole(common.Registry)) == 0}, //for one master to multi master kube-vip &loadbalancer.KubevipModule{Skip: !runtime.Cluster.ControlPlaneEndpoint.IsInternalLBEnabledVip()}, diff --git a/cmd/kk/pkg/pipelines/init_registry.go b/cmd/kk/pkg/pipelines/init_registry.go index beef134c9..38c26c766 100644 --- a/cmd/kk/pkg/pipelines/init_registry.go +++ b/cmd/kk/pkg/pipelines/init_registry.go @@ -18,16 +18,17 @@ package pipelines import ( "fmt" - "github.com/kubesphere/kubekey/v3/cmd/kk/pkg/artifact" "github.com/kubesphere/kubekey/v3/cmd/kk/pkg/binaries" "github.com/kubesphere/kubekey/v3/cmd/kk/pkg/bootstrap/os" "github.com/kubesphere/kubekey/v3/cmd/kk/pkg/bootstrap/precheck" "github.com/kubesphere/kubekey/v3/cmd/kk/pkg/bootstrap/registry" "github.com/kubesphere/kubekey/v3/cmd/kk/pkg/common" + "github.com/kubesphere/kubekey/v3/cmd/kk/pkg/core/logger" "github.com/kubesphere/kubekey/v3/cmd/kk/pkg/core/module" "github.com/kubesphere/kubekey/v3/cmd/kk/pkg/core/pipeline" "github.com/kubesphere/kubekey/v3/cmd/kk/pkg/filesystem" + "github.com/pkg/errors" ) func NewInitRegistryPipeline(runtime *common.KubeRuntime) error { @@ -74,6 +75,10 @@ func InitRegistry(args common.Argument, downloadCmd string) error { return err } + if len(runtime.GetHostsByRole("registry")) <= 0 { + logger.Log.Fatal(errors.New("The number of registry must be greater then 0.")) + } + if err := NewInitRegistryPipeline(runtime); err != nil { return err } diff --git a/cmd/kk/pkg/plugins/network/modules.go b/cmd/kk/pkg/plugins/network/modules.go index 21fb5e310..db28cf6a0 100644 --- a/cmd/kk/pkg/plugins/network/modules.go +++ b/cmd/kk/pkg/plugins/network/modules.go @@ -109,7 +109,7 @@ func deployCalico(d *DeployNetworkPluginModule) []task.Interface { "CalicoNodeImage": images.GetImage(d.Runtime, d.KubeConf, "calico-node").ImageName(), "CalicoFlexvolImage": images.GetImage(d.Runtime, d.KubeConf, "calico-flexvol").ImageName(), "CalicoControllersImage": images.GetImage(d.Runtime, d.KubeConf, "calico-kube-controllers").ImageName(), - "TyphaEnabled": len(d.Runtime.GetHostsByRole(common.K8s)) > 50, + "TyphaEnabled": len(d.Runtime.GetHostsByRole(common.K8s)) > 50 || d.KubeConf.Cluster.Network.Calico.Typha(), "VethMTU": d.KubeConf.Cluster.Network.Calico.VethMTU, "NodeCidrMaskSize": d.KubeConf.Cluster.Kubernetes.NodeCidrMaskSize, "IPIPMode": d.KubeConf.Cluster.Network.Calico.IPIPMode, @@ -137,7 +137,7 @@ func deployCalico(d *DeployNetworkPluginModule) []task.Interface { "CalicoFlexvolImage": images.GetImage(d.Runtime, d.KubeConf, "calico-flexvol").ImageName(), "CalicoControllersImage": images.GetImage(d.Runtime, d.KubeConf, "calico-kube-controllers").ImageName(), "CalicoTyphaImage": images.GetImage(d.Runtime, d.KubeConf, "calico-typha").ImageName(), - "TyphaEnabled": len(d.Runtime.GetHostsByRole(common.K8s)) > 50, + "TyphaEnabled": len(d.Runtime.GetHostsByRole(common.K8s)) > 50 || d.KubeConf.Cluster.Network.Calico.Typha(), "VethMTU": d.KubeConf.Cluster.Network.Calico.VethMTU, "NodeCidrMaskSize": d.KubeConf.Cluster.Kubernetes.NodeCidrMaskSize, "IPIPMode": d.KubeConf.Cluster.Network.Calico.IPIPMode, diff --git a/cmd/kk/pkg/version/kubernetes/version_enum.go b/cmd/kk/pkg/version/kubernetes/version_enum.go index 3d4b18898..e0fffdbbf 100644 --- a/cmd/kk/pkg/version/kubernetes/version_enum.go +++ b/cmd/kk/pkg/version/kubernetes/version_enum.go @@ -36,6 +36,8 @@ const ( V124 V125 V126 + V127 + V128 ) var VersionList = []Version{ @@ -47,6 +49,8 @@ var VersionList = []Version{ V124, V125, V126, + V127, + V128, } func (v Version) String() string { @@ -67,6 +71,10 @@ func (v Version) String() string { return "v1.25" case V126: return "v1.26" + case V127: + return "v1.27" + case V128: + return "v1.28" default: return "invalid option" } diff --git a/cmd/kk/pkg/version/kubesphere/ks_installer.go b/cmd/kk/pkg/version/kubesphere/ks_installer.go index c780b3b95..22719db17 100644 --- a/cmd/kk/pkg/version/kubesphere/ks_installer.go +++ b/cmd/kk/pkg/version/kubesphere/ks_installer.go @@ -238,3 +238,23 @@ var KsV340 = &KsInstaller{ V330.String(), }, } + +var KsV341 = &KsInstaller{ + Version: V341.String(), + CRDTemplate: templates.KsInstaller, + ClusterConfigurationTemplate: templates.V341, + K8sSupportVersions: []string{ + "v1.21", + "v1.22", + "v1.23", + "v1.24", + "v1.25", + "v1.26", + }, + UpgradeSupportVersions: []string{ + V340.String(), + V332.String(), + V331.String(), + V330.String(), + }, +} diff --git a/cmd/kk/pkg/version/kubesphere/templates/cc_v341.go b/cmd/kk/pkg/version/kubesphere/templates/cc_v341.go new file mode 100644 index 000000000..fd2ec6c02 --- /dev/null +++ b/cmd/kk/pkg/version/kubesphere/templates/cc_v341.go @@ -0,0 +1,229 @@ +/* + Copyright 2022 The KubeSphere Authors. + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*/ + +package templates + +import ( + "text/template" + + "github.com/lithammer/dedent" +) + +var V341 = template.Must(template.New("v3.4.1").Parse( + dedent.Dedent(` +--- +apiVersion: installer.kubesphere.io/v1alpha1 +kind: ClusterConfiguration +metadata: + name: ks-installer + namespace: kubesphere-system + labels: + version: {{ .Tag }} +spec: + persistence: + storageClass: "" + authentication: + jwtSecret: "" + local_registry: "" + # dev_tag: "" + etcd: + monitoring: false + endpointIps: localhost + port: 2379 + tlsEnable: true + common: + core: + console: + enableMultiLogin: true + port: 30880 + type: NodePort + # apiserver: + # resources: {} + # controllerManager: + # resources: {} + redis: + enabled: false + enableHA: false + volumeSize: 2Gi + openldap: + enabled: false + volumeSize: 2Gi + minio: + volumeSize: 20Gi + monitoring: + # type: external + endpoint: http://prometheus-operated.kubesphere-monitoring-system.svc:9090 + GPUMonitoring: + enabled: false + gpu: + kinds: + - resourceName: "nvidia.com/gpu" + resourceType: "GPU" + default: true + es: + # master: + # volumeSize: 4Gi + # replicas: 1 + # resources: {} + # data: + # volumeSize: 20Gi + # replicas: 1 + # resources: {} + enabled: false + logMaxAge: 7 + elkPrefix: logstash + basicAuth: + enabled: false + username: "" + password: "" + externalElasticsearchHost: "" + externalElasticsearchPort: "" + opensearch: + # master: + # volumeSize: 4Gi + # replicas: 1 + # resources: {} + # data: + # volumeSize: 20Gi + # replicas: 1 + # resources: {} + enabled: true + logMaxAge: 7 + opensearchPrefix: whizard + basicAuth: + enabled: true + username: "admin" + password: "admin" + externalOpensearchHost: "" + externalOpensearchPort: "" + dashboard: + enabled: false + alerting: + enabled: false + # thanosruler: + # replicas: 1 + # resources: {} + auditing: + enabled: false + # operator: + # resources: {} + # webhook: + # resources: {} + devops: + enabled: false + jenkinsCpuReq: 0.5 + jenkinsCpuLim: 1 + jenkinsMemoryReq: 4Gi + jenkinsMemoryLim: 4Gi + jenkinsVolumeSize: 16Gi + events: + enabled: false + # operator: + # resources: {} + # exporter: + # resources: {} + ruler: + enabled: true + replicas: 2 + # resources: {} + logging: + enabled: false + logsidecar: + enabled: true + replicas: 2 + # resources: {} + metrics_server: + enabled: false + monitoring: + storageClass: "" + node_exporter: + port: 9100 + # resources: {} + # kube_rbac_proxy: + # resources: {} + # kube_state_metrics: + # resources: {} + # prometheus: + # replicas: 1 + # volumeSize: 20Gi + # resources: {} + # operator: + # resources: {} + # alertmanager: + # replicas: 1 + # resources: {} + # notification_manager: + # resources: {} + # operator: + # resources: {} + # proxy: + # resources: {} + gpu: + nvidia_dcgm_exporter: + enabled: false + # resources: {} + multicluster: + clusterRole: none + network: + networkpolicy: + enabled: false + ippool: + type: none + topology: + type: none + openpitrix: + store: + enabled: false + servicemesh: + enabled: false + istio: + components: + ingressGateways: + - name: istio-ingressgateway + enabled: false + cni: + enabled: false + edgeruntime: + enabled: false + kubeedge: + enabled: false + cloudCore: + cloudHub: + advertiseAddress: + - "" + service: + cloudhubNodePort: "30000" + cloudhubQuicNodePort: "30001" + cloudhubHttpsNodePort: "30002" + cloudstreamNodePort: "30003" + tunnelNodePort: "30004" + # resources: {} + # hostNetWork: false + iptables-manager: + enabled: true + mode: "external" + # resources: {} + # edgeService: + # resources: {} + gatekeeper: + enabled: false + # controller_manager: + # resources: {} + # audit: + # resources: {} + terminal: + timeout: 600 +`))) diff --git a/cmd/kk/pkg/version/kubesphere/version_enum.go b/cmd/kk/pkg/version/kubesphere/version_enum.go index 05560d4e5..d29c71a00 100644 --- a/cmd/kk/pkg/version/kubesphere/version_enum.go +++ b/cmd/kk/pkg/version/kubesphere/version_enum.go @@ -36,6 +36,7 @@ const ( V331 V332 V340 + V341 ) var VersionList = []Version{ @@ -49,6 +50,7 @@ var VersionList = []Version{ V331, V332, V340, + V341, } var VersionMap = map[string]*KsInstaller{ @@ -62,6 +64,7 @@ var VersionMap = map[string]*KsInstaller{ V331.String(): KsV331, V332.String(): KsV332, V340.String(): KsV340, + V341.String(): KsV341, } var CNSource = map[string]bool{ @@ -73,6 +76,7 @@ var CNSource = map[string]bool{ V331.String(): true, V332.String(): true, V340.String(): true, + V341.String(): true, } func (v Version) String() string { @@ -97,6 +101,8 @@ func (v Version) String() string { return "v3.3.2" case V340: return "v3.4.0" + case V341: + return "v3.4.1" default: return "invalid option" } diff --git a/docs/harbor-ha.md b/docs/harbor-ha.md new file mode 100644 index 000000000..41397a422 --- /dev/null +++ b/docs/harbor-ha.md @@ -0,0 +1,229 @@ +## 一、Harbor 简介 + +Harbor 是由 VMware 公司使用 Go 语言开发,主要就是用于存放镜像使用,同时我们还可以通过 Web 界面来对存放的镜像进行管理。并且 Harbor 提供的功能有:基于角色的访问控制,镜像远程复制同步,以及审计日志等功能。官方文档 + +### 1.Harbor 功能介绍 + +1)基于角色的访问控制: 我们可以通过项目来对用户进行权限划分,项目中可以包含多个镜像。 + +2)审计管理: 我们可以在用户审计管理中,找到我们所有对镜像仓库做的操作。 + +3)镜像复制: 我们可以通过配置,使在两台 Harbor 服务器间实现镜像同步。 + +4)漏洞扫描: Harbor 会定期对仓库中的镜像进行扫描,并进行策略检查,以防止部署出易受到攻击的镜像。 + +### 2.Harbor 高可用方式 + +目前 Harbor 最常见的高可用方式有两种,分别是: + +1)安装两台 Harbor 仓库,他们共同使用一个存储(一般常见的便是 NFS 共享存储) + +![Image](img/harbor_ha01.png?raw=true) + +2)安装两台 Harbor 仓库,并互相配置同步关系。 + +![image](img/harbor_ha02.png?raw=true) + +因为第一种方式的话,需要额外配置 Redis 和 PostgreSQL 以及 NFS 服务,所以我们下面使用第二种方式进行 Harbor 高可用配置。 + +# Harbor镜像仓库高可用方案设计 + +采用2台harbor仓库互为主备的方案,如下图所示 + +![image](img/harbor_keepalived.png?raw=true) + +注意:主备方案 + +由于VIP的浮动,主备节点其实是互为主备;在部署harbor时,需要注意主备节点上的harbor.yml中hostname不要配置为浮动IP(reg.harbor.4a或192.168.10.200),应配置为各自IP或者hostname; +早先,将VIP的域名reg.harbor.4a配置到190和191上的harbor.yml中(hostname: reg.harbor.4a)导致一个问题:只有主节点可做为target被添加,用作镜像同步(也就是无法在主节点的仓库管理中创建备节点的target,即便添加了也无法连通)。 + +准备文件(在源码的script文件夹下,keepalived镜像可以从互联网阿里云镜像仓库下载)如下 + +``` +# tree . +. +├── harborCreateRegistriesAndReplications.sh +├── keepalived21.tar +├── kk +└── harbor_keepalived + ├── check_harbor.sh + ├── docker-compose-keepalived-backup.yaml + ├── docker-compose-keepalived-master.yaml + ├── keepalived-backup.conf + └── keepalived-master.conf + +1 directory, 8 files +``` + +kk: kubekey支持多节点harbor仓库代码(包含本pr)编译生成二进制文件 + +harborCreateRegistriesAndReplications.sh:配置harbor互为主备的脚本 + +keepalived21.tar:keepalived的docker镜像 + +harbor_keepalived:keepalived master和slave的docker-compose部署文件 + +## kubekey部署多节点harbor仓库 + +通过二次开发kubekey源码,实现了kubekey部署harbor仓库支持多节点,并且配置同一套harbor证书。证书中包含所有部署harbor节点的主机名和IP认证设置。 + +后续集成到一键部署脚本中,通过配置registry角色的多个节点来部署多harbor仓库。推荐2个harbor仓库,部署过多占用资源。 + +## harbor仓库互为主备设置 + +harbor仓库部署后,通过调用harbor仓库api建立备份仓库,建立备份规则。 + +例如master1节点上仓库和master2节点仓库配置如下 + +``` +#!/bin/bash + +Harbor_master1_Address=master1:7443 +master1_Address=192.168.122.61 +Harbor_master2_Address=master2:7443 +master2_Address=192.168.122.62 + +Harbor_User=admin #登录Harbor的用户 +Harbor_Passwd="Harbor12345" #登录Harbor的用户密码 +Harbor_UserPwd="$Harbor_User:$Harbor_Passwd" + +# create registry +curl -k -u $Harbor_UserPwd -X POST -H "Content-Type: application/json" "https://${Harbor_master1_Address}/api/v2.0/registries" -d "{\"name\": \"master1_2_master2\", \"type\": \"harbor\", \"url\":\"https://${master2_Address}:7443\", \"credential\": {\"access_key\": \"${Harbor_User}\", \"access_secret\": \"${Harbor_Passwd}\"}, \"insecure\": true}" +# create registry +curl -k -u $Harbor_UserPwd -X POST -H "Content-Type: application/json" "https://${Harbor_master2_Address}/api/v2.0/registries" -d "{\"name\": \"master2_2_master1\", \"type\": \"harbor\", \"url\":\"https://${master1_Address}:7443\", \"credential\": {\"access_key\": \"${Harbor_User}\", \"access_secret\": \"${Harbor_Passwd}\"}, \"insecure\": true}" + +#createReplication +curl -k -u $Harbor_UserPwd -X POST -H "Content-Type: application/json" "https://${Harbor_master1_Address}/api/v2.0/replication/policies" -d "{\"name\": \"master1_2_master2\", \"enabled\": true, \"deletion\":true, \"override\":true, \"replicate_deletion\":true, \"dest_registry\":{ \"id\": 1, \"name\": \"master1_2_master2\"}, \"trigger\": {\"type\": \"event_based\"}, \"dest_namespace_replace_count\":1 }" + +#createReplication +curl -k -u $Harbor_UserPwd -X POST -H "Content-Type: application/json" "https://${Harbor_master2_Address}/api/v2.0/replication/policies" -d "{\"name\": \"master2_2_master1\", \"enabled\": true, \"deletion\":true, \"override\":true, \"replicate_deletion\":true, \"dest_registry\":{ \"id\": 1, \"name\": \"master2_2_master1\"}, \"trigger\": {\"type\": \"event_based\"}, \"dest_namespace_replace_count\":1 }" +``` + +## keepalived管理harbor服务VIP + +使用docker-compose管理keepalived服务 + +keepalived master服务器配置如下 + +``` +# cat docker-compose-keepalived-master.yaml +version: '3.8' + +# Docker-Compose 单容器使用参考 YAML 配置文件 +# 更多配置参数请参考镜像 README.md 文档中说明 +services: + keepalived: + image: 'dockerhub.kubekey.local/kubesphere/keepalived:2.1' + privileged: true + network_mode: host + volumes: + - ./keepalived-master.conf:/srv/conf/keepalived/keepalived.conf + - ./check_harbor.sh:/srv/conf/keepalived/check_harbor.sh + container_name: keepalived + restart: on-failure + +# cat keepalived-master.conf +vrrp_script check_harbor { + script "/srv/conf/keepalived/check_harbor.sh" + interval 10 # 间隔时间,单位为秒,默认1秒 + fall 2 # 脚本几次失败转换为失败 + rise 2 # 脚本连续监测成功后,把服务器从失败标记为成功的次数 + timeout 5 + init_fail +} +global_defs { + script_user root + router_id harbor-ha + enable_script_security + lvs_sync_daemon ens3 VI_1 +} +vrrp_instance VI_1 { + state MASTER + interface ens3 + virtual_router_id 31 # 如果同一个局域网中有多套keepalive,那么要保证该id唯一 + priority 100 + advert_int 1 + authentication { + auth_type PASS + auth_pass k8s-test + } + virtual_ipaddress { + 192.168.122.59 + } + track_script { + check_harbor + } +} +# cat check_harbor.sh +#!/bin/bash +#count=$(docker-compose -f /opt/harbor/docker-compose.yml ps -a|grep healthy|wc -l) +# 不能频繁调用docker-compose 否则会有非常多的临时目录被创建:/tmp/_MEI* +count=$(docker ps |grep goharbor|grep healthy|wc -l) +status=$(ss -tlnp|grep -w 443|wc -l) +if [ $count -ne 11 -a ];then + exit 8 +elif [ $status -lt 2 ];then + exit 9 +else + exit 0 +fi +``` + +keepalived slave服务器跟master区别配置如下 + +1、state BACKUP 与 MASTER + +2、priority master配置为100,slave设置为50 + +``` +# cat docker-compose-keepalived-backup.yaml +version: '3.8' + +# Docker-Compose 单容器使用参考 YAML 配置文件 +# 更多配置参数请参考镜像 README.md 文档中说明 +services: + keepalived: + image: 'dockerhub.kubekey.local/kubesphere/keepalived:2.1' + privileged: true + network_mode: host + volumes: + - ./keepalived-backup.conf:/srv/conf/keepalived/keepalived.conf + - ./check_harbor.sh:/srv/conf/keepalived/check_harbor.sh + container_name: keepalived + restart: on-failure + +# cat keepalived-backup.conf +vrrp_script check_harbor { + script "/srv/conf/keepalived/check_harbor.sh" + interval 10 # 间隔时间,单位为秒,默认1秒 + fall 2 # 脚本几次失败转换为失败 + rise 2 # 脚本连续监测成功后,把服务器从失败标记为成功的次数 + timeout 5 + init_fail +} +global_defs { + script_user root + router_id harbor-ha + enable_script_security + lvs_sync_daemon ens3 VI_1 +} +vrrp_instance VI_1 { + state BACKUP + interface ens3 + virtual_router_id 31 # 如果同一个局域网中有多套keepalive,那么要保证该id唯一 + priority 50 + advert_int 1 + authentication { + auth_type PASS + auth_pass k8s-test + } + virtual_ipaddress { + 192.168.122.59 + } + track_script { + check_harbor + } +} +``` + +经常需要变动的参数是设置keepalived的interface和vip地址值,实际环境下可以参数化keepalived这2个值。 \ No newline at end of file diff --git a/docs/img/harbor_ha01.png b/docs/img/harbor_ha01.png new file mode 100644 index 000000000..3778881f3 Binary files /dev/null and b/docs/img/harbor_ha01.png differ diff --git a/docs/img/harbor_ha02.png b/docs/img/harbor_ha02.png new file mode 100644 index 000000000..d64fb62ce Binary files /dev/null and b/docs/img/harbor_ha02.png differ diff --git a/docs/img/harbor_keepalived.png b/docs/img/harbor_keepalived.png new file mode 100644 index 000000000..5f0016815 Binary files /dev/null and b/docs/img/harbor_keepalived.png differ diff --git a/docs/kubernetes-versions.md b/docs/kubernetes-versions.md index af712ead7..b1ed5a729 100644 --- a/docs/kubernetes-versions.md +++ b/docs/kubernetes-versions.md @@ -91,6 +91,9 @@ | v1.25.11 | :white_check_mark: | | v1.25.12 | :white_check_mark: | | v1.25.13 | :white_check_mark: | +| v1.25.14 | :white_check_mark: | +| v1.25.15 | :white_check_mark: | +| v1.25.16 | :white_check_mark: | | v1.26.0 | :white_check_mark: | | v1.26.1 | :white_check_mark: | | v1.26.2 | :white_check_mark: | @@ -100,11 +103,24 @@ | v1.26.6 | :white_check_mark: | | v1.26.7 | :white_check_mark: | | v1.26.8 | :white_check_mark: | +| v1.26.9 | :white_check_mark: | +| v1.26.10 | :white_check_mark: | +| v1.26.11 | :white_check_mark: | +| v1.26.12 | :white_check_mark: | | v1.27.0 | :white_check_mark: | | v1.27.1 | :white_check_mark: | | v1.27.2 | :white_check_mark: | | v1.27.3 | :white_check_mark: | | v1.27.4 | :white_check_mark: | | v1.27.5 | :white_check_mark: | +| v1.27.6 | :white_check_mark: | +| v1.27.7 | :white_check_mark: | +| v1.27.8 | :white_check_mark: | +| v1.27.9 | :white_check_mark: | | v1.28.0 | :white_check_mark: | | v1.28.1 | :white_check_mark: | +| v1.28.2 | :white_check_mark: | +| v1.28.3 | :white_check_mark: | +| v1.28.4 | :white_check_mark: | +| v1.28.5 | :white_check_mark: | +| v1.29.0 | :white_check_mark: | diff --git a/scripts/harborCreateRegistriesAndReplications.sh b/scripts/harborCreateRegistriesAndReplications.sh new file mode 100644 index 000000000..86375c486 --- /dev/null +++ b/scripts/harborCreateRegistriesAndReplications.sh @@ -0,0 +1,64 @@ +#!/bin/bash + + +function createRegistries() { + + # create registry + curl -k -u $Harbor_UserPwd -X POST -H "Content-Type: application/json" "https://${Harbor_master1_Address}/api/v2.0/registries" -d "{\"name\": \"master1_2_master2\", \"type\": \"harbor\", \"url\":\"https://${master2_Address}:7443\", \"credential\": {\"access_key\": \"${Harbor_User}\", \"access_secret\": \"${Harbor_Passwd}\"}, \"insecure\": true}" + # create registry + curl -k -u $Harbor_UserPwd -X POST -H "Content-Type: application/json" "https://${Harbor_master1_Address}/api/v2.0/registries" -d "{\"name\": \"master1_2_master3\", \"type\": \"harbor\", \"url\":\"https://${master3_Address}:7443\", \"credential\": {\"access_key\": \"${Harbor_User}\", \"access_secret\": \"${Harbor_Passwd}\"}, \"insecure\": true}" + + # create registry + curl -k -u $Harbor_UserPwd -X POST -H "Content-Type: application/json" "https://${Harbor_master2_Address}/api/v2.0/registries" -d "{\"name\": \"master2_2_master1\", \"type\": \"harbor\", \"url\":\"https://${master1_Address}:7443\", \"credential\": {\"access_key\": \"${Harbor_User}\", \"access_secret\": \"${Harbor_Passwd}\"}, \"insecure\": true}" + # create registry + curl -k -u $Harbor_UserPwd -X POST -H "Content-Type: application/json" "https://${Harbor_master2_Address}/api/v2.0/registries" -d "{\"name\": \"master2_2_master3\", \"type\": \"harbor\", \"url\":\"https://${master3_Address}:7443\", \"credential\": {\"access_key\": \"${Harbor_User}\", \"access_secret\": \"${Harbor_Passwd}\"}, \"insecure\": true}" + + # create registry + curl -k -u $Harbor_UserPwd -X POST -H "Content-Type: application/json" "https://${Harbor_master3_Address}/api/v2.0/registries" -d "{\"name\": \"master3_2_master1\", \"type\": \"harbor\", \"url\":\"https://${master1_Address}:7443\", \"credential\": {\"access_key\": \"${Harbor_User}\", \"access_secret\": \"${Harbor_Passwd}\"}, \"insecure\": true}" + # create registry + curl -k -u $Harbor_UserPwd -X POST -H "Content-Type: application/json" "https://${Harbor_master3_Address}/api/v2.0/registries" -d "{\"name\": \"master3_2_master2\", \"type\": \"harbor\", \"url\":\"https://${master2_Address}:7443\", \"credential\": {\"access_key\": \"${Harbor_User}\", \"access_secret\": \"${Harbor_Passwd}\"}, \"insecure\": true}" + +} + +function listRegistries() { + curl -k -u $Harbor_UserPwd -X GET -H "Content-Type: application/json" "https://${Harbor_master1_Address}/api/v2.0/registries" + curl -k -u $Harbor_UserPwd -X GET -H "Content-Type: application/json" "https://${Harbor_master2_Address}/api/v2.0/registries" + curl -k -u $Harbor_UserPwd -X GET -H "Content-Type: application/json" "https://${Harbor_master3_Address}/api/v2.0/registries" + +} + +function createReplication() { + + curl -k -u $Harbor_UserPwd -X POST -H "Content-Type: application/json" "https://${Harbor_master1_Address}/api/v2.0/replication/policies" -d "{\"name\": \"master1_2_master2\", \"enabled\": true, \"deletion\":true, \"override\":true, \"replicate_deletion\":true, \"dest_registry\":{ \"id\": 1, \"name\": \"master1_2_master2\"}, \"trigger\": {\"type\": \"event_based\"}, \"dest_namespace_replace_count\":1 }" + curl -k -u $Harbor_UserPwd -X POST -H "Content-Type: application/json" "https://${Harbor_master1_Address}/api/v2.0/replication/policies" -d "{\"name\": \"master1_2_master3\", \"enabled\": true, \"deletion\":true, \"override\":true, \"replicate_deletion\":true, \"dest_registry\":{ \"id\": 2, \"name\": \"master1_2_master3\"}, \"trigger\": {\"type\": \"event_based\"}, \"dest_namespace_replace_count\":1 }" + + curl -k -u $Harbor_UserPwd -X POST -H "Content-Type: application/json" "https://${Harbor_master2_Address}/api/v2.0/replication/policies" -d "{\"name\": \"master2_2_master1\", \"enabled\": true, \"deletion\":true, \"override\":true, \"replicate_deletion\":true, \"dest_registry\":{ \"id\": 1, \"name\": \"master2_2_master1\"}, \"trigger\": {\"type\": \"event_based\"}, \"dest_namespace_replace_count\":1 }" + curl -k -u $Harbor_UserPwd -X POST -H "Content-Type: application/json" "https://${Harbor_master2_Address}/api/v2.0/replication/policies" -d "{\"name\": \"master2_2_master3\", \"enabled\": true, \"deletion\":true, \"override\":true, \"replicate_deletion\":true, \"dest_registry\":{ \"id\": 2, \"name\": \"master2_2_master3\"}, \"trigger\": {\"type\": \"event_based\"}, \"dest_namespace_replace_count\":1 }" + + curl -k -u $Harbor_UserPwd -X POST -H "Content-Type: application/json" "https://${Harbor_master3_Address}/api/v2.0/replication/policies" -d "{\"name\": \"master3_2_master1\", \"enabled\": true, \"deletion\":true, \"override\":true, \"replicate_deletion\":true, \"dest_registry\":{ \"id\": 1, \"name\": \"master3_2_master1\"}, \"trigger\": {\"type\": \"event_based\"}, \"dest_namespace_replace_count\":1 }" + curl -k -u $Harbor_UserPwd -X POST -H "Content-Type: application/json" "https://${Harbor_master3_Address}/api/v2.0/replication/policies" -d "{\"name\": \"master3_2_master2\", \"enabled\": true, \"deletion\":true, \"override\":true, \"replicate_deletion\":true, \"dest_registry\":{ \"id\": 2, \"name\": \"master3_2_master2\"}, \"trigger\": {\"type\": \"event_based\"}, \"dest_namespace_replace_count\":1 }" +} + +function listReplications() { + + curl -k -u $Harbor_UserPwd -X GET -H "Content-Type: application/json" "https://${Harbor_master1_Address}/api/v2.0/replication/policies" + curl -k -u $Harbor_UserPwd -X GET -H "Content-Type: application/json" "https://${Harbor_master2_Address}/api/v2.0/replication/policies" + curl -k -u $Harbor_UserPwd -X GET -H "Content-Type: application/json" "https://${Harbor_master3_Address}/api/v2.0/replication/policies" +} + +#### main ###### +Harbor_master1_Address=master1:7443 +master1_Address=192.168.122.61 +Harbor_master2_Address=master2:7443 +master2_Address=192.168.122.62 +Harbor_master3_Address=master3:7443 +master3_Address=192.168.122.63 +Harbor_User=admin #登录Harbor的用户 +Harbor_Passwd="Harbor12345" #登录Harbor的用户密码 +Harbor_UserPwd="$Harbor_User:$Harbor_Passwd" + + +createRegistries +listRegistries +createReplication +listReplications diff --git a/scripts/harbor_keepalived/check_harbor.sh b/scripts/harbor_keepalived/check_harbor.sh new file mode 100644 index 000000000..0a3fb0bda --- /dev/null +++ b/scripts/harbor_keepalived/check_harbor.sh @@ -0,0 +1,12 @@ +#!/bin/bash +#count=$(docker-compose -f /opt/harbor/docker-compose.yml ps -a|grep healthy|wc -l) +# 不能频繁调用docker-compose 否则会有非常多的临时目录被创建:/tmp/_MEI* +count=$(docker ps |grep goharbor|grep healthy|wc -l) +status=$(ss -tlnp|grep -w 443|wc -l) +if [ $count -ne 11 -a ];then + exit 8 +elif [ $status -lt 2 ];then + exit 9 +else + exit 0 +fi diff --git a/scripts/harbor_keepalived/docker-compose-keepalived-backup.yaml b/scripts/harbor_keepalived/docker-compose-keepalived-backup.yaml new file mode 100644 index 000000000..7328f96a8 --- /dev/null +++ b/scripts/harbor_keepalived/docker-compose-keepalived-backup.yaml @@ -0,0 +1,14 @@ +version: '3.8' + +# Docker-Compose 单容器使用参考 YAML 配置文件 +# 更多配置参数请参考镜像 README.md 文档中说明 +services: + keepalived: + image: 'registry.cn-shenzhen.aliyuncs.com/colovu/keepalived:2.1' + privileged: true + network_mode: host + volumes: + - ./keepalived-backup.conf:/srv/conf/keepalived/keepalived.conf + - ./check_harbor.sh:/srv/conf/keepalived/check_harbor.sh + container_name: keepalived + restart: on-failure diff --git a/scripts/harbor_keepalived/docker-compose-keepalived-master.yaml b/scripts/harbor_keepalived/docker-compose-keepalived-master.yaml new file mode 100644 index 000000000..64f35aee4 --- /dev/null +++ b/scripts/harbor_keepalived/docker-compose-keepalived-master.yaml @@ -0,0 +1,14 @@ +version: '3.8' + +# Docker-Compose 单容器使用参考 YAML 配置文件 +# 更多配置参数请参考镜像 README.md 文档中说明 +services: + keepalived: + image: 'registry.cn-shenzhen.aliyuncs.com/colovu/keepalived:2.1' + privileged: true + network_mode: host + volumes: + - ./keepalived-master.conf:/srv/conf/keepalived/keepalived.conf + - ./check_harbor.sh:/srv/conf/keepalived/check_harbor.sh + container_name: keepalived + restart: on-failure diff --git a/scripts/harbor_keepalived/keepalived-backup.conf b/scripts/harbor_keepalived/keepalived-backup.conf new file mode 100644 index 000000000..be916c90f --- /dev/null +++ b/scripts/harbor_keepalived/keepalived-backup.conf @@ -0,0 +1,31 @@ +vrrp_script check_harbor { + script "/srv/conf/keepalived/check_harbor.sh" + interval 10 # 间隔时间,单位为秒,默认1秒 + fall 2 # 脚本几次失败转换为失败 + rise 2 # 脚本连续监测成功后,把服务器从失败标记为成功的次数 + timeout 5 + init_fail +} +global_defs { + script_user root + router_id harbor-ha + enable_script_security + lvs_sync_daemon ens3 VI_1 +} +vrrp_instance VI_1 { + state BACKUP + interface ens3 + virtual_router_id 31 # 如果同一个局域网中有多套keepalive,那么要保证该id唯一 + priority 50 + advert_int 1 + authentication { + auth_type PASS + auth_pass k8s-test + } + virtual_ipaddress { + 192.168.122.59 + } + track_script { + check_harbor + } +} diff --git a/scripts/harbor_keepalived/keepalived-master.conf b/scripts/harbor_keepalived/keepalived-master.conf new file mode 100644 index 000000000..de3566e48 --- /dev/null +++ b/scripts/harbor_keepalived/keepalived-master.conf @@ -0,0 +1,31 @@ +vrrp_script check_harbor { + script "/srv/conf/keepalived/check_harbor.sh" + interval 10 # 间隔时间,单位为秒,默认1秒 + fall 2 # 脚本几次失败转换为失败 + rise 2 # 脚本连续监测成功后,把服务器从失败标记为成功的次数 + timeout 5 + init_fail +} +global_defs { + script_user root + router_id harbor-ha + enable_script_security + lvs_sync_daemon ens3 VI_1 +} +vrrp_instance VI_1 { + state MASTER + interface ens3 + virtual_router_id 31 # 如果同一个局域网中有多套keepalive,那么要保证该id唯一 + priority 100 + advert_int 1 + authentication { + auth_type PASS + auth_pass k8s-test + } + virtual_ipaddress { + 192.168.122.59 + } + track_script { + check_harbor + } +} diff --git a/version/components.json b/version/components.json index fab534439..f3f48a45c 100644 --- a/version/components.json +++ b/version/components.json @@ -91,6 +91,9 @@ "v1.25.11": "6ff43cc8266a21c7b62878a0a9507b085bbb079a37b095fab5bcd31f2dbd80e0", "v1.25.12": "293252f0a1727bfad4ef4fe99d704a56ecea45e39b0ea77f629c55da39e377da", "v1.25.13": "4694df9c5d700280c186980907ec8e695364f461b20e868336a71edabac2253e", + "v1.25.14": "6cce9224e8b939bb0c218ab1b047a934a8c2b23f07c7ade4586b5e1a4013c80f", + "v1.25.15": "f79ab4d8f3a11c9f6f1b2c040552d4e1b0462fa9f9ddde7431b990e4b6e387ff", + "v1.25.16": "11c70502ac5bad303b5b4103b9eb5b2a83376cf6a1bce878b6018c6ca44a7d6e", "v1.26.0": "72631449f26b7203701a1b99f6914f31859583a0e247c3ac0f6aaf59ca80af19", "v1.26.1": "1531abfe96e2e9d8af9219192c65d04df8507a46a081ae1e101478e95d2b63da", "v1.26.2": "277d880dc6d79994fd333e49d42943b7c9183b1c4ffdbf9da59f806acec7fd82", @@ -100,14 +103,27 @@ "v1.26.6": "ba699c3c26aaf64ef46d34621de9f3b62e37656943e09f23dc3bf5aa7b3f5094", "v1.26.7": "812e6d0e94a3fc77d3e9d09dbe709190b77408936cc4e960d916e8401be11090", "v1.26.8": "233a89277ca49dbd666b7391c6c0e43c33d2f08052d5b93e9cd0100ee69430c8", + "v1.26.9": "73e128821dd1f799a75c922218d12f6c4618b8e29cc7dae2a7390fb80092d3d9", + "v1.26.10": "27ed1d857f4a315f3d059168c6e25fdbf0559f9c8e59bab6c50e7921f74dadbf", + "v1.26.11": "58f886e39e517ba1a92493f136e80f1b6ea9362966ad9d2accdf2133004161f2", + "v1.26.12": "5a5d65acefb50010859be8ffba8e6e059d552ae357e3101c12c62e747a9416a2", "v1.27.0": "78d0e04705a7bdb76a514d60f60c073b16334b15f57ee87f064354ca8a233e80", "v1.27.1": "c7d32d698e99b90f877025104cb4a9f3f8c707e99e6817940f260135b6d1ad0a", "v1.27.2": "95c4bfb7929900506a42de4d92280f06efe6b47e0a32cbc1f5a1ed737592977a", "v1.27.3": "2cd663f25c2490bd614a6c0ad9089a47ef315caf0dbdf78efd787d5653b1c6e3", "v1.27.4": "7be21d6fb3707fbbe8f0db0403db6234c8af773b941f931bf8248759ee988bcd", "v1.27.5": "35df8efa6e1bc864ed3c48a665caed634a5c46cfd7f41cda5ad66defdfddb2aa", + "v1.27.6": "2bcdd68957ec25d0689bb56f32b4ec86e38463d2691d5ea21cd109c7afa3aa7c", + "v1.27.7": "bc589219a003b3b94c114e4bcf20549a02657a0c6e5c73f588b37817148892d2", + "v1.27.8": "f8864769b8b2d7a14f53eb983f23317ff14d68ab76aba71e9de17ce84c38d4eb", + "v1.27.9": "78dddac376fa2f04116022cb44ed39ccb9cb0104e05c5b21b220d5151e5c0f86", "v1.28.0": "12ea68bfef0377ccedc1a7c98a05ea76907decbcf1e1ec858a60a7b9b73211bb", - "v1.28.1": "6134dbc92dcb83c3bae1a8030f7bb391419b5d13ea94badd3a79b7ece75b2736" + "v1.28.1": "6134dbc92dcb83c3bae1a8030f7bb391419b5d13ea94badd3a79b7ece75b2736", + "v1.28.2": "6a4808230661c69431143db2e200ea2d021c7f1b1085e6353583075471310d00", + "v1.28.3": "ce3848b1dfa562e0fa2f911a3d8e3bb07ba040eea76654d68e213315c8846ac0", + "v1.28.4": "b4d2531b7cddf782f59555436bc098485b5fa6c05afccdeecf0d62d21d84f5bd", + "v1.28.5": "2b54078c5ea9e85b27f162f508e0bf834a2753e52a57e896812ec3dca92fe9cd", + "v1.29.0": "629d4630657caace9c819fd3797f4a70c397fbd41a2a7e464a0507dad675d52c" }, "arm64": { "v1.19.0": "db1c432646e6e6484989b6f7191f3610996ac593409f12574290bfc008ea11f5", @@ -200,6 +216,9 @@ "v1.25.11": "570d87d56a24778bd0854270eeddc8bcfb275f1c711cced5b5948f631e0c3ede", "v1.25.12": "6a22e2e830f9df16a96a1ac5a4034b950b89a0cc90b19dc1fb104b268e4cd251", "v1.25.13": "d5380bd3f0562aee30d888f22b5650c7af54da83d9fe5187821bcedf21885a11", + "v1.25.14": "525181225d963ddbc17765587a7b5919aa68d7264a197f6a1359f32e7f4a2e03", + "v1.25.15": "e3f152ae529dd6363b2748f39d219f87490f3e995e8bd5332e756c4df692f5f4", + "v1.25.16": "55cc8e3c5985858b9f683bf6c7352d76f073d3dc136f450e8761c0ed7092c0f3", "v1.26.0": "652844c9518786273e094825b74a1988c871552dc6ccf71366558e67409859d1", "v1.26.1": "db101c4bb8e33bd69241de227ed317feee6d44dbd674891e1b9e11c6e8b369bb", "v1.26.2": "f210d8617acf7c601196294f7ca97e4330b75dad00df6b8dd12393730c501473", @@ -209,14 +228,27 @@ "v1.26.6": "003c7740750ad92d2ff3d58d4a15015906c120c93c7aa605ba98edd936061542", "v1.26.7": "34192ceac2287029b36e2d6b682e55dee245ae622701dc3b36bd3203019b18d1", "v1.26.8": "f12d5d748abb8586723b78a2f0300f88faf0391f56d4d49f1ad1cef74160a1b5", + "v1.26.9": "14c87cbb9a3fa02308a9546aad192ce2d93e5d1d0296d28ba449079e6a1cb2b2", + "v1.26.10": "1ddcb47ee4f7171736dbacc046a7ceae55411ee09920435c3821b530f4650428", + "v1.26.11": "a13318c1493e58a9f7c4359c79443f3c86a690ec601bcc76308c809d8d61edb8", + "v1.26.12": "2dee03d460e8a1b3f30e5ef48ce94f5eeb4ff4550e65860e6e2d94b368c2cde6", "v1.27.0": "acd805c6783b678ee0068b9dd8165bbfd879c345fd9c25d6a978dbc965f48544", "v1.27.1": "024a59cd6fc76784b597c0c1cf300526e856e8c9fefa5fa7948158929b739551", "v1.27.2": "8f01f363f7c7f92de2f2276124a895503cdc5a60ff549440170880f296b087eb", "v1.27.3": "495e2193ed779d25584b4b532796c2270df0f7139ef15fb89dc7980603615ef4", "v1.27.4": "b4ede8a18ef3d1cfa61e6fbca8fcab02f8eee3d0770d2329490fa7be90a4cae4", "v1.27.5": "3023ef1d2eff885af860e13c8b9fcdb857d259728f16bf992d59c2be522cec82", + "v1.27.6": "faec35315203913b835e9b789d89001a05e072943c960bcf4de1e331d08e10c8", + "v1.27.7": "46d7c43532233906919a53ee0e03ab04ab9e08514392d17a86f058e0364cda4b", + "v1.27.8": "0d0f5b2781d663d314e785d14361aa5a09cfaf6e1694aa3cc731f4f06342ec13", + "v1.27.9": "d3d022842b0b8e4661222e8873249f5acafdbef52fd1bfb98152a582352b3c40", "v1.28.0": "b9b473d2d9136559b19eb465006af77df45c09862cd7ce6673a33aae517ff5ab", - "v1.28.1": "7d2f68917470a5d66bd2a7d62897f59cb4afaeffb2f26c028afa119acd8c3fc8" + "v1.28.1": "7d2f68917470a5d66bd2a7d62897f59cb4afaeffb2f26c028afa119acd8c3fc8", + "v1.28.2": "010789a94cf512d918ec4a3ef8ec734dea0061d89a8293059ef9101ca1bf6bff", + "v1.28.3": "dcb37d78ccdfe9d8dd6f100e188ddc6e3f5570d0c49db68470073683b453a1e7", + "v1.28.4": "a4422780020954436b8e76ab1c59b68c5581a54432dd3e566c4709bb40c8d4f9", + "v1.28.5": "22bb6b3377204e93d008f33ac4924d77adca1478f1ae3b515c03476ba54f1adc", + "v1.29.0": "bbddee2d46d2e1643ae3623698b45b13aa2e858616d61c642f2f49e5bb14c980" } }, "kubelet": { @@ -311,6 +343,9 @@ "v1.25.11": "4801700e29405e49a7e51cccb806decd65ca3a5068d459a40be3b4c5846b9a46", "v1.25.12": "7aa7d0b4512e6d79ada2017c054b07aaf30d4dc0d740449364a5e2c26e2c1842", "v1.25.13": "0399cfd7031cf5f3d7f8485b243a5ef37230e63d105d5f29966f0f81a58a8f6d", + "v1.25.14": "b9d1dbd9e7c1d3bda6249f38d7cd4f63e4188fa31cddd80d5e8ac1ce3a9a4d96", + "v1.25.15": "1136c5717df316c6d4efd96a676574825f771666b7a9148338f0079bb9412720", + "v1.25.16": "b159f4b0ce7987385902faf6b97530489a6340d728a9688c5791d8d18144b4b7", "v1.26.0": "b64949fe696c77565edbe4100a315b6bf8f0e2325daeb762f7e865f16a6e54b5", "v1.26.1": "8b99dd73f309ca1ac4005db638e82f949ffcfb877a060089ec0e729503db8198", "v1.26.2": "e6dd2ee432a093492936ff8505f084b5ed41662f50231f1c11ae08ee8582a3f5", @@ -320,14 +355,27 @@ "v1.26.6": "da82477404414eb342d6b93533f372aa1c41956a57517453ef3d39ebbfdf8cc2", "v1.26.7": "2926ea2cd7fcd644d24a258bdf21e1a8cfd95412b1079914ca46466dae1d74f2", "v1.26.8": "1c68a65a6a0c2230325e29da0cc3eaaef9bbf688a7a0bb8243b4a7ebfe0e3363", + "v1.26.9": "baa2b021ab2f90c342518e2b8981a18de7e1e6b33f11c57e3ff23d40364877a8", + "v1.26.10": "4c27b3a9f332a6762f7240d0784c64775d4db5a1b881eeae05c4561d06c267ec", + "v1.26.11": "a62953f20fa9fedff50c6c5423e68981e3382d92cf04174d5bca5f4d084de0c5", + "v1.26.12": "aed0a351b01f1e6a84a0992ef1265bb0c9994b900162c075df58d0d02517d3df", "v1.27.0": "0b4ed4fcd75d33f5dff3ba17776e6089847fc83064d3f7a3ad59a34e94e60a29", "v1.27.1": "cb2845fff0ce41c400489393da73925d28fbee54cfeb7834cd4d11e622cbd3a7", "v1.27.2": "a0d12afcab3b2836de4a427558d067bebdff040e9b306b0512c93d9d2a066579", "v1.27.3": "c0e18da6a55830cf4910ecd7261597c66ea3f8f58cf44d4adb6bdcb6e2e6f0bf", "v1.27.4": "385f65878dc8b48df0f2bd369535ff273390518b5ac2cc1a1684d65619324704", "v1.27.5": "66df07ab4f9d72028c97ec7e5eea23adc0ab62a209ba2285431456d7d75a5bb3", + "v1.27.6": "daa42f9b6f5e2176bbce0d24d89a05613000630bcddec1fafd2a8d42a523ce9d", + "v1.27.7": "236bc8bc22c52e914d3364c23e273628c63e193365b6a43b8cb013716c1cd2f5", + "v1.27.8": "2e0557b38c5b9a1263eed25a0b84d741453ed9c0c7bd916f80eadaf7edfb7784", + "v1.27.9": "ede60eea3acbac3f35dbb23d7b148f45cf169ebbb20af102d3ce141fc0bac60c", "v1.28.0": "bfb6b977100963f2879a33e5fbaa59a5276ba829a957a6819c936e9c1465f981", - "v1.28.1": "2bc22332f44f8fcd3fce57879fd873f977949ebd261571fbae31fbb2713a5dd3" + "v1.28.1": "2bc22332f44f8fcd3fce57879fd873f977949ebd261571fbae31fbb2713a5dd3", + "v1.28.2": "17edb866636f14eceaad58c56eab12af7ab3be3c78400aff9680635d927f1185", + "v1.28.3": "a3a058b4ba30da01ffe1801cd38fcad58a9022a2d39e080b4b2e0e9749a75ad5", + "v1.28.4": "db2a473b73c3754d4011590f2f0aa877657608499590c6b0f8b40bec96a3e9ba", + "v1.28.5": "bf37335da58182783a8c63866ec1f895b4c436e3ed96bdd87fe3f8ae8004ba1d", + "v1.29.0": "e1c38137db8d8777eed8813646b59bf4d22d19b9011ab11dc28e2e34f6b80a05" }, "arm64": { "v1.19.0": "d8fa5a9739ecc387dfcc55afa91ac6f4b0ccd01f1423c423dbd312d787bbb6bf", @@ -420,6 +468,9 @@ "v1.25.11": "0140cf3aee0b9386fc8430c32bc94c169a6e50640947933733896e01490cbf6c", "v1.25.12": "3402d0fcec5105bb08b917bb5a29a979c674aa10a12a1dfe4e0d80b292f9fe56", "v1.25.13": "7a29aabb40a984f104b88c09312e897bb710e6bb68022537f8700e70971b984b", + "v1.25.14": "3a3d4ac26b26baef43188a6f52d40a20043db3ffdbcbefab8be222b58ce0f713", + "v1.25.15": "9ca686d5fac093bd3dfe72e8614a5d8d482b7e22d6a78ff5a2a639fc54e603b6", + "v1.25.16": "5f379fc59db0efc288236dbd0abd32b1b0206d1c435001b9c0c3996171e20ffd", "v1.26.0": "fb033c1d079cac8babb04a25abecbc6cc1a2afb53f56ef1d73f8dc3b15b3c09e", "v1.26.1": "f4b514162b52d19909cf0ddf0b816d8d7751c5f1de60eda90cd84dcccc56c399", "v1.26.2": "33e77f93d141d3b9e207ae50ff050186dea084ac26f9ec88280f85bab9dad310", @@ -429,14 +480,27 @@ "v1.26.6": "44c2cd64e1317df8252bca1cf196227c543005a3b10d52fb114401cb1617f32f", "v1.26.7": "73e086cfd8cd1cef559e739e19aff2932f8a9e0bdba3c9faeb9185a86d067fbb", "v1.26.8": "0f15e484c4a7a7c3bad9e0aa4d4334ca029b97513fbe03f053201dd937cf316e", + "v1.26.9": "f6b1dcee9960ffe6b778dc91cabef8ce4a7bd06c76378ef2784232709eace6a5", + "v1.26.10": "ddebcc1af7f203a2ee3d80dad0baaf84a4680748839f5583b39cbce4b8afa7f2", + "v1.26.11": "ff8940394446028e75a2b8155e22eccf635f6a128f45dee41e293493d2743d17", + "v1.26.12": "d4406ed5bfd12768c03fc4fbe011a01e5c91b74d1d4b526fe3ac320d13295ffb", "v1.27.0": "37aa2edc7c0c4b3e488518c6a4b44c8aade75a55010534ee2be291220c73d157", "v1.27.1": "dbb09d297d924575654db38ed2fc627e35913c2d4000c34613ac6de4995457d0", "v1.27.2": "810cd9a611e9f084e57c9ee466e33c324b2228d4249ff38c2588a0cc3224f10d", "v1.27.3": "2838fd55340d59f777d7bd7e5989fc72b7a0ca198cf4f3f723cd9956859ce942", "v1.27.4": "c75ad8e7c7ef05c0c021b21a9fe86e92f64db1e4c1bc84e1baf45d8dbb8ba8d1", "v1.27.5": "4e78fafdeb5d61ab6ebcd6e75e968c47001c321bec169bb9bd9f001132de5321", + "v1.27.6": "be579ef4e8fa3e1de9d40a77e4d35d99e535a293f66bf3038cbea9cf803d11e5", + "v1.27.7": "ed5bfa48ee64d5e6cf23ed9fc03ea0593021839429fdc1ea7cc2ebf3f11b6491", + "v1.27.8": "71849182ceb018dc084f499ad28b7b1afb7f23e35ccaf8421941dd5dafef0d4c", + "v1.27.9": "8a14bc3739f5ca3b23d08301c2e769ee58c8d1cecb7243b46b1c098ae77effd7", "v1.28.0": "05dd12e35783cab4960e885ec0e7d0e461989b94297e7bea9018ccbd15c4dce9", - "v1.28.1": "9b7fa64b2785da4a38768377961e227f8da629c56a5df43ca1b665dd07b56f3c" + "v1.28.1": "9b7fa64b2785da4a38768377961e227f8da629c56a5df43ca1b665dd07b56f3c", + "v1.28.2": "32269e9ec38c561d028b65c3048ea6a100e1292cbe9e505565222455c8096577", + "v1.28.3": "64f56e9c55183919153fe59df2c9015dff09c56de13a3cbccc0f04a95b76dab9", + "v1.28.4": "bf203989dd9b3987b8a0d2331dcce6319f834b57df810fafba5a4805d54823ac", + "v1.28.5": "28ddb696eb6e076f2a2f59ccaa2e409785a63346e5bda819717c6e0f58297702", + "v1.29.0": "0e0e4544c2a0a3475529154b7534d0d58683466efa04a2bb2e763b476db0bb16" } }, "kubectl": { @@ -531,6 +595,9 @@ "v1.25.11": "d12bc7d26313546827683ff7b79d0cb2e7ac17cdad4dce138ed518e478b148a7", "v1.25.12": "75842752ea07cb8ee2210df40faa7c61e1317e76d5c7968e380cae83447d4a0f", "v1.25.13": "22c5d5cb95b671ea7d7accd77e60e4a787b6d40a6b8ba4d6c364cb3ca818c29a", + "v1.25.14": "06351e043b8ecd1206854643a2094ccf218180c1b3fab5243f78d2ccfc630ca2", + "v1.25.15": "6428297af0b06d1bb87601258fb61c13d82bf3187b2329b5f38b6f0fec5be575", + "v1.25.16": "5a9bc1d3ebfc7f6f812042d5f97b82730f2bdda47634b67bddf36ed23819ab17", "v1.26.0": "b6769d8ac6a0ed0f13b307d289dc092ad86180b08f5b5044af152808c04950ae", "v1.26.1": "d57be22cfa25f7427cfb538cfc8853d763878f8b36c76ce93830f6f2d67c6e5d", "v1.26.2": "fcf86d21fb1a49b012bce7845cf00081d2dd7a59f424b28621799deceb5227b3", @@ -540,14 +607,27 @@ "v1.26.6": "ee23a539b5600bba9d6a404c6d4ea02af3abee92ad572f1b003d6f5a30c6f8ab", "v1.26.7": "d9dc7741e5f279c28ef32fbbe1daa8ebc36622391c33470efed5eb8426959971", "v1.26.8": "d8e0dba258d1096f95bb6746ca359db2ee8abe226e777f89dc8a5d1bb76795aa", + "v1.26.9": "98ea4a13895e54ba24f57e0d369ff6be0d3906895305d5390197069b1da12ae2", + "v1.26.10": "93ad44b4072669237247bfbc171be816f08e7e9e4260418d2cfdd0da1704ae86", + "v1.26.11": "27c34a0870230d9dd723e1e01114634e396cd2a3d25ced263b769a4bd53e4edd", + "v1.26.12": "8e6af8d68e7b9d2a1eb43255c0da793276e549a34a2b9c3c87a9c26438e7fd71", "v1.27.0": "71a78259d70da9c5540c4cf4cff121f443e863376f68f89a759d90cef3f51e87", "v1.27.1": "7fe3a762d926fb068bae32c399880e946e8caf3d903078bea9b169dcd5c17f6d", "v1.27.2": "4f38ee903f35b300d3b005a9c6bfb9a46a57f92e89ae602ef9c129b91dc6c5a5", "v1.27.3": "fba6c062e754a120bc8105cde1344de200452fe014a8759e06e4eec7ed258a09", "v1.27.4": "4685bfcf732260f72fce58379e812e091557ef1dfc1bc8084226c7891dd6028f", "v1.27.5": "9a091fb65e4cf4e8be3ce9a21c79210177dd7ce31a2998ec638c92f37f058bcd", + "v1.27.6": "2b7adb71c8630904da1b94e262c8c3c477e9609b3c0ed8ae1213a1e156ae38dd", + "v1.27.7": "e5fe510ba6f421958358d3d43b3f0b04c2957d4bc3bb24cf541719af61a06d79", + "v1.27.8": "027b3161e99fa0a7fa529e8f17f73ee2c0807c81c721ca7cf307f6b41c17bc57", + "v1.27.9": "d0caae91072297b2915dd65f6ef3055d27646dce821ec67d18da35ba9a8dc85b", "v1.28.0": "4717660fd1466ec72d59000bb1d9f5cdc91fac31d491043ca62b34398e0799ce", - "v1.28.1": "e7a7d6f9d06fab38b4128785aa80f65c54f6675a0d2abef655259ddd852274e1" + "v1.28.1": "e7a7d6f9d06fab38b4128785aa80f65c54f6675a0d2abef655259ddd852274e1", + "v1.28.2": "c922440b043e5de1afa3c1382f8c663a25f055978cbc6e8423493ec157579ec5", + "v1.28.3": "0c680c90892c43e5ce708e918821f92445d1d244f9b3d7513023bcae9a6246d1", + "v1.28.4": "893c92053adea6edbbd4e959c871f5c21edce416988f968bec565d115383f7b8", + "v1.28.5": "2a44c0841b794d85b7819b505da2ff3acd5950bd1bcd956863714acc80653574", + "v1.29.0": "0e03ab096163f61ab610b33f37f55709d3af8e16e4dcc1eb682882ef80f96fd5" }, "arm64": { "v1.19.0": "d4adf1b6b97252025cb2f7febf55daa3f42dc305822e3da133f77fd33071ec2f", @@ -640,6 +720,9 @@ "v1.25.11": "2eb5109735c1442dd3b91a15ff74e24748efd967a3d7bf1a2b16e7aa78400677", "v1.25.12": "315a1515b7fe254d7aa4f5928007b4f4e586bfd91ea6cbf392718099920dcb8a", "v1.25.13": "90bb3c9126b64f5eee2bef5a584da8bf0a38334e341b427b6986261af5f0d49b", + "v1.25.14": "a52ec9119e390ad872a74fc560a6569b1758a4217fd2b03e966f77aaa2a2b706", + "v1.25.15": "ae213606b3965872b4e97ceb58fce5be796e7b26ea680681e8a3c2b549fe1701", + "v1.25.16": "d6c23c80828092f028476743638a091f2f5e8141273d5228bf06c6671ef46924", "v1.26.0": "79b14e4ddada9e81d2989f36a89faa9e56f8abe6e0246e7bdc305c93c3731ea4", "v1.26.1": "4027cb0a2840bc14ec3f18151b3360dd2d1f6ce730ed5ac28bd846c17e7d73f5", "v1.26.2": "291e85bef77e8440205c873686e9938d7f87c0534e9a491de64e3cc0584295b6", @@ -649,14 +732,27 @@ "v1.26.6": "8261d35cd374c438104bb5257e6c9dafb8443cd0eed8272b219ec5aa17b8ca40", "v1.26.7": "71edc4c6838a7332e5f82abb35642ce7f905059a258690b0a585d3ed6de285b3", "v1.26.8": "e93f836cba409b5ef5341020d9501067a51bf8210cb35649518e5f4d114244cf", + "v1.26.9": "f945c63220b393ddf8df67d87e67ff74b7f56219a670dee38bc597a078588e90", + "v1.26.10": "5752e3908fa1d338eb1fa99a6f39c6a4c27b065cb459da84e35c4ec718879f14", + "v1.26.11": "4a6d2b7204af3cf84cd0e2c670fbb211501050c9a288de49de3c6363d4e0a63e", + "v1.26.12": "b9cfdb6c9a53146330d5694e711c48febb7ec022aea8d16a51b5e12d761580cc", "v1.27.0": "f8e09630211f2b7c6a8cc38835e7dea94708d401f5c84b23a37c70c604602ddc", "v1.27.1": "fd3cb8f16e6ed8aee9955b76e3027ac423b6d1cc7356867310d128082e2db916", "v1.27.2": "1b0966692e398efe71fe59f913eaec44ffd4468cc1acd00bf91c29fa8ff8f578", "v1.27.3": "7bb7fec4e28e0b50b603d64e47629e812408751bd1e0ce059b2fee83b0e3ff6f", "v1.27.4": "5178cbb51dcfff286c20bc847d64dd35cd5993b81a2e3609581377a520a6425d", "v1.27.5": "0158955c59c775165937918f910380ed7b52fca4a26fb41a369734e83aa44874", + "v1.27.6": "7322a6f600de6d0d06cf333bdc24cd2a340bba12920b0c2385c97884c808c810", + "v1.27.7": "61fc334f2c0290270e43fb8a1d4ff07e8cec5642d5a123eb7ab66a134b04ae83", + "v1.27.8": "97ed6739e2803e63fd2d9de78be22d5ba6205bb63179a16ec773063526525a8e", + "v1.27.9": "bda475539fdeda9d8a85a84b967af361af264d0826c121b23b0b62ee9b00cd2d", "v1.28.0": "f5484bd9cac66b183c653abed30226b561f537d15346c605cc81d98095f1717c", - "v1.28.1": "46954a604b784a8b0dc16754cfc3fa26aabca9fd4ffd109cd028bfba99d492f6" + "v1.28.1": "46954a604b784a8b0dc16754cfc3fa26aabca9fd4ffd109cd028bfba99d492f6", + "v1.28.2": "ea6d89b677a8d9df331a82139bb90d9968131530b94eab26cee561531eff4c53", + "v1.28.3": "06511f03e34d8ee350bd55717845e27ebec3116526db7c60092eeb33a475a337", + "v1.28.4": "edf1e17b41891ec15d59dd3cc62bcd2cdce4b0fd9c2ee058b0967b17534457d7", + "v1.28.5": "f87fe017ae3ccfd93df03bf17edd4089672528107f230563b8c9966909661ef2", + "v1.29.0": "8f7a4bd6bae900a4ddab12bd1399aa652c0d59ea508f39b910e111d248893ff7" } }, "etcd": { @@ -680,7 +776,10 @@ "v3.5.4": "b1091166153df1ee0bb29b47fb1943ef0ddf0cd5d07a8fe69827580a08134def", "v3.5.5": "7910a2fdb1863c80b885d06f6729043bff0540f2006bf6af34674df2636cb906", "v3.5.6": "4db32e3bc06dd0999e2171f76a87c1cffed8369475ec7aa7abee9023635670fb", - "v3.5.7": "a43119af79c592a874e8f59c4f23832297849d0c479338f9df36e196b86bc396" + "v3.5.7": "a43119af79c592a874e8f59c4f23832297849d0c479338f9df36e196b86bc396", + "v3.5.8": "d4c1b8d90ad53658f12ffc293afc5694b7bc6cb093af609188649a799e1cc8dc", + "v3.5.9": "d59017044eb776597eca480432081c5bb26f318ad292967029af1f62b588b042", + "v3.5.10": "26e90d024fa2310bc52bb40e7f2132e81640b55f8fc446c00ae07e30af2a44fd" }, "arm64": { "v3.4.13": "1934ebb9f9f6501f706111b78e5e321a7ff8d7792d3d96a76e2d01874e42a300", @@ -702,7 +801,10 @@ "v3.5.4": "8e9c2c28ed6b35f36fd94300541da10e1385f335d677afd8efccdcba026f1fa7", "v3.5.5": "a8d177ae8ecfd1ef025c35ac8c444041d14e67028c1a7b4eda3a69a8dee5f9c3", "v3.5.6": "888e25c9c94702ac1254c7655709b44bb3711ebaabd3cb05439f3dd1f2b51a87", - "v3.5.7": "1a35314900da7db006b198dd917e923459b462128101736c63a3cda57ecdbf51" + "v3.5.7": "1a35314900da7db006b198dd917e923459b462128101736c63a3cda57ecdbf51", + "v3.5.8": "3f4441b293a2d0d4d2f8b2cd9504376e15818f7b865ef4b436e8e6f865f895ff", + "v3.5.9": "bb201c106a61bbab59e2d9f37f4bdff99d50201f513c66b4578741eab581fb28", + "v3.5.10": "ff74a6018d9b2a1320bff30e5a11b4f2f5c2a3d147df8a8bad53c01b9f800ee1" } }, "helm": { @@ -744,7 +846,8 @@ "v3.10.2": "72f1c0fcfb17b41b89087e9232e50f20c606e44a0edc2bb9737e05d1c75b8c4f", "v3.10.3": "cc5223b23fd2ccdf4c80eda0acac7a6a5c8cdb81c5b538240e85fe97aa5bc3fb", "v3.11.0": "930918464763e66f9f99bed076357abc4bc56b040c053fce9884314964ca0fcc", - "v3.11.1": "f5366ce6d2118b0ef7134db08273a058649d88a27deb4b9d3cc0881bb55119a8" + "v3.11.1": "f5366ce6d2118b0ef7134db08273a058649d88a27deb4b9d3cc0881bb55119a8", + "v3.13.1": "77a68582fac7290df476e1e698f7dd70bb496bf1d475e123664e921f4478c567" }, "arm64": { "v3.2.1": "20bb9d66e74f618cd104ca07e4525a8f2f760dd6d5611f7d59b6ac574624d672", @@ -784,7 +887,8 @@ "v3.10.2": "a60d66e54d28529d41bef1309d32f1d6c47ba2201ca4dfdab17a33834c0ffc52", "v3.10.3": "2b75e7112367ca237cd39408353dcfef9b81b1b5cf78e4826bdccb061dbb8dbd", "v3.11.0": "f8ab55641ca83ce6d2ab7c048ed86794c9dc15f7e197fb7c6e7c2ec3c2d76c12", - "v3.11.1": "2de8125127d555a006290f7dcd57235b1d83444a020b3bf7248c77cd6d3a629b" + "v3.11.1": "2de8125127d555a006290f7dcd57235b1d83444a020b3bf7248c77cd6d3a629b", + "v3.13.1": "aa8b2996fa70837083286fb3a33a153105ff11067ae2424b1ae7cf250b0dc353" } }, "kubecni": { @@ -796,7 +900,8 @@ "v1.0.1": "5238fbb2767cbf6aae736ad97a7aa29167525dcd405196dfbc064672a730d3cf", "v1.1.0": "05d46ac19d01669d424ee57401c0deba101763ac494858064b4ea4ffdcc37c5d", "v1.1.1": "b275772da4026d2161bf8a8b41ed4786754c8a93ebfb6564006d5da7f23831e5", - "v1.2.0": "f3a841324845ca6bf0d4091b4fc7f97e18a623172158b72fc3fdcdb9d42d2d37" + "v1.2.0": "f3a841324845ca6bf0d4091b4fc7f97e18a623172158b72fc3fdcdb9d42d2d37", + "v1.3.0": "754a71ed60a4bd08726c3af705a7d55ee3df03122b12e389fdba4bea35d7dd7e" }, "arm64": { "v0.8.2": "922b6a3b864a9849cc5bd1672823b1891094260461c2cdd9718778ca8dcaef82", @@ -806,7 +911,8 @@ "v1.0.1": "2d4528c45bdd0a8875f849a75082bc4eafe95cb61f9bcc10a6db38a031f67226", "v1.1.0": "33fc7b8d9d5be2d7f95e69e6a9e2af206879942f1e6b7615c04017dce5067f1a", "v1.1.1": "16484966a46b4692028ba32d16afd994e079dc2cc63fbc2191d7bfaf5e11f3dd", - "v1.2.0": "525e2b62ba92a1b6f3dc9612449a84aa61652e680f7ebf4eff579795fe464b57" + "v1.2.0": "525e2b62ba92a1b6f3dc9612449a84aa61652e680f7ebf4eff579795fe464b57", + "v1.3.0": "de7a666fd6ad83a228086bd55756db62ef335a193d1b143d910b69f079e30598" } }, "k3s": { @@ -860,7 +966,8 @@ "20.10.22": "945c3a3ddcb79ee7307496c2f39eb3d8372466e8654e63d60bbb462e4a3c1427", "20.10.23": "0ee39f72cc434137d294c14d30897826bad6e24979e421f51a252769ad37e6d1", "23.0.0": "6a03bbda96845b7451be2f6aba69c3816c60a97de318e83fd1b39d1be262d8af", - "23.0.1": "ec8a71e79125d3ca76f7cc295f35eea225f4450e0ffe0775f103e2952ff580f6" + "23.0.1": "ec8a71e79125d3ca76f7cc295f35eea225f4450e0ffe0775f103e2952ff580f6", + "24.0.6": "99792dec613df93169a118b05312a722a63604b868e4c941b1b436abcf3bb70f" }, "arm64": { "20.10.2": "9ea59f249ae92bbaa9831a22f2affa2edc9e824f9daaba831ca51d6d22ef2df5", @@ -886,7 +993,8 @@ "20.10.22": "2c75cd6c3dc9b81cb5bde664c882e4339a2054e09cf09606f9f7dd6970e7f078", "20.10.23": "5c40bb7dcd1aad94be49ad75d24e7fd409119ed0eaad04f5d13c4fddfb397c8a", "23.0.0": "2919ff3448187d4f13cfbe2332707cff3f6dcf2baaac42a34bea8dd21f434f4a", - "23.0.1": "3865f837dbd951b19eeb5f7d87aada2e865b2017e9462fe389f0e5d9a438324d" + "23.0.1": "3865f837dbd951b19eeb5f7d87aada2e865b2017e9462fe389f0e5d9a438324d", + "24.0.6": "d9f58aecc42451503e82e6e0562cafa1812b334c92186a7f486e111e70a0f5bd" } }, "containerd": { @@ -907,7 +1015,22 @@ "1.6.15": "191bb4f6e4afc237efc5c85b5866b6fdfed731bde12cceaa6017a9c7f8aeda02", "1.6.16": "2415b431a900275c14942f87f751e1e13d513c1c2f062322b5ca5a9a2190f22a", "1.6.17": "5f0584d000769d0cf08fc0e25135614ef5bf52971a6069175c78437699f3b8d4", - "1.6.18": "c4e516376a2392520a87abea94baf2045cc3a67e9e0c90c75fb6ed038170561e" + "1.6.18": "c4e516376a2392520a87abea94baf2045cc3a67e9e0c90c75fb6ed038170561e", + "1.6.19": "3262454d9b3581f4d4da0948f77dde1be51cfc42347a1548bc9ab6870b055815", + "1.6.20": "bb9a9ccd6517e2a54da748a9f60dc9aa9d79d19d4724663f2386812f083968e2", + "1.6.21": "04dcc1b99368492caee758583e531392683268197e58156888a3cea2941117b6", + "1.6.22": "5671eb4eba97f0ec98223c84401c9aeb21d0ef16ac3ece3eb8fadd46174d7eab", + "1.6.23": "bcf16bb63a295721a2603e9a56602c5d18e5443df04a9f2c1ca5328f41556fcc", + "1.6.24": "a56fac5ba03c3d6f74ceae14abdc9fafabcba900105e9890c0ac895cc00164ad", + "1.7.0": "b068b05d58025dc9f2fc336674cac0e377a478930f29b48e068f97c783a423f0", + "1.7.1": "9504771bcb816d3b27fab37a6cf76928ee5e95a31eb41510a7d10ae726e01e85", + "1.7.2": "2755c70152ab40856510b4549c2dd530e15f5355eb7bf82868e813c9380e22a7", + "1.7.3": "de7f61aacba88ee647a7dcde1ca77672ec44ab9fb3e58ae90c0efc9b2d8f3068", + "1.7.4": "fc070fabfe3539d46ae5db160d18381270928b3f912e2e800947e9fbd43f510c", + "1.7.5": "33609ae2d5838bc5798306a1ac30d7f2c6a8cff785ca6253d2be8a8b3ccbab25", + "1.7.6": "58408cfa025003e671b0af72183b963363d519543d0d0ba186037e9c57489ffe", + "1.7.7": "371de359d6102c51f6ee2361d08297948d134ce7379e01cb965ceeffa4365fba", + "1.7.8": "5f1d017a5a7359514d6187d6656e88fb2a592d107e6298db7963dbddb9a111d9" }, "arm64": { "1.6.2": "a4b24b3c38a67852daa80f03ec2bc94e31a0f4393477cd7dc1c1a7c2d3eb2a95", @@ -926,7 +1049,22 @@ "1.6.15": "d63e4d27c51e33cd10f8b5621c559f09ece8a65fec66d80551b36cac9e61a07d", "1.6.16": "c2bf51fde02ec9cf8b9c18721bc4f53bd1f19fb2bb3251f41ece61af7347e082", "1.6.17": "7e110faa738bff2f5f0ffd54c4ec2c17c05fd2af6de4877c839794ca3dadd61c", - "1.6.18": "56b83a0bc955edc5ebaa3bd0f788e654b63395be00fcb1bd03ff4bdfe4b5e1e7" + "1.6.18": "56b83a0bc955edc5ebaa3bd0f788e654b63395be00fcb1bd03ff4bdfe4b5e1e7", + "1.6.19": "25a0dd6cce4e1058824d6dc277fc01dc45da92539ccb39bb6c8a481c24d2476e", + "1.6.20": "c3e6a054b18b20fce06c7c3ed53f0989bb4b255c849bede446ebca955f07a9ce", + "1.6.21": "d713d8fbec491705ffe8c33ecc9051a904f6eedc92574928e1d33616f291c583", + "1.6.22": "7882d6e7f4e97dcba041c37592c4cb9e7a5b4d972380c74d959e388b12d57d01", + "1.6.23": "ea7afb82dc5789307e684ef9b4a55ce1ee9a05dc02c2118df640b01207208c45", + "1.6.24": "1d741e9e2d907f02a8b2a46034a28ff9aacdba88c485cef2f4bad18be9ea23ba", + "1.7.0": "e7e5be2d9c92e076f1e2e15c9f0a6e0609ddb75f7616999b843cba92d01e4da2", + "1.7.1": "1f828dc063e3c24b0840b284c5635b5a11b1197d564c97f9e873b220bab2b41b", + "1.7.2": "d75a4ca53d9addd0b2c50172d168b12957e18b2d8b802db2658f2767f15889a6", + "1.7.3": "85d2eaedabff57ac1d7cd3884bf232155c4c46491f6b071982e4f7b684b74445", + "1.7.4": "ea5a04379bd4252fc1e0b7b37f69cd516350c5269054483535d6eab7a0c79d2e", + "1.7.5": "98fc6990820d52d45b56ea2cda808157d4e61bb30ded96887634644c03025fa9", + "1.7.6": "d844a1c8b993e7e9647f73b9814567004dce1287c0529ce55c50519490eafcce", + "1.7.7": "0a104f487193665d2681fcb5ed83f2baa5f97849fe2661188da835c9d4eaf9e3", + "1.7.8": "3fc551e8f51150804d80cc1958a271bd2252b6334f0355244d0faa5da7fa55d1" } }, "runc": { @@ -934,13 +1072,17 @@ "v1.1.1": "5798c85d2c8b6942247ab8d6830ef362924cd72a8e236e77430c3ab1be15f080", "v1.1.2": "e0436dfc5d26ca88f00e84cbdab5801dd9829b1e5ded05dcfc162ce5718c32ce", "v1.1.3": "6e8b24be90fffce6b025d254846da9d2ca6d65125f9139b6354bab0272253d01", - "v1.1.4": "db772be63147a4e747b4fe286c7c16a2edc4a8458bd3092ea46aaee77750e8ce" + "v1.1.4": "db772be63147a4e747b4fe286c7c16a2edc4a8458bd3092ea46aaee77750e8ce", + "v1.1.9": "b9bfdd4cb27cddbb6172a442df165a80bfc0538a676fbca1a6a6c8f4c6933b43", + "v1.1.10": "81f73a59be3d122ab484d7dfe9ddc81030f595cc59968f61c113a9a38a2c113a" }, "arm64": { "v1.1.1": "20c436a736547309371c7ac2a335f5fe5a42b450120e497d09c8dc3902c28444", "v1.1.2": "6ebd968d46d00a3886e9a0cae2e0a7b399e110cf5d7b26e63ce23c1d81ea10ef", "v1.1.3": "00c9ad161a77a01d9dcbd25b1d76fa9822e57d8e4abf26ba8907c98f6bcfcd0f", - "v1.1.4": "dbb71e737eaef454a406ce21fd021bd8f1b35afb7635016745992bbd7c17a223" + "v1.1.4": "dbb71e737eaef454a406ce21fd021bd8f1b35afb7635016745992bbd7c17a223", + "v1.1.9": "b43e9f561e85906f469eef5a7b7992fc586f750f44a0e011da4467e7008c33a0", + "v1.1.10": "4830afd426bdeacbdf9cb8729524aa2ed51790b8c4b28786995925593708f1c8" } }, "crictl": { @@ -951,7 +1093,8 @@ "v1.24.1": "4006d3af110b144865be0d308145e1f90f7b40dfa0b208d82d3d1d25f3b7bf97", "v1.24.2": "53432dd365f7bf045c1e65ee2e44c74df6a0a8f0a798f640a945c8e07ad8682e", "v1.25.0": "86ab210c007f521ac4cdcbcf0ae3fb2e10923e65f16de83e0e1db191a07f0235", - "v1.26.0": "cda5e2143bf19f6b548110ffba0fe3565e03e8743fadd625fee3d62fc4134eed" + "v1.26.0": "cda5e2143bf19f6b548110ffba0fe3565e03e8743fadd625fee3d62fc4134eed", + "v1.28.0": "8dc78774f7cbeaf787994d386eec663f0a3cf24de1ea4893598096cb39ef2508" }, "arm64": { "v1.22.0": "a713c37fade0d96a989bc15ebe906e08ef5c8fe5e107c2161b0665e9963b770e", @@ -960,7 +1103,8 @@ "v1.24.1": "02cc96f03fcd6fbf36746fe9cc29566bf5ddd223b4fcb7e3f948566cee45e6ca", "v1.24.2": "c1410b15d5009287c94eabcc63b14dba68726771fa87fef743867df2eea0a6d5", "v1.25.0": "651c939eca010bbf48cc3932516b194028af0893025f9e366127f5b50ad5c4f4", - "v1.26.0": "b632ca705a98edc8ad7806f4279feaff956ac83aa109bba8a85ed81e6b900599" + "v1.26.0": "b632ca705a98edc8ad7806f4279feaff956ac83aa109bba8a85ed81e6b900599", + "v1.28.0": "06e9224e42bc5e23085751e93cccdac89f7930ba6f7a45b8f8fc70ef663c37c4" } }, "registry": {