add debug functionality to get current loadbalancer config
This commit is contained in:
parent
cabfe98023
commit
a928e41a2a
91
cmd/debug/debug.go
Normal file
91
cmd/debug/debug.go
Normal file
@ -0,0 +1,91 @@
|
|||||||
|
/*
|
||||||
|
Copyright © 2020-2021 The k3d Author(s)
|
||||||
|
|
||||||
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
|
of this software and associated documentation files (the "Software"), to deal
|
||||||
|
in the Software without restriction, including without limitation the rights
|
||||||
|
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||||
|
copies of the Software, and to permit persons to whom the Software is
|
||||||
|
furnished to do so, subject to the following conditions:
|
||||||
|
|
||||||
|
The above copyright notice and this permission notice shall be included in
|
||||||
|
all copies or substantial portions of the Software.
|
||||||
|
|
||||||
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
|
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||||
|
THE SOFTWARE.
|
||||||
|
*/
|
||||||
|
package debug
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
|
||||||
|
"github.com/rancher/k3d/v4/pkg/client"
|
||||||
|
"github.com/rancher/k3d/v4/pkg/runtimes"
|
||||||
|
"github.com/rancher/k3d/v4/pkg/types"
|
||||||
|
log "github.com/sirupsen/logrus"
|
||||||
|
"github.com/spf13/cobra"
|
||||||
|
"gopkg.in/yaml.v2"
|
||||||
|
)
|
||||||
|
|
||||||
|
// NewCmdDebug returns a new cobra command
|
||||||
|
func NewCmdDebug() *cobra.Command {
|
||||||
|
cmd := &cobra.Command{
|
||||||
|
Use: "debug",
|
||||||
|
Hidden: true,
|
||||||
|
Short: "Debug k3d cluster(s)",
|
||||||
|
Long: `Debug k3d cluster(s)`,
|
||||||
|
Run: func(cmd *cobra.Command, args []string) {
|
||||||
|
if err := cmd.Help(); err != nil {
|
||||||
|
log.Errorln("Couldn't get help text")
|
||||||
|
log.Fatalln(err)
|
||||||
|
}
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
cmd.AddCommand(NewCmdDebugLoadbalancer())
|
||||||
|
|
||||||
|
return cmd
|
||||||
|
}
|
||||||
|
|
||||||
|
func NewCmdDebugLoadbalancer() *cobra.Command {
|
||||||
|
cmd := &cobra.Command{
|
||||||
|
Use: "loadbalancer",
|
||||||
|
Aliases: []string{"lb"},
|
||||||
|
Short: "Debug the loadbalancer",
|
||||||
|
Long: `Debug the loadbalancer`,
|
||||||
|
Run: func(cmd *cobra.Command, args []string) {
|
||||||
|
if err := cmd.Help(); err != nil {
|
||||||
|
log.Errorln("Couldn't get help text")
|
||||||
|
log.Fatalln(err)
|
||||||
|
}
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
cmd.AddCommand(&cobra.Command{
|
||||||
|
Use: "get-config",
|
||||||
|
Args: cobra.ExactArgs(1), // cluster name
|
||||||
|
Run: func(cmd *cobra.Command, args []string) {
|
||||||
|
c, err := client.ClusterGet(cmd.Context(), runtimes.SelectedRuntime, &types.Cluster{Name: args[0]})
|
||||||
|
if err != nil {
|
||||||
|
log.Fatalln(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
lbconf, err := client.GetLoadbalancerConfig(cmd.Context(), runtimes.SelectedRuntime, c)
|
||||||
|
if err != nil {
|
||||||
|
log.Fatalln(err)
|
||||||
|
}
|
||||||
|
yamlized, err := yaml.Marshal(lbconf)
|
||||||
|
if err != nil {
|
||||||
|
log.Fatalln(err)
|
||||||
|
}
|
||||||
|
fmt.Println(string(yamlized))
|
||||||
|
},
|
||||||
|
})
|
||||||
|
|
||||||
|
return cmd
|
||||||
|
}
|
@ -34,6 +34,7 @@ import (
|
|||||||
|
|
||||||
"github.com/rancher/k3d/v4/cmd/cluster"
|
"github.com/rancher/k3d/v4/cmd/cluster"
|
||||||
cfg "github.com/rancher/k3d/v4/cmd/config"
|
cfg "github.com/rancher/k3d/v4/cmd/config"
|
||||||
|
"github.com/rancher/k3d/v4/cmd/debug"
|
||||||
"github.com/rancher/k3d/v4/cmd/image"
|
"github.com/rancher/k3d/v4/cmd/image"
|
||||||
"github.com/rancher/k3d/v4/cmd/kubeconfig"
|
"github.com/rancher/k3d/v4/cmd/kubeconfig"
|
||||||
"github.com/rancher/k3d/v4/cmd/node"
|
"github.com/rancher/k3d/v4/cmd/node"
|
||||||
@ -116,6 +117,7 @@ func init() {
|
|||||||
rootCmd.AddCommand(image.NewCmdImage())
|
rootCmd.AddCommand(image.NewCmdImage())
|
||||||
rootCmd.AddCommand(cfg.NewCmdConfig())
|
rootCmd.AddCommand(cfg.NewCmdConfig())
|
||||||
rootCmd.AddCommand(registry.NewCmdRegistry())
|
rootCmd.AddCommand(registry.NewCmdRegistry())
|
||||||
|
rootCmd.AddCommand(debug.NewCmdDebug())
|
||||||
|
|
||||||
rootCmd.AddCommand(&cobra.Command{
|
rootCmd.AddCommand(&cobra.Command{
|
||||||
Use: "version",
|
Use: "version",
|
||||||
|
@ -22,13 +22,17 @@ THE SOFTWARE.
|
|||||||
package client
|
package client
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"bytes"
|
||||||
"context"
|
"context"
|
||||||
"fmt"
|
"fmt"
|
||||||
|
"io/ioutil"
|
||||||
"strings"
|
"strings"
|
||||||
|
|
||||||
"github.com/rancher/k3d/v4/pkg/runtimes"
|
"github.com/rancher/k3d/v4/pkg/runtimes"
|
||||||
|
"github.com/rancher/k3d/v4/pkg/types"
|
||||||
k3d "github.com/rancher/k3d/v4/pkg/types"
|
k3d "github.com/rancher/k3d/v4/pkg/types"
|
||||||
log "github.com/sirupsen/logrus"
|
log "github.com/sirupsen/logrus"
|
||||||
|
"sigs.k8s.io/yaml"
|
||||||
)
|
)
|
||||||
|
|
||||||
// UpdateLoadbalancerConfig updates the loadbalancer config with an updated list of servers belonging to that cluster
|
// UpdateLoadbalancerConfig updates the loadbalancer config with an updated list of servers belonging to that cluster
|
||||||
@ -70,3 +74,38 @@ func UpdateLoadbalancerConfig(ctx context.Context, runtime runtimes.Runtime, clu
|
|||||||
|
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func GetLoadbalancerConfig(ctx context.Context, runtime runtimes.Runtime, cluster *k3d.Cluster) (*types.LoadbalancerConfig, error) {
|
||||||
|
|
||||||
|
if cluster.ServerLoadBalancer == nil {
|
||||||
|
for _, node := range cluster.Nodes {
|
||||||
|
if node.Role == types.LoadBalancerRole {
|
||||||
|
var err error
|
||||||
|
cluster.ServerLoadBalancer, err = NodeGet(ctx, runtime, node)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
reader, err := runtime.ReadFromNode(ctx, types.DefaultLoadbalancerConfigPath, cluster.ServerLoadBalancer)
|
||||||
|
if err != nil {
|
||||||
|
return &k3d.LoadbalancerConfig{}, err
|
||||||
|
}
|
||||||
|
defer reader.Close()
|
||||||
|
|
||||||
|
file, err := ioutil.ReadAll(reader)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
file = bytes.Trim(file[512:], "\x00") // trim control characters, etc.
|
||||||
|
|
||||||
|
currentConfig := &types.LoadbalancerConfig{}
|
||||||
|
if err := yaml.Unmarshal(file, currentConfig); err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
return currentConfig, nil
|
||||||
|
}
|
||||||
|
@ -426,3 +426,23 @@ type RegistryExternal struct {
|
|||||||
Host string `yaml:"host" json:"host"`
|
Host string `yaml:"host" json:"host"`
|
||||||
Port string `yaml:"port" json:"port"`
|
Port string `yaml:"port" json:"port"`
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Loadbalancer
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* LoadbalancerConfig defines the coarse file structure to configure the k3d-proxy
|
||||||
|
* Example:
|
||||||
|
* ports:
|
||||||
|
* 1234.tcp:
|
||||||
|
* - k3d-k3s-default-server-0
|
||||||
|
* - k3d-k3s-default-server-1
|
||||||
|
* 4321.udp:
|
||||||
|
* - k3d-k3s-default-agent-0
|
||||||
|
* - k3d-k3s-default-agent-1
|
||||||
|
*/
|
||||||
|
type LoadbalancerConfig struct {
|
||||||
|
Ports map[string][]string `yaml:"ports"`
|
||||||
|
}
|
||||||
|
|
||||||
|
const DefaultLoadbalancerConfigPath = "/etc/confd/portmap.yaml"
|
||||||
|
Loading…
Reference in New Issue
Block a user