mirror of
https://github.com/kubeshark/kubeshark.git
synced 2025-07-20 03:01:02 +00:00
🐛 Fix the check
command
This commit is contained in:
parent
cae3b4fe17
commit
0e31fce585
11
cmd/check.go
11
cmd/check.go
@ -1,9 +1,6 @@
|
|||||||
package cmd
|
package cmd
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"github.com/creasty/defaults"
|
|
||||||
"github.com/kubeshark/kubeshark/config/configStructs"
|
|
||||||
"github.com/rs/zerolog/log"
|
|
||||||
"github.com/spf13/cobra"
|
"github.com/spf13/cobra"
|
||||||
)
|
)
|
||||||
|
|
||||||
@ -18,12 +15,4 @@ var checkCmd = &cobra.Command{
|
|||||||
|
|
||||||
func init() {
|
func init() {
|
||||||
rootCmd.AddCommand(checkCmd)
|
rootCmd.AddCommand(checkCmd)
|
||||||
|
|
||||||
defaultCheckConfig := configStructs.CheckConfig{}
|
|
||||||
if err := defaults.Set(&defaultCheckConfig); err != nil {
|
|
||||||
log.Error().Err(err).Send()
|
|
||||||
}
|
|
||||||
|
|
||||||
checkCmd.Flags().Bool(configStructs.PreTapCheckName, defaultCheckConfig.PreTap, "Check pre-tap Kubeshark installation for potential problems")
|
|
||||||
checkCmd.Flags().Bool(configStructs.ImagePullCheckName, defaultCheckConfig.ImagePull, "Test connectivity to container image registry by creating and removing a temporary pod in 'default' namespace")
|
|
||||||
}
|
}
|
||||||
|
@ -14,7 +14,7 @@ import (
|
|||||||
)
|
)
|
||||||
|
|
||||||
func ImagePullInCluster(ctx context.Context, kubernetesProvider *kubernetes.Provider) bool {
|
func ImagePullInCluster(ctx context.Context, kubernetesProvider *kubernetes.Provider) bool {
|
||||||
log.Info().Msg("[image-pull-in-cluster]")
|
log.Info().Str("procedure", "image-pull-in-cluster").Msg("Checking:")
|
||||||
|
|
||||||
namespace := "default"
|
namespace := "default"
|
||||||
podName := "kubeshark-test"
|
podName := "kubeshark-test"
|
||||||
@ -92,6 +92,8 @@ func checkImagePulled(ctx context.Context, kubernetesProvider *kubernetes.Provid
|
|||||||
}
|
}
|
||||||
|
|
||||||
func createImagePullInClusterPod(ctx context.Context, kubernetesProvider *kubernetes.Provider, namespace string, podName string) error {
|
func createImagePullInClusterPod(ctx context.Context, kubernetesProvider *kubernetes.Provider, namespace string, podName string) error {
|
||||||
|
image := "kubeshark/worker:latest"
|
||||||
|
log.Info().Str("image", image).Msg("Testing image pull:")
|
||||||
var zero int64
|
var zero int64
|
||||||
pod := &core.Pod{
|
pod := &core.Pod{
|
||||||
ObjectMeta: metav1.ObjectMeta{
|
ObjectMeta: metav1.ObjectMeta{
|
||||||
@ -101,7 +103,7 @@ func createImagePullInClusterPod(ctx context.Context, kubernetesProvider *kubern
|
|||||||
Containers: []core.Container{
|
Containers: []core.Container{
|
||||||
{
|
{
|
||||||
Name: "probe",
|
Name: "probe",
|
||||||
Image: "kubeshark/busybox",
|
Image: "kubeshark/worker:latest",
|
||||||
ImagePullPolicy: "Always",
|
ImagePullPolicy: "Always",
|
||||||
Command: []string{"cat"},
|
Command: []string{"cat"},
|
||||||
Stdin: true,
|
Stdin: true,
|
||||||
|
@ -8,7 +8,7 @@ import (
|
|||||||
)
|
)
|
||||||
|
|
||||||
func KubernetesApi() (*kubernetes.Provider, *semver.SemVersion, bool) {
|
func KubernetesApi() (*kubernetes.Provider, *semver.SemVersion, bool) {
|
||||||
log.Info().Msg("[kubernetes-api]")
|
log.Info().Str("procedure", "kubernetes-api").Msg("Checking:")
|
||||||
|
|
||||||
kubernetesProvider, err := kubernetes.NewProvider(config.Config.KubeConfigPath(), config.Config.KubeContext)
|
kubernetesProvider, err := kubernetes.NewProvider(config.Config.KubeConfigPath(), config.Config.KubeContext)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
@ -13,7 +13,7 @@ import (
|
|||||||
)
|
)
|
||||||
|
|
||||||
func TapKubernetesPermissions(ctx context.Context, embedFS embed.FS, kubernetesProvider *kubernetes.Provider) bool {
|
func TapKubernetesPermissions(ctx context.Context, embedFS embed.FS, kubernetesProvider *kubernetes.Provider) bool {
|
||||||
log.Info().Msg("[kubernetes-permissions]")
|
log.Info().Str("procedure", "kubernetes-permissions").Msg("Checking:")
|
||||||
|
|
||||||
var filePath string
|
var filePath string
|
||||||
if config.Config.IsNsRestrictedMode() {
|
if config.Config.IsNsRestrictedMode() {
|
||||||
|
@ -10,7 +10,7 @@ import (
|
|||||||
)
|
)
|
||||||
|
|
||||||
func KubernetesResources(ctx context.Context, kubernetesProvider *kubernetes.Provider) bool {
|
func KubernetesResources(ctx context.Context, kubernetesProvider *kubernetes.Provider) bool {
|
||||||
log.Info().Msg("[k8s-components]")
|
log.Info().Str("procedure", "k8s-components").Msg("Checking:")
|
||||||
|
|
||||||
exist, err := kubernetesProvider.DoesNamespaceExist(ctx, config.Config.ResourcesNamespace)
|
exist, err := kubernetesProvider.DoesNamespaceExist(ctx, config.Config.ResourcesNamespace)
|
||||||
allResourcesExist := checkResourceExist(config.Config.ResourcesNamespace, "namespace", exist, err)
|
allResourcesExist := checkResourceExist(config.Config.ResourcesNamespace, "namespace", exist, err)
|
||||||
|
@ -1,19 +1,22 @@
|
|||||||
package check
|
package check
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"fmt"
|
||||||
|
|
||||||
"github.com/kubeshark/kubeshark/kubernetes"
|
"github.com/kubeshark/kubeshark/kubernetes"
|
||||||
"github.com/kubeshark/kubeshark/semver"
|
"github.com/kubeshark/kubeshark/semver"
|
||||||
|
"github.com/kubeshark/kubeshark/utils"
|
||||||
"github.com/rs/zerolog/log"
|
"github.com/rs/zerolog/log"
|
||||||
)
|
)
|
||||||
|
|
||||||
func KubernetesVersion(kubernetesVersion *semver.SemVersion) bool {
|
func KubernetesVersion(kubernetesVersion *semver.SemVersion) bool {
|
||||||
log.Info().Msg("[kubernetes-api]")
|
log.Info().Str("procedure", "kubernetes-version").Msg("Checking:")
|
||||||
|
|
||||||
if err := kubernetes.ValidateKubernetesVersion(kubernetesVersion); err != nil {
|
if err := kubernetes.ValidateKubernetesVersion(kubernetesVersion); err != nil {
|
||||||
log.Error().Err(err).Msg("Not running the minimum Kubernetes API version!")
|
log.Error().Str("k8s-version", string(*kubernetesVersion)).Err(err).Msg(fmt.Sprintf(utils.Red, "The cluster does not have the minimum required Kubernetes API version!"))
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
|
|
||||||
log.Info().Msg("Running the minimum Kubernetes API version")
|
log.Info().Str("k8s-version", string(*kubernetesVersion)).Msg("Minimum required Kubernetes API version is passed.")
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
|
@ -1,9 +1,6 @@
|
|||||||
package check
|
package check
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"context"
|
|
||||||
"regexp"
|
|
||||||
|
|
||||||
"github.com/kubeshark/kubeshark/config"
|
"github.com/kubeshark/kubeshark/config"
|
||||||
"github.com/kubeshark/kubeshark/internal/connect"
|
"github.com/kubeshark/kubeshark/internal/connect"
|
||||||
"github.com/kubeshark/kubeshark/kubernetes"
|
"github.com/kubeshark/kubeshark/kubernetes"
|
||||||
@ -11,72 +8,33 @@ import (
|
|||||||
)
|
)
|
||||||
|
|
||||||
func ServerConnection(kubernetesProvider *kubernetes.Provider) bool {
|
func ServerConnection(kubernetesProvider *kubernetes.Provider) bool {
|
||||||
log.Info().Msg("[hub-connectivity]")
|
log.Info().Str("procedure", "server-connectivity").Msg("Checking:")
|
||||||
|
|
||||||
serverUrl := kubernetes.GetLocalhostOnPort(config.Config.Hub.PortForward.SrcPort)
|
var connectedToHub, connectedToFront bool
|
||||||
|
|
||||||
connector := connect.NewConnector(serverUrl, 1, connect.DefaultTimeout)
|
if err := checkProxy(kubernetes.GetLocalhostOnPort(config.Config.Hub.PortForward.SrcPort), "/echo", kubernetesProvider); err != nil {
|
||||||
if err := connector.TestConnection(""); err == nil {
|
|
||||||
log.Info().Msg("Found Kubeshark server tunnel available and connected successfully to Hub!")
|
|
||||||
return true
|
|
||||||
}
|
|
||||||
|
|
||||||
connectedToHub := false
|
|
||||||
|
|
||||||
if err := checkProxy(serverUrl, kubernetesProvider); err != nil {
|
|
||||||
log.Error().Err(err).Msg("Couldn't connect to Hub using proxy!")
|
log.Error().Err(err).Msg("Couldn't connect to Hub using proxy!")
|
||||||
} else {
|
} else {
|
||||||
connectedToHub = true
|
connectedToHub = true
|
||||||
log.Info().Msg("Connected successfully to Hub using proxy.")
|
log.Info().Msg("Connected successfully to Hub using proxy.")
|
||||||
}
|
}
|
||||||
|
|
||||||
if err := checkPortForward(serverUrl, kubernetesProvider); err != nil {
|
if err := checkProxy(kubernetes.GetLocalhostOnPort(config.Config.Front.PortForward.SrcPort), "", kubernetesProvider); err != nil {
|
||||||
log.Error().Err(err).Msg("Couldn't connect to Hub using port-forward!")
|
log.Error().Err(err).Msg("Couldn't connect to Front using proxy!")
|
||||||
} else {
|
} else {
|
||||||
connectedToHub = true
|
connectedToFront = true
|
||||||
log.Info().Msg("Connected successfully to Hub using port-forward.")
|
log.Info().Msg("Connected successfully to Front using proxy.")
|
||||||
}
|
}
|
||||||
|
|
||||||
return connectedToHub
|
return connectedToHub && connectedToFront
|
||||||
}
|
|
||||||
|
|
||||||
func checkProxy(serverUrl string, kubernetesProvider *kubernetes.Provider) error {
|
|
||||||
ctx, cancel := context.WithCancel(context.Background())
|
|
||||||
defer cancel()
|
|
||||||
|
|
||||||
httpServer, err := kubernetes.StartProxy(kubernetesProvider, config.Config.Tap.ProxyHost, config.Config.Hub.PortForward.SrcPort, config.Config.Hub.PortForward.DstPort, config.Config.ResourcesNamespace, kubernetes.HubServiceName, cancel)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func checkProxy(serverUrl string, path string, kubernetesProvider *kubernetes.Provider) error {
|
||||||
|
log.Info().Str("url", serverUrl).Msg("Connecting:")
|
||||||
connector := connect.NewConnector(serverUrl, connect.DefaultRetries, connect.DefaultTimeout)
|
connector := connect.NewConnector(serverUrl, connect.DefaultRetries, connect.DefaultTimeout)
|
||||||
if err := connector.TestConnection(""); err != nil {
|
if err := connector.TestConnection(path); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
if err := httpServer.Shutdown(ctx); err != nil {
|
|
||||||
log.Error().Err(err).Msg("While stopping the proxy!")
|
|
||||||
}
|
|
||||||
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func checkPortForward(serverUrl string, kubernetesProvider *kubernetes.Provider) error {
|
|
||||||
ctx, cancel := context.WithCancel(context.Background())
|
|
||||||
defer cancel()
|
|
||||||
|
|
||||||
podRegex, _ := regexp.Compile(kubernetes.HubPodName)
|
|
||||||
forwarder, err := kubernetes.NewPortForward(kubernetesProvider, config.Config.ResourcesNamespace, podRegex, config.Config.Tap.GuiPort, config.Config.Tap.GuiPort, ctx, cancel)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
connector := connect.NewConnector(serverUrl, connect.DefaultRetries, connect.DefaultTimeout)
|
|
||||||
if err := connector.TestConnection(""); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
forwarder.Close()
|
|
||||||
|
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
@ -4,9 +4,9 @@ import (
|
|||||||
"context"
|
"context"
|
||||||
"embed"
|
"embed"
|
||||||
"fmt"
|
"fmt"
|
||||||
|
"os"
|
||||||
|
|
||||||
"github.com/kubeshark/kubeshark/cmd/check"
|
"github.com/kubeshark/kubeshark/cmd/check"
|
||||||
"github.com/kubeshark/kubeshark/config"
|
|
||||||
"github.com/kubeshark/kubeshark/utils"
|
"github.com/kubeshark/kubeshark/utils"
|
||||||
"github.com/rs/zerolog/log"
|
"github.com/rs/zerolog/log"
|
||||||
)
|
)
|
||||||
@ -17,7 +17,7 @@ var (
|
|||||||
)
|
)
|
||||||
|
|
||||||
func runKubesharkCheck() {
|
func runKubesharkCheck() {
|
||||||
log.Info().Msg("Kubeshark checks...")
|
log.Info().Msg("Checking the deployment...")
|
||||||
|
|
||||||
ctx, cancel := context.WithCancel(context.Background())
|
ctx, cancel := context.WithCancel(context.Background())
|
||||||
defer cancel() // cancel will be called when this function exits
|
defer cancel() // cancel will be called when this function exits
|
||||||
@ -28,19 +28,13 @@ func runKubesharkCheck() {
|
|||||||
checkPassed = check.KubernetesVersion(kubernetesVersion)
|
checkPassed = check.KubernetesVersion(kubernetesVersion)
|
||||||
}
|
}
|
||||||
|
|
||||||
if config.Config.Check.PreTap || config.Config.Check.ImagePull {
|
|
||||||
if config.Config.Check.PreTap {
|
|
||||||
if checkPassed {
|
if checkPassed {
|
||||||
checkPassed = check.TapKubernetesPermissions(ctx, embedFS, kubernetesProvider)
|
checkPassed = check.TapKubernetesPermissions(ctx, embedFS, kubernetesProvider)
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
if config.Config.Check.ImagePull {
|
|
||||||
if checkPassed {
|
if checkPassed {
|
||||||
checkPassed = check.ImagePullInCluster(ctx, kubernetesProvider)
|
checkPassed = check.ImagePullInCluster(ctx, kubernetesProvider)
|
||||||
}
|
}
|
||||||
}
|
|
||||||
} else {
|
|
||||||
if checkPassed {
|
if checkPassed {
|
||||||
checkPassed = check.KubernetesResources(ctx, kubernetesProvider)
|
checkPassed = check.KubernetesResources(ctx, kubernetesProvider)
|
||||||
}
|
}
|
||||||
@ -48,11 +42,14 @@ func runKubesharkCheck() {
|
|||||||
if checkPassed {
|
if checkPassed {
|
||||||
checkPassed = check.ServerConnection(kubernetesProvider)
|
checkPassed = check.ServerConnection(kubernetesProvider)
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
if checkPassed {
|
if checkPassed {
|
||||||
log.Info().Msg(fmt.Sprintf("Status check results are %v", fmt.Sprintf(utils.Green, "√")))
|
log.Info().Msg(fmt.Sprintf(utils.Green, "All checks are passed."))
|
||||||
} else {
|
} else {
|
||||||
log.Info().Msg(fmt.Sprintf("Status check results are %v", fmt.Sprintf(utils.Red, "✗")))
|
log.Error().
|
||||||
|
Str("command1", "kubeshark clean").
|
||||||
|
Str("command2", "kubeshark tap").
|
||||||
|
Msg(fmt.Sprintf(utils.Red, "There are issues in your deployment! Run these commands:"))
|
||||||
|
os.Exit(1)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -58,7 +58,6 @@ type ConfigStruct struct {
|
|||||||
Hub HubConfig `yaml:"hub"`
|
Hub HubConfig `yaml:"hub"`
|
||||||
Front FrontConfig `yaml:"front"`
|
Front FrontConfig `yaml:"front"`
|
||||||
Tap configStructs.TapConfig `yaml:"tap"`
|
Tap configStructs.TapConfig `yaml:"tap"`
|
||||||
Check configStructs.CheckConfig `yaml:"check"`
|
|
||||||
View configStructs.ViewConfig `yaml:"view"`
|
View configStructs.ViewConfig `yaml:"view"`
|
||||||
Logs configStructs.LogsConfig `yaml:"logs"`
|
Logs configStructs.LogsConfig `yaml:"logs"`
|
||||||
Config configStructs.ConfigConfig `yaml:"config,omitempty"`
|
Config configStructs.ConfigConfig `yaml:"config,omitempty"`
|
||||||
|
@ -1,11 +0,0 @@
|
|||||||
package configStructs
|
|
||||||
|
|
||||||
const (
|
|
||||||
PreTapCheckName = "pre-tap"
|
|
||||||
ImagePullCheckName = "image-pull"
|
|
||||||
)
|
|
||||||
|
|
||||||
type CheckConfig struct {
|
|
||||||
PreTap bool `yaml:"pre-tap"`
|
|
||||||
ImagePull bool `yaml:"image-pull"`
|
|
||||||
}
|
|
Loading…
Reference in New Issue
Block a user