add helper fucns for drivers
parent
9acc975e17
commit
dbfd16f21e
|
@ -763,35 +763,6 @@ func memoryLimits(drvName string) (int, int, error) {
|
||||||
return sysLimit, containerLimit, nil
|
return sysLimit, containerLimit, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func myabeAdviceDockerResources(containerLimit int, sysLimit int, cpus int, drvName string) {
|
|
||||||
if drvName == oci.Docker && runtime.GOOS != "linux" {
|
|
||||||
if containerLimit < 1991 {
|
|
||||||
out.T(out.Conflict, `Your Docker Desktop has only {{.container_limit}} memory. Increase memory to at least 2.5 GB or more:
|
|
||||||
|
|
||||||
Docker Icon > Settings > Resources > Memory
|
|
||||||
|
|
||||||
`, out.V{"container_limit": containerLimit})
|
|
||||||
// for users with more than 8 GB advice 3 GB
|
|
||||||
} else if containerLimit < 2997 && sysLimit > 8000 {
|
|
||||||
out.T(out.Tip, `Your system has {{.system_limit}}mb memory but Docker has only {{.container_limit}}mb. For a better performance increase to at least 3 GB.
|
|
||||||
|
|
||||||
Docker Icon > Settings > Resources > Memory
|
|
||||||
|
|
||||||
`, out.V{"container_limit": containerLimit, "system_limit": sysLimit})
|
|
||||||
}
|
|
||||||
if cpus < 2 {
|
|
||||||
out.T(out.Conflict, `Your Docker Desktop has less than 2 CPUs. Increase CPUs for Docker Desktop.
|
|
||||||
|
|
||||||
Docker icon > Settings > Resources > CPUs
|
|
||||||
|
|
||||||
`, out.V{"container_limit": containerLimit})
|
|
||||||
out.T(out.Documentation, "https://docs.docker.com/config/containers/resource_constraints/")
|
|
||||||
exit.UsageT("Ensure your {{.driver_name}} system has enough CPUs. The minimum allowed is 2 CPUs.", out.V{"driver_name": viper.GetString("driver")})
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// suggestMemoryAllocation calculates the default memory footprint in MB
|
// suggestMemoryAllocation calculates the default memory footprint in MB
|
||||||
func suggestMemoryAllocation(sysLimit int, containerLimit int, nodes int) int {
|
func suggestMemoryAllocation(sysLimit int, containerLimit int, nodes int) int {
|
||||||
if mem := viper.GetInt(memory); mem != 0 {
|
if mem := viper.GetInt(memory); mem != 0 {
|
||||||
|
@ -831,11 +802,13 @@ func suggestMemoryAllocation(sysLimit int, containerLimit int, nodes int) int {
|
||||||
}
|
}
|
||||||
|
|
||||||
// validateMemorySize validates the memory size matches the minimum recommended
|
// validateMemorySize validates the memory size matches the minimum recommended
|
||||||
func validateMemorySize() {
|
func validateMemorySize(req int, drvName string) {
|
||||||
req, err := util.CalculateSizeInMB(viper.GetString(memory))
|
|
||||||
|
sysLimit, containerLimit, err := memoryLimits(drvName)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
exit.WithCodeT(exit.Config, "Unable to parse memory '{{.memory}}': {{.error}}", out.V{"memory": viper.GetString(memory), "error": err})
|
glog.Warningf("Unable to query memory limits: %v", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
if req < minUsableMem && !viper.GetBool(force) {
|
if req < minUsableMem && !viper.GetBool(force) {
|
||||||
exit.WithCodeT(exit.Config, "Requested memory allocation {{.requested}}MB is less than the usable minimum of {{.minimum}}MB",
|
exit.WithCodeT(exit.Config, "Requested memory allocation {{.requested}}MB is less than the usable minimum of {{.minimum}}MB",
|
||||||
out.V{"requested": req, "mininum": minUsableMem})
|
out.V{"requested": req, "mininum": minUsableMem})
|
||||||
|
@ -844,12 +817,28 @@ func validateMemorySize() {
|
||||||
out.T(out.Notice, "Requested memory allocation ({{.requested}}MB) is less than the recommended minimum {{.recommended}}MB. Kubernetes may crash unexpectedly.",
|
out.T(out.Notice, "Requested memory allocation ({{.requested}}MB) is less than the recommended minimum {{.recommended}}MB. Kubernetes may crash unexpectedly.",
|
||||||
out.V{"requested": req, "recommended": minRecommendedMem})
|
out.V{"requested": req, "recommended": minRecommendedMem})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if driver.IsDockerDesktop(drvName) {
|
||||||
|
if containerLimit < 1991 {
|
||||||
|
out.T(out.Tip, `Increase Docker for Desktop memory to at least 2.5 GB or more:
|
||||||
|
|
||||||
|
Docker for Desktop > Settings > Resources > Memory
|
||||||
|
|
||||||
|
`)
|
||||||
|
} else if containerLimit < 2997 && sysLimit > 8000 { // for users with more than 8 GB advice 3 GB
|
||||||
|
out.T(out.Tip, `Your system has {{.system_limit}}MB memory but Docker has only {{.container_limit}}MB. For a better performance increase to at least 3 GB.
|
||||||
|
|
||||||
|
Docker for Desktop > Settings > Resources > Memory
|
||||||
|
|
||||||
|
`, out.V{"container_limit": containerLimit, "system_limit": sysLimit})
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// validateCPUCount validates the cpu count matches the minimum recommended
|
// validateCPUCount validates the cpu count matches the minimum recommended
|
||||||
func validateCPUCount(local bool) {
|
func validateCPUCount(drvName string) {
|
||||||
var cpuCount int
|
var cpuCount int
|
||||||
if local {
|
if driver.BareMetal(drvName) {
|
||||||
// Uses the gopsutil cpu package to count the number of physical cpu cores
|
// Uses the gopsutil cpu package to count the number of physical cpu cores
|
||||||
ci, err := cpu.Counts(false)
|
ci, err := cpu.Counts(false)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
@ -863,6 +852,25 @@ func validateCPUCount(local bool) {
|
||||||
if cpuCount < minimumCPUS && !viper.GetBool(force) {
|
if cpuCount < minimumCPUS && !viper.GetBool(force) {
|
||||||
exit.UsageT("Requested cpu count {{.requested_cpus}} is less than the minimum allowed of {{.minimum_cpus}}", out.V{"requested_cpus": cpuCount, "minimum_cpus": minimumCPUS})
|
exit.UsageT("Requested cpu count {{.requested_cpus}} is less than the minimum allowed of {{.minimum_cpus}}", out.V{"requested_cpus": cpuCount, "minimum_cpus": minimumCPUS})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if driver.IsKIC((drvName)) {
|
||||||
|
si, err := cachedKicSystemInfo(drvName)
|
||||||
|
if err != nil {
|
||||||
|
out.WarningT("Failed to verify '{{.driver_name}} info', ensure your {{.driver_name}} is running healthy.", out.V{"driver_namee": drvName})
|
||||||
|
}
|
||||||
|
if si.CPUs < 2 {
|
||||||
|
if drvName == oci.Docker {
|
||||||
|
out.T(out.Conflict, `Your Docker Desktop has less than 2 CPUs. Increase CPUs for Docker Desktop.
|
||||||
|
|
||||||
|
Docker icon > Settings > Resources > CPUs
|
||||||
|
|
||||||
|
`)
|
||||||
|
}
|
||||||
|
out.T(out.Documentation, "https://docs.docker.com/config/containers/resource_constraints/")
|
||||||
|
exit.UsageT("Ensure your {{.driver_name}} system has enough CPUs. The minimum allowed is 2 CPUs.", out.V{"driver_name": driver.NameForHumans(viper.GetString("driver"))})
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// validateFlags validates the supplied flags against known bad combinations
|
// validateFlags validates the supplied flags against known bad combinations
|
||||||
|
@ -879,14 +887,18 @@ func validateFlags(cmd *cobra.Command, drvName string) {
|
||||||
}
|
}
|
||||||
|
|
||||||
if cmd.Flags().Changed(cpus) {
|
if cmd.Flags().Changed(cpus) {
|
||||||
validateCPUCount(driver.BareMetal(drvName))
|
|
||||||
if !driver.HasResourceLimits(drvName) {
|
if !driver.HasResourceLimits(drvName) {
|
||||||
out.WarningT("The '{{.name}}' driver does not respect the --cpus flag", out.V{"name": drvName})
|
out.WarningT("The '{{.name}}' driver does not respect the --cpus flag", out.V{"name": drvName})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
validateCPUCount(drvName)
|
||||||
|
|
||||||
if cmd.Flags().Changed(memory) {
|
if cmd.Flags().Changed(memory) {
|
||||||
validateMemorySize()
|
req, err := util.CalculateSizeInMB(viper.GetString(memory))
|
||||||
|
if err != nil {
|
||||||
|
exit.WithCodeT(exit.Config, "Unable to parse memory '{{.memory}}': {{.error}}", out.V{"memory": viper.GetString(memory), "error": err})
|
||||||
|
}
|
||||||
|
validateMemorySize(req, drvName)
|
||||||
if !driver.HasResourceLimits(drvName) {
|
if !driver.HasResourceLimits(drvName) {
|
||||||
out.WarningT("The '{{.name}}' driver does not respect the --memory flag", out.V{"name": drvName})
|
out.WarningT("The '{{.name}}' driver does not respect the --memory flag", out.V{"name": drvName})
|
||||||
}
|
}
|
||||||
|
|
|
@ -233,13 +233,15 @@ func generateClusterConfig(cmd *cobra.Command, existing *config.ClusterConfig, k
|
||||||
exit.WithCodeT(exit.Config, "Generate unable to parse memory '{{.memory}}': {{.error}}", out.V{"memory": viper.GetString(memory), "error": err})
|
exit.WithCodeT(exit.Config, "Generate unable to parse memory '{{.memory}}': {{.error}}", out.V{"memory": viper.GetString(memory), "error": err})
|
||||||
}
|
}
|
||||||
if driver.IsKIC(drvName) && mem > containerLimit {
|
if driver.IsKIC(drvName) && mem > containerLimit {
|
||||||
exit.UsageT("{{.driver_name}} service has only {{.container_limit}}mb memory but you specified {{.specified_memory}}mb", out.V{"container_limit": containerLimit, "specified_memory": mem, "driver_name": drvName})
|
exit.UsageT("{{.driver_name}} has only {{.container_limit}}MB memory but you specified {{.specified_memory}}mb", out.V{"container_limit": containerLimit, "specified_memory": mem, "driver_name": driver.NameForHumans(drvName)})
|
||||||
}
|
}
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
glog.Infof("Using suggested %dMB memory alloc based on sys=%dMB, container=%dMB", mem, sysLimit, containerLimit)
|
glog.Infof("Using suggested %dMB memory alloc based on sys=%dMB, container=%dMB", mem, sysLimit, containerLimit)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
validateMemorySize(mem, drvName)
|
||||||
|
|
||||||
diskSize, err := pkgutil.CalculateSizeInMB(viper.GetString(humanReadableDiskSize))
|
diskSize, err := pkgutil.CalculateSizeInMB(viper.GetString(humanReadableDiskSize))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
exit.WithCodeT(exit.Config, "Generate unable to parse disk size '{{.diskSize}}': {{.error}}", out.V{"diskSize": viper.GetString(humanReadableDiskSize), "error": err})
|
exit.WithCodeT(exit.Config, "Generate unable to parse disk size '{{.diskSize}}': {{.error}}", out.V{"diskSize": viper.GetString(humanReadableDiskSize), "error": err})
|
||||||
|
|
|
@ -24,6 +24,7 @@ import (
|
||||||
"strings"
|
"strings"
|
||||||
|
|
||||||
"github.com/golang/glog"
|
"github.com/golang/glog"
|
||||||
|
"k8s.io/minikube/pkg/drivers/kic/oci"
|
||||||
"k8s.io/minikube/pkg/minikube/config"
|
"k8s.io/minikube/pkg/minikube/config"
|
||||||
"k8s.io/minikube/pkg/minikube/registry"
|
"k8s.io/minikube/pkg/minikube/registry"
|
||||||
)
|
)
|
||||||
|
@ -105,6 +106,17 @@ func IsKIC(name string) bool {
|
||||||
return name == Docker || name == Podman
|
return name == Docker || name == Podman
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// IsKIC checks if the driver is a Docker for Desktop (Docker on windows or MacOs)
|
||||||
|
// for linux and exotic archs, this will be false
|
||||||
|
func IsDockerDesktop(name string) bool {
|
||||||
|
if IsKIC(name) {
|
||||||
|
if runtime.GOOS == "darwin" || runtime.GOOS == "windows" {
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
// IsMock checks if the driver is a mock
|
// IsMock checks if the driver is a mock
|
||||||
func IsMock(name string) bool {
|
func IsMock(name string) bool {
|
||||||
return name == Mock
|
return name == Mock
|
||||||
|
@ -156,6 +168,22 @@ func NeedsShutdown(name string) bool {
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// NameForHumans will return the human-known and formatted name for the driver
|
||||||
|
func NameForHumans(name string) string {
|
||||||
|
switch name {
|
||||||
|
case oci.Docker:
|
||||||
|
if IsDockerDesktop(name) {
|
||||||
|
return "Docker for Desktop"
|
||||||
|
}
|
||||||
|
return "Docker Service"
|
||||||
|
|
||||||
|
case oci.Podman:
|
||||||
|
return "Podman Service"
|
||||||
|
default:
|
||||||
|
return strings.Title(name)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// FlagHints are hints for what default options should be used for this driver
|
// FlagHints are hints for what default options should be used for this driver
|
||||||
type FlagHints struct {
|
type FlagHints struct {
|
||||||
ExtraOptions []string
|
ExtraOptions []string
|
||||||
|
|
|
@ -23,6 +23,7 @@ import (
|
||||||
"github.com/spf13/viper"
|
"github.com/spf13/viper"
|
||||||
"k8s.io/minikube/pkg/drivers/kic/oci"
|
"k8s.io/minikube/pkg/drivers/kic/oci"
|
||||||
"k8s.io/minikube/pkg/minikube/bootstrapper/kubeadm"
|
"k8s.io/minikube/pkg/minikube/bootstrapper/kubeadm"
|
||||||
|
"k8s.io/minikube/pkg/minikube/driver"
|
||||||
"k8s.io/minikube/pkg/minikube/exit"
|
"k8s.io/minikube/pkg/minikube/exit"
|
||||||
"k8s.io/minikube/pkg/minikube/out"
|
"k8s.io/minikube/pkg/minikube/out"
|
||||||
)
|
)
|
||||||
|
@ -45,7 +46,7 @@ func MaybeExitWithAdvice(err error) {
|
||||||
|
|
||||||
if errors.Is(err, oci.ErrCPUCountLimit) {
|
if errors.Is(err, oci.ErrCPUCountLimit) {
|
||||||
out.ErrLn("")
|
out.ErrLn("")
|
||||||
out.ErrT(out.Conflict, "{{.name}} doesn't have enough CPUs. ", out.V{"name": viper.GetString("driver")})
|
out.ErrT(out.Conflict, "{{.name}} doesn't have enough CPUs. ", out.V{"name": driver.NameForHumans(viper.GetString("driver"))})
|
||||||
if runtime.GOOS != "linux" && viper.GetString("driver") == "docker" {
|
if runtime.GOOS != "linux" && viper.GetString("driver") == "docker" {
|
||||||
out.T(out.Warning, "Please consider changing your Docker Desktop's resources.")
|
out.T(out.Warning, "Please consider changing your Docker Desktop's resources.")
|
||||||
out.T(out.Documentation, "https://docs.docker.com/config/containers/resource_constraints/")
|
out.T(out.Documentation, "https://docs.docker.com/config/containers/resource_constraints/")
|
||||||
|
@ -54,7 +55,7 @@ func MaybeExitWithAdvice(err error) {
|
||||||
if cpuCount == 2 {
|
if cpuCount == 2 {
|
||||||
out.T(out.Tip, "Please ensure your system has {{.cpu_counts}} CPU cores.", out.V{"cpu_counts": viper.GetInt(cpus)})
|
out.T(out.Tip, "Please ensure your system has {{.cpu_counts}} CPU cores.", out.V{"cpu_counts": viper.GetInt(cpus)})
|
||||||
} else {
|
} else {
|
||||||
out.T(out.Tip, "Please ensure your {{.driver_name}} system has access to {{.cpu_counts}} CPU cores or reduce the number of the specified CPUs", out.V{"driver_name": viper.GetString("driver"), "cpu_counts": viper.GetInt(cpus)})
|
out.T(out.Tip, "Please ensure your {{.driver_name}} system has access to {{.cpu_counts}} CPU cores or reduce the number of the specified CPUs", out.V{"driver_name": driver.NameForHumans(viper.GetString("driver")), "cpu_counts": viper.GetInt(cpus)})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
exit.UsageT("Ensure your {{.driver_name}} system has enough CPUs. The minimum allowed is 2 CPUs.", out.V{"driver_name": viper.GetString("driver")})
|
exit.UsageT("Ensure your {{.driver_name}} system has enough CPUs. The minimum allowed is 2 CPUs.", out.V{"driver_name": viper.GetString("driver")})
|
||||||
|
|
Loading…
Reference in New Issue