Repository: kubernetes/minikube
Pull request #15553 (2022-12-27 19:36:16)

Implement --static-ip flag
Closes https://github.com/kubernetes/minikube/issues/15523

Includes entry to FAQ and Tutorial pages of website

k8s-ci-robot: [APPROVALNOTIFIER] This PR is **APPROVED**

This pull-request has been approved by: *<a href="https://github.com/kubernetes/minikube/pull/15553#" title="Author self-approved">spowelljr</a>*

The full list of commands accepted by this bot can be found [here](https://go.k8s.io/bot-commands?repo=kubernetes%2Fminikube).

The pull request process is described [here](https://git.k8s.io/community/contributors/guide/owners.md#the-code-review-process)

<details >
Needs approval from an approver in each of these files:

- ~~[OWNERS](https://github.com/kubernetes/minikube/blob/master/OWNERS)~~ [spowelljr]

Approvers can indicate their approval by writing `/approve` in a comment
Approvers can cancel approval by writing `/approve cancel` in a comment
</details>
<!-- META={"approvers":[]} -->
spowelljr: /ok-to-test
minikube-pr-bot: **kvm2 driver with docker runtime**
```
+----------------+----------+---------------------+
|    COMMAND     | MINIKUBE | MINIKUBE (PR 15553) |
+----------------+----------+---------------------+
| minikube start | 54.2s    | 54.2s               |
| enable ingress | 26.6s    | 26.8s               |
+----------------+----------+---------------------+
```

<details>

Times for minikube start: 53.1s 53.3s 56.0s 52.9s 55.6s 
Times for minikube (PR 15553) start: 55.5s 54.1s 55.0s 53.1s 53.3s 

Times for minikube ingress: 24.1s 27.7s 23.7s 29.2s 28.3s 
Times for minikube (PR 15553) ingress: 28.2s 29.7s 25.7s 25.1s 25.2s 

</details>

**docker driver with docker runtime**
```
+-------------------+----------+---------------------+
|      COMMAND      | MINIKUBE | MINIKUBE (PR 15553) |
+-------------------+----------+---------------------+
| minikube start    | 25.9s    | 27.0s               |
| ⚠️  enable ingress | 20.4s    | 27.2s ⚠️             |
+-------------------+----------+---------------------+
```

<details>

Times for minikube start: 25.4s 27.2s 26.1s 26.1s 24.8s 
Times for minikube (PR 15553) start: 26.6s 29.2s 29.2s 24.3s 25.6s 

Times for minikube (PR 15553) ingress: 22.0s 21.4s 21.5s 22.0s 49.0s 
Times for minikube ingress: 20.9s 20.9s 18.4s 21.0s 20.5s 

</details>

**docker driver with containerd runtime**
```
+----------------+----------+---------------------+
|    COMMAND     | MINIKUBE | MINIKUBE (PR 15553) |
+----------------+----------+---------------------+
| minikube start | 23.6s    | 25.5s               |
| enable ingress | 26.4s    | 26.3s               |
+----------------+----------+---------------------+
```

<details>

Times for minikube ingress: 25.9s 26.4s 26.4s 26.4s 26.5s 
Times for minikube (PR 15553) ingress: 26.5s 26.0s 26.0s 26.5s 26.4s 

Times for minikube start: 25.5s 21.3s 21.3s 25.4s 24.4s 
Times for minikube (PR 15553) start: 21.4s 22.3s 33.1s 25.2s 25.6s 

</details>
k8s-ci-robot: [APPROVALNOTIFIER] This PR is **APPROVED**

This pull-request has been approved by: *<a href="https://github.com/kubernetes/minikube/pull/15553#pullrequestreview-1235161271" title="Approved">medyagh</a>*, *<a href="https://github.com/kubernetes/minikube/pull/15553#" title="Author self-approved">spowelljr</a>*

The full list of commands accepted by this bot can be found [here](https://go.k8s.io/bot-commands?repo=kubernetes%2Fminikube).

The pull request process is described [here](https://git.k8s.io/community/contributors/guide/owners.md#the-code-review-process)

<details >
Needs approval from an approver in each of these files:

- ~~[OWNERS](https://github.com/kubernetes/minikube/blob/master/OWNERS)~~ [medyagh,spowelljr]

Approvers can indicate their approval by writing `/approve` in a comment
Approvers can cancel approval by writing `/approve cancel` in a comment
</details>
<!-- META={"approvers":[]} -->

Patch:
diff --git a/cmd/minikube/cmd/start.go b/cmd/minikube/cmd/start.go
index 758fd2097..fe99b99b0 100644
--- a/cmd/minikube/cmd/start.go
+++ b/cmd/minikube/cmd/start.go
@@ -1228,6 +1228,12 @@ func validateFlags(cmd *cobra.Command, drvName string) {
 		validateCNI(cmd, viper.GetString(containerRuntime))
 	}
 
+	if cmd.Flags().Changed(staticIP) {
+		if err := validateStaticIP(viper.GetString(staticIP), drvName, viper.GetString(subnet)); err != nil {
+			exit.Message(reason.Usage, "{{.err}}", out.V{"err": err})
+		}
+	}
+
 	if driver.IsSSH(drvName) {
 		sshIPAddress := viper.GetString(sshIPAddress)
 		if sshIPAddress == "" {
@@ -1772,6 +1778,30 @@ func validateSubnet(subnet string) error {
 	return nil
 }
 
+func validateStaticIP(staticIP, drvName, subnet string) error {
+	if !driver.IsKIC(drvName) {
+		if staticIP != "" {
+			out.WarningT("--static-ip is only implemented on Docker and Podman drivers, flag will be ignored")
+		}
+		return nil
+	}
+	if subnet != "" {
+		out.WarningT("--static-ip overrides --subnet, --subnet will be ignored")
+	}
+	ip := net.ParseIP(staticIP)
+	if !ip.IsPrivate() {
+		return fmt.Errorf("static IP must be private")
+	}
+	if ip.To4() == nil {
+		return fmt.Errorf("static IP must be IPv4")
+	}
+	lastOctet, _ := strconv.Atoi(strings.Split(ip.String(), ".")[3])
+	if lastOctet < 2 || lastOctet > 254 {
+		return fmt.Errorf("static IPs last octet must be between 2 and 254 (X.X.X.2 - X.X.X.254), for example 192.168.200.200")
+	}
+	return nil
+}
+
 func validateBareMetal(drvName string) {
 	if !driver.BareMetal(drvName) {
 		return
diff --git a/cmd/minikube/cmd/start_flags.go b/cmd/minikube/cmd/start_flags.go
index ba1e1857b..aea0a1752 100644
--- a/cmd/minikube/cmd/start_flags.go
+++ b/cmd/minikube/cmd/start_flags.go
@@ -140,6 +140,7 @@ const (
 	qemuFirmwarePath        = "qemu-firmware-path"
 	socketVMnetClientPath   = "socket-vmnet-client-path"
 	socketVMnetPath         = "socket-vmnet-path"
+	staticIP                = "static-ip"
 )
 
 var (
@@ -200,6 +201,7 @@ func initMinikubeFlags() {
 	startCmd.Flags().String(binaryMirror, "", "Location to fetch kubectl, kubelet, & kubeadm binaries from.")
 	startCmd.Flags().Bool(disableOptimizations, false, "If set, disables optimizations that are set for local Kubernetes. Including decreasing CoreDNS replicas from 2 to 1. Defaults to false.")
 	startCmd.Flags().Bool(disableMetrics, false, "If set, disables metrics reporting (CPU and memory usage), this can improve CPU usage. Defaults to false.")
+	startCmd.Flags().String(staticIP, "", "Set a static IP for the minikube cluster, the IP must be: private, IPv4, and the last octet must be between 2 and 254, for example 192.168.200.200 (Docker and Podman drivers only)")
 }
 
 // initKubernetesFlags inits the commandline flags for Kubernetes related options
@@ -571,6 +573,7 @@ func generateNewConfigFromFlags(cmd *cobra.Command, k8sVersion string, rtime str
 		CustomQemuFirmwarePath:  viper.GetString(qemuFirmwarePath),
 		SocketVMnetClientPath:   viper.GetString(socketVMnetClientPath),
 		SocketVMnetPath:         viper.GetString(socketVMnetPath),
+		StaticIP:                viper.GetString(staticIP),
 		KubernetesConfig: config.KubernetesConfig{
 			KubernetesVersion:      k8sVersion,
 			ClusterName:            ClusterFlagValue(),
@@ -747,6 +750,10 @@ func updateExistingConfigFromFlags(cmd *cobra.Command, existing *config.ClusterC
 		out.WarningT("You cannot add or remove extra disks for an existing minikube cluster. Please first delete the cluster.")
 	}
 
+	if cmd.Flags().Changed(staticIP) && viper.GetString(staticIP) != existing.StaticIP {
+		out.WarningT("You cannot change the static IP of an existing minikube cluster. Please first delete the cluster.")
+	}
+
 	updateBoolFromFlag(cmd, &cc.KeepContext, keepContext)
 	updateBoolFromFlag(cmd, &cc.EmbedCerts, embedCerts)
 	updateStringFromFlag(cmd, &cc.MinikubeISO, isoURL)
diff --git a/pkg/drivers/kic/kic.go b/pkg/drivers/kic/kic.go
index a877d2a0b..3596a9c24 100644
--- a/pkg/drivers/kic/kic.go
+++ b/pkg/drivers/kic/kic.go
@@ -41,7 +41,9 @@ import (
 	"k8s.io/minikube/pkg/minikube/cruntime"
 	"k8s.io/minikube/pkg/minikube/download"
 	"k8s.io/minikube/pkg/minikube/driver"
+	"k8s.io/minikube/pkg/minikube/exit"
 	"k8s.io/minikube/pkg/minikube/out"
+	"k8s.io/minikube/pkg/minikube/reason"
 	"k8s.io/minikube/pkg/minikube/style"
 	"k8s.io/minikube/pkg/minikube/sysinit"
 	"k8s.io/minikube/pkg/util/retry"
@@ -92,8 +94,17 @@ func (d *Driver) Create() error {
 	if networkName == "" {
 		networkName = d.NodeConfig.ClusterName
 	}
-	if gateway, err := oci.CreateNetwork(d.OCIBinary, networkName, d.NodeConfig.Subnet); err != nil {
-		out.WarningT("Unable to create dedicated network, this might result in cluster IP change after restart: {{.error}}", out.V{"error": err})
+	staticIP := d.NodeConfig.StaticIP
+	if gateway, err := oci.CreateNetwork(d.OCIBinary, networkName, d.NodeConfig.Subnet, staticIP); err != nil {
+		msg := "Unable to create dedicated network, this might result in cluster IP change after restart: {{.error}}"
+		args := out.V{"error": err}
+		if staticIP != "" {
+			exit.Message(reason.IfDedicatedNetwork, msg, args)
+		}
+		out.WarningT(msg, args)
+	} else if gateway != nil && staticIP != "" {
+		params.Network = networkName
+		params.IP = staticIP
 	} else if gateway != nil {
 		params.Network = networkName
 		ip := gateway.To4()
diff --git a/pkg/drivers/kic/oci/network_create.go b/pkg/drivers/kic/oci/network_create.go
index aaccbe651..aad123867 100644
--- a/pkg/drivers/kic/oci/network_create.go
+++ b/pkg/drivers/kic/oci/network_create.go
@@ -63,7 +63,7 @@ func firstSubnetAddr(subnet string) string {
 }
 
 // CreateNetwork creates a network returns gateway and error, minikube creates one network per cluster
-func CreateNetwork(ociBin, networkName, subnet string) (net.IP, error) {
+func CreateNetwork(ociBin, networkName, subnet, staticIP string) (net.IP, error) {
 	defaultBridgeName := defaultBridgeName(ociBin)
 	if networkName == defaultBridgeName {
 		klog.Infof("skipping creating network since default network %s was specified", networkName)
@@ -84,12 +84,20 @@ func CreateNetwork(ociBin, networkName, subnet string) (net.IP, error) {
 		klog.Warningf("failed to get mtu information from the %s's default network %q: %v", ociBin, defaultBridgeName, err)
 	}
 
+	tries := 20
+
+	// we don't want to increment the subnet IP on network creation failure if the user specifies a static IP, so set tries to 1
+	if staticIP != "" {
+		tries = 1
+		subnet = staticIP
+	}
+
 	// retry up to 5 times to create container network
 	for attempts, subnetAddr := 0, firstSubnetAddr(subnet); attempts < 5; attempts++ {
 		// Rather than iterate through all of the valid subnets, give up at 20 to avoid a lengthy user delay for something that is unlikely to work.
 		// will be like 192.168.49.0/24,..., 192.168.220.0/24 (in increment steps of 9)
 		var subnet *network.Parameters
-		subnet, err = network.FreeSubnet(subnetAddr, 9, 20)
+		subnet, err = network.FreeSubnet(subnetAddr, 9, tries)
 		if err != nil {
 			klog.Errorf("failed to find free subnet for %s network %s after %d attempts: %v", ociBin, networkName, 20, err)
 			return nil, fmt.Errorf("un-retryable: %w", err)
diff --git a/pkg/drivers/kic/types.go b/pkg/drivers/kic/types.go
index b56bb7f91..607cf6ca1 100644
--- a/pkg/drivers/kic/types.go
+++ b/pkg/drivers/kic/types.go
@@ -64,8 +64,9 @@ type Config struct {
 	Envs              map[string]string // key,value of environment variables passed to the node
 	KubernetesVersion string            // Kubernetes version to install
 	ContainerRuntime  string            // container runtime kic is running
-	Network           string            //  network to run with kic
+	Network           string            // network to run with kic
 	Subnet            string            // subnet to be used on kic cluster
+	StaticIP          string            // static IP for the kic cluster
 	ExtraArgs         []string          // a list of any extra option to pass to oci binary during creation time, for example --expose 8080...
 	ListenAddress     string            // IP Address to listen to
 }
diff --git a/pkg/minikube/config/types.go b/pkg/minikube/config/types.go
index 10e6ef8a8..7aec572b8 100644
--- a/pkg/minikube/config/types.go
+++ b/pkg/minikube/config/types.go
@@ -104,6 +104,7 @@ type ClusterConfig struct {
 	CustomQemuFirmwarePath  string
 	SocketVMnetClientPath   string
 	SocketVMnetPath         string
+	StaticIP                string
 }
 
 // KubernetesConfig contains the parameters used to configure the VM Kubernetes.
diff --git a/pkg/minikube/reason/reason.go b/pkg/minikube/reason/reason.go
index 2068f294d..d6dd8a79e 100644
--- a/pkg/minikube/reason/reason.go
+++ b/pkg/minikube/reason/reason.go
@@ -385,6 +385,8 @@ var (
 	IfMountPort = Kind{ID: "IF_MOUNT_PORT", ExitCode: ExLocalNetworkError}
 	// minikube failed to access an ssh client on the host machine
 	IfSSHClient = Kind{ID: "IF_SSH_CLIENT", ExitCode: ExLocalNetworkError}
+	// minikube failed to create a dedicated network
+	IfDedicatedNetwork = Kind{ID: "IF_DEDICATED_NETWORK", ExitCode: ExLocalNetworkError}
 
 	// minikube failed to cache kubernetes binaries for the current runtime
 	InetCacheBinaries = Kind{ID: "INET_CACHE_BINARIES", ExitCode: ExInternetError}
diff --git a/pkg/minikube/registry/drvs/docker/docker.go b/pkg/minikube/registry/drvs/docker/docker.go
index 001bc7fef..fdbddb462 100644
--- a/pkg/minikube/registry/drvs/docker/docker.go
+++ b/pkg/minikube/registry/drvs/docker/docker.go
@@ -88,6 +88,7 @@ func configure(cc config.ClusterConfig, n config.Node) (interface{}, error) {
 		ExtraArgs:         extraArgs,
 		Network:           cc.Network,
 		Subnet:            cc.Subnet,
+		StaticIP:          cc.StaticIP,
 		ListenAddress:     cc.ListenAddress,
 	}), nil
 }
diff --git a/site/content/en/docs/commands/start.md b/site/content/en/docs/commands/start.md
index 19bf2a65e..74f3a0859 100644
--- a/site/content/en/docs/commands/start.md
+++ b/site/content/en/docs/commands/start.md
@@ -111,6 +111,7 @@ minikube start [flags]
       --ssh-key string                    SSH key (ssh driver only)
       --ssh-port int                      SSH port (ssh driver only) (default 22)
       --ssh-user string                   SSH user (ssh driver only) (default "root")
+      --static-ip string                  Set a static IP for the minikube cluster, the IP must be: private, IPv4, and the last octet must be between 2 and 254, for example 192.168.200.200 (Docker and Podman drivers only)
       --subnet string                     Subnet to be used on kic cluster. If left empty, minikube will choose subnet address, beginning from 192.168.49.0. (docker and podman driver only)
       --trace string                      Send trace events. Options include: [gcp]
       --uuid string                       Provide VM UUID to restore MAC address (hyperkit driver only)
diff --git a/site/content/en/docs/contrib/errorcodes.en.md b/site/content/en/docs/contrib/errorcodes.en.md
index 135242dec..a852480d8 100644
--- a/site/content/en/docs/contrib/errorcodes.en.md
+++ b/site/content/en/docs/contrib/errorcodes.en.md
@@ -358,6 +358,9 @@ minikube failed to parse or find port for mount
 "IF_SSH_CLIENT" (Exit code ExLocalNetworkError)  
 minikube failed to access an ssh client on the host machine  
 
+"IF_DEDICATED_NETWORK" (Exit code ExLocalNetworkError)  
+minikube failed to create a dedicated network  
+
 "INET_CACHE_BINARIES" (Exit code ExInternetError)  
 minikube failed to cache kubernetes binaries for the current runtime  
 
diff --git a/site/content/en/docs/faq/_index.md b/site/content/en/docs/faq/_index.md
index 701da92a7..9c5a847e1 100644
--- a/site/content/en/docs/faq/_index.md
+++ b/site/content/en/docs/faq/_index.md
@@ -159,3 +159,9 @@ $env:MINIKUBE_HOME = "D:\.minikube"
 
 minikube start
 ```
+
+## Can I set a static IP for the minikube cluster?
+
+Currently a static IP can only be set when using the Docker or Podman driver.
+
+For more details see the [static IP tutorial]({{< ref "docs/tutorials/static_ip.md" >}}).
diff --git a/site/content/en/docs/tutorials/static_ip.md b/site/content/en/docs/tutorials/static_ip.md
new file mode 100644
index 000000000..6c416f946
--- /dev/null
+++ b/site/content/en/docs/tutorials/static_ip.md
@@ -0,0 +1,51 @@
+---
+title: "Setting a Static IP for a Cluster"                                 
+linkTitle: "Setting a Static IP for a Cluster"
+weight: 1
+date: 2023-01-04
+--- 
+
+## Overview
+
+This tutorial will show you how to create a minikube cluster with a static IP.
+
+## Prerequisites
+
+- minikube v1.29.0 or higher
+- Docker or Podman driver
+
+## Selecting a static IP
+
+The static IP must be IPv4, private, and the last octet must be between 2-254 (X.X.X.2 - X.X.X.254).
+
+Valid static IPs:<br>
+10.0.0.2 - 10.255.255.254<br>
+172.16.0.2 - 172.31.255.254<br>
+192.168.0.2 - 192.168.255.254
+
+## Tutorial
+
+Use the `--static-ip` flag on `minikube start` to set the static IP.
+
+**Note:** You cannot add a static IP to an existing cluster, you have to delete and recreate the cluster with the flag.
+
+```
+$ minikube start --driver docker --static-ip 192.168.200.200
+😄  minikube v1.28.0 on Darwin 13.1 (arm64)
+✨  Using the docker driver based on user configuration
+📌  Using Docker Desktop driver with root privileges
+👍  Starting control plane node minikube in cluster minikube
+🚜  Pulling base image ...
+🔥  Creating docker container (CPUs=2, Memory=4000MB) ...
+🐳  Preparing Kubernetes v1.25.3 on Docker 20.10.21 ...
+    ▪ Generating certificates and keys ...
+    ▪ Booting up control plane ...
+    ▪ Configuring RBAC rules ...
+🔎  Verifying Kubernetes components...
+    ▪ Using image gcr.io/k8s-minikube/storage-provisioner:v5
+🌟  Enabled addons: default-storageclass
+🏄  Done! kubectl is now configured to use "minikube" cluster and "default" namespace by default
+
+$ minikube ip
+192.168.200.200
+```
diff --git a/translations/de.json b/translations/de.json
index 2b9dd592d..1899316a6 100644
--- a/translations/de.json
+++ b/translations/de.json
@@ -24,6 +24,8 @@
 	"--network flag is only valid with the docker/podman and KVM drivers, it will be ignored": "Der Parameter --network kann nur mit dem docker/podman und den KVM Treibern verwendet werden, er wird ignoriert werden",
 	"--network flag is only valid with the docker/podman, KVM and Qemu drivers, it will be ignored": "",
 	"--network with QEMU must be 'user' or 'socket_vmnet'": "",
+	"--static-ip is only implemented on Docker and Podman drivers, flag will be ignored": "",
+	"--static-ip overrides --subnet, --subnet will be ignored": "",
 	"1) Recreate the cluster with Kubernetes {{.new}}, by running:\n\t  \n\t\t  minikube delete{{.profile}}\n\t\t  minikube start{{.profile}} --kubernetes-version={{.prefix}}{{.new}}\n\t  \n\t\t2) Create a second cluster with Kubernetes {{.new}}, by running:\n\t  \n\t\t  minikube start -p {{.suggestedName}} --kubernetes-version={{.prefix}}{{.new}}\n\t  \n\t\t3) Use the existing cluster at version Kubernetes {{.old}}, by running:\n\t  \n\t\t  minikube start{{.profile}} --kubernetes-version={{.prefix}}{{.old}}\n\t\t": "1) Erstellen Sie den Cluster mit Kubernetes {{.new}} neu, indem Sie folgende Befehle ausführen:\n\t  \n\t\t  minikube delete{{.profile}}\n\t\t  minikube start{{.profile}} --kubernetes-version={{.prefix}}{{.new}}\n\t  \n\t\t2) Erstellen Sie einen zweiten Cluster mit Kubernetes {{.new}}, indem Sie folgende Befehle ausführen:\n\t  \n\t\t  minikube start -p {{.suggestedName}} --kubernetes-version={{.prefix}}{{.new}}\n\t  \n\t\t3) Verwenden Sie den existierenden Cluster mit Version {{.old}} von Kubernetes, indem Sie folgende Befehle ausführen:\n\t  \n\t\t  minikube start{{.profile}} --kubernetes-version={{.prefix}}{{.old}}\n\t\t",
 	"1. Click on \"Docker for Desktop\" menu icon\n\t\t\t2. Click \"Preferences\"\n\t\t\t3. Click \"Resources\"\n\t\t\t4. Increase \"CPUs\" slider bar to 2 or higher\n\t\t\t5. Click \"Apply \u0026 Restart\"": "1. Klicken Sie auf das \"Docker für Desktop\" Menu Icon\n\t\t\t2. Klicken Sie auf \"Einstellungen\"\n\t\t\t3. Klicken Sie auf \"Resourcen\"\n\t\t\t4. Erhöhen Sie den Wert von \"CPUs\" auf 2 oder mehr\n\t\t\t5. Klicken Sie auf \"Anwenden \u0026 Neustarten\"",
 	"1. Click on \"Docker for Desktop\" menu icon\n\t\t\t2. Click \"Preferences\"\n\t\t\t3. Click \"Resources\"\n\t\t\t4. Increase \"Memory\" slider bar to {{.recommend}} or higher\n\t\t\t5. Click \"Apply \u0026 Restart\"": "1. Klicken Sie auf das \"Docker für Desktop\" Menu Icon\n\t\t\t2. Klicken Sie auf \"Einstellungen\"\n\t\t\t3. Klicken Sie auf \"Resourcen\"\n\t\t\t4. Erhöhen Sie den Wert von \"Speicher\" auf {{.recommend}} oder mehr\n\t\t\t5. Klicken Sie auf \"Anwenden \u0026 Neustarten\"",
@@ -584,6 +586,7 @@
 	"Select a valid value for --dnsdomain": "Wähle einen gültigen Wert für --dnsdomain",
 	"Send trace events. Options include: [gcp]": "Schicke Trace Events. Mögliche Optionen sind [gcp]",
 	"Service '{{.service}}' was not found in '{{.namespace}}' namespace.\nYou may select another namespace by using 'minikube service {{.service}} -n \u003cnamespace\u003e'. Or list out all the services using 'minikube service list'": "Service '{{.service}}' konnte nicht im Namespace '{{.namespace}} gefunden werden.\nEs ist möglich einen anderen Namespace mit 'minikube service {{.service}} -n \u003cnamespace\u003e' auszuwählen. Oder die Liste aller Services anzuzeigen mit 'minikube service list'",
+	"Set a static IP for the minikube cluster, the IP must be: private, IPv4, and the last octet must be between 2 and 254, for example 192.168.200.200 (Docker and Podman drivers only)": "",
 	"Set failed": "Setzen fehlgeschlagen",
 	"Set flag to delete all profiles": "Setze Flag um alle Profile zu löschen",
 	"Set flag to stop all profiles (clusters)": "Setze Flag um alle Profile (Cluster) zu stoppen",
@@ -899,6 +902,7 @@
 	"You cannot change the CPUs for an existing minikube cluster. Please first delete the cluster.": "Die Anzahl der CPUs eines existierenden Minikube Clusters kann nicht geändert werden. Bitte löschen Sie den Cluster zuerst.",
 	"You cannot change the disk size for an existing minikube cluster. Please first delete the cluster.": "Die Plattengröße eines existierenden Minikube Clusters kann nicht geändert werden. Bitte löschen Sie den Cluster zuerst.",
 	"You cannot change the memory size for an existing minikube cluster. Please first delete the cluster.": "Die Speichergröße eines existierenden Minikube Clusters kann nicht geändert werden. Bitte löschen Sie den Cluster zuerst.",
+	"You cannot change the static IP of an existing minikube cluster. Please first delete the cluster.": "",
 	"You have authenticated with a service account that does not have an associated JSON file. The GCP Auth addon requires credentials with a JSON file in order to continue.": "",
 	"You have authenticated with a service account that does not have an associated JSON. The GCP Auth requires credentials with a JSON file to in order to continue. The image pull secret has been imported.": "Sie haben sich mit einem Service Account authentifiziert, welcher kein zugehöriges JSON besitzt. GCP Auth benötigt Zugangsdaten in einer JSON-Datei um weitermachen zu können. Das Image Pull Secret wurde importiert.",
 	"You have chosen to disable the CNI but the \"{{.name}}\" container runtime requires CNI": "Sie haben den CNI Treiber deaktiviert, aber die \"{{.name}}\" Container Laufzeitumgebung benötigt ein CNI",
diff --git a/translations/es.json b/translations/es.json
index 4519be1d8..5ff53bd23 100644
--- a/translations/es.json
+++ b/translations/es.json
@@ -25,6 +25,8 @@
 	"--network flag is only valid with the docker/podman and KVM drivers, it will be ignored": "el flag --network es válido solamente con docker/podman y KVM, será ignorado",
 	"--network flag is only valid with the docker/podman, KVM and Qemu drivers, it will be ignored": "",
 	"--network with QEMU must be 'user' or 'socket_vmnet'": "",
+	"--static-ip is only implemented on Docker and Podman drivers, flag will be ignored": "",
+	"--static-ip overrides --subnet, --subnet will be ignored": "",
 	"1) Recreate the cluster with Kubernetes {{.new}}, by running:\n\t  \n\t\t  minikube delete{{.profile}}\n\t\t  minikube start{{.profile}} --kubernetes-version={{.prefix}}{{.new}}\n\t  \n\t\t2) Create a second cluster with Kubernetes {{.new}}, by running:\n\t  \n\t\t  minikube start -p {{.suggestedName}} --kubernetes-version={{.prefix}}{{.new}}\n\t  \n\t\t3) Use the existing cluster at version Kubernetes {{.old}}, by running:\n\t  \n\t\t  minikube start{{.profile}} --kubernetes-version={{.prefix}}{{.old}}\n\t\t": "",
 	"1. Click on \"Docker for Desktop\" menu icon\n\t\t\t2. Click \"Preferences\"\n\t\t\t3. Click \"Resources\"\n\t\t\t4. Increase \"CPUs\" slider bar to 2 or higher\n\t\t\t5. Click \"Apply \u0026 Restart\"": "",
 	"1. Click on \"Docker for Desktop\" menu icon\n\t\t\t2. Click \"Preferences\"\n\t\t\t3. Click \"Resources\"\n\t\t\t4. Increase \"Memory\" slider bar to {{.recommend}} or higher\n\t\t\t5. Click \"Apply \u0026 Restart\"": "",
@@ -590,6 +592,7 @@
 	"Select a valid value for --dnsdomain": "",
 	"Send trace events. Options include: [gcp]": "",
 	"Service '{{.service}}' was not found in '{{.namespace}}' namespace.\nYou may select another namespace by using 'minikube service {{.service}} -n \u003cnamespace\u003e'. Or list out all the services using 'minikube service list'": "",
+	"Set a static IP for the minikube cluster, the IP must be: private, IPv4, and the last octet must be between 2 and 254, for example 192.168.200.200 (Docker and Podman drivers only)": "",
 	"Set failed": "",
 	"Set flag to delete all profiles": "",
 	"Set flag to stop all profiles (clusters)": "",
@@ -899,6 +902,7 @@
 	"You cannot change the CPUs for an existing minikube cluster. Please first delete the cluster.": "",
 	"You cannot change the disk size for an existing minikube cluster. Please first delete the cluster.": "",
 	"You cannot change the memory size for an existing minikube cluster. Please first delete the cluster.": "",
+	"You cannot change the static IP of an existing minikube cluster. Please first delete the cluster.": "",
 	"You have authenticated with a service account that does not have an associated JSON file. The GCP Auth addon requires credentials with a JSON file in order to continue.": "",
 	"You have chosen to disable the CNI but the \"{{.name}}\" container runtime requires CNI": "",
 	"You have selected \"virtualbox\" driver, but there are better options !\nFor better performance and support consider using a different driver: {{.drivers}}\n\nTo turn off this warning run:\n\n\t$ minikube config set WantVirtualBoxDriverWarning false\n\n\nTo learn more about on minikube drivers checkout https://minikube.sigs.k8s.io/docs/drivers/\nTo see benchmarks checkout https://minikube.sigs.k8s.io/docs/benchmarks/cpuusage/\n\n": "",
diff --git a/translations/fr.json b/translations/fr.json
index d0d314b44..d7184509b 100644
--- a/translations/fr.json
+++ b/translations/fr.json
@@ -25,6 +25,8 @@
 	"--network flag is only valid with the docker/podman and KVM drivers, it will be ignored": "l'indicateur --network est valide uniquement avec les pilotes docker/podman et KVM, il va être ignoré",
 	"--network flag is only valid with the docker/podman, KVM and Qemu drivers, it will be ignored": "L'indicateur --network n'est valide qu'avec les pilotes docker/podman, KVM et Qemu, il sera ignoré",
 	"--network with QEMU must be 'user' or 'socket_vmnet'": "--network avec QEMU doit être 'user' ou 'socket_vmnet'",
+	"--static-ip is only implemented on Docker and Podman drivers, flag will be ignored": "",
+	"--static-ip overrides --subnet, --subnet will be ignored": "",
 	"1) Recreate the cluster with Kubernetes {{.new}}, by running:\n\t  \n\t\t  minikube delete {{.profile}}\n\t\t  minikube start {{.profile}} --kubernetes-version={{.prefix}}{{.new}}\n\t  \n\t\t2) Create a second cluster with Kubernetes {{.new}}, by running:\n\t  \n\t\t  minikube start -p {{.suggestedName}} --kubernetes-version={{.prefix}}{{.new}}\n\t  \n\t\t3) Use the existing cluster at version Kubernetes {{.old}}, by running:\n\t  \n\t\t  minikube start {{.profile}} --kubernetes-version={{.prefix}}{{.old}}\n\t\t": "1) Recréez le cluster avec Kubernetes {{.new}}, en exécutant :\n\t  \n\t\t  minikube delete {{.profile}}\n\t\t  minikube start {{.profile}} - -kubernetes-version={{.prefix}}{{.new}}\n\t  \n\t\t2)  Créez un deuxième cluster avec Kubernetes {{.new}}, en exécutant :\n\t  \n  \t\t  minikube start -p {{.suggestedName}} --kubernetes-version={{.prefix}}{{.new}}\n\t  \n\t\t3)  Utiliser le cluster existant à la version Kubernetes {{.old}}, en exécutant :\n\t  \n\t\t  minikube start {{.profile}} --kubernetes-version={{.prefix}}{{.old}}\n\t \t",
 	"1) Recreate the cluster with Kubernetes {{.new}}, by running:\n\t  \n\t\t  minikube delete{{.profile}}\n\t\t  minikube start{{.profile}} --kubernetes-version={{.prefix}}{{.new}}\n\t  \n\t\t2) Create a second cluster with Kubernetes {{.new}}, by running:\n\t  \n\t\t  minikube start -p {{.suggestedName}} --kubernetes-version={{.prefix}}{{.new}}\n\t  \n\t\t3) Use the existing cluster at version Kubernetes {{.old}}, by running:\n\t  \n\t\t  minikube start{{.profile}} --kubernetes-version={{.prefix}}{{.old}}\n\t\t": "1) Recréez le cluster avec Kubernetes {{.new}}, en exécutant :\n\t \n\t\t minikube delete {{.profile}}\n\t\t minikube start{{.profile}} --kubernetes-version={{.prefix}}{{.new}}\n\t \n\t\t2) Créez un deuxième cluster avec Kubernetes {{.new}}, en exécutant :\n\t \n \t\t minikube start -p {{.suggestedName}} --kubernetes-version={{.prefix}}{{.new}}\n\t \n\t\t3) Utiliser le cluster existant à la version Kubernetes {{.old}}, en exécutant :\n\t \n\t\t minikube start{{.profile}} --kubernetes-version={{.prefix}}{{.old}}\n\t \t",
 	"1. Click on \"Docker for Desktop\" menu icon\n\t\t\t2. Click \"Preferences\"\n\t\t\t3. Click \"Resources\"\n\t\t\t4. Increase \"CPUs\" slider bar to 2 or higher\n\t\t\t5. Click \"Apply \u0026 Restart\"": "1. Cliquez sur l'icône de menu \"Docker for Desktop\"\n\t\t\t2. Cliquez sur \"Preferences\"\n\t\t\t3. Cliquez sur \"Ressources\"\n\t\t\t4. Augmentez la barre de défilement \"CPU\" à 2 ou plus\n\t\t\t5. Cliquez sur \"Apply \u0026 Restart\"",
@@ -568,6 +570,7 @@
 	"Select a valid value for --dnsdomain": "Sélectionnez une valeur valide pour --dnsdomain",
 	"Send trace events. Options include: [gcp]": "Envoyer des événements de trace. Les options incluent : [gcp]",
 	"Service '{{.service}}' was not found in '{{.namespace}}' namespace.\nYou may select another namespace by using 'minikube service {{.service}} -n \u003cnamespace\u003e'. Or list out all the services using 'minikube service list'": "Le service '{{.service}}' n'a pas été trouvé dans l'espace de noms '{{.namespace}}'.\nVous pouvez sélectionner un autre espace de noms en utilisant 'minikube service {{.service}} -n \u003cnamespace\u003e'. Ou répertoriez tous les services à l'aide de 'minikube service list'",
+	"Set a static IP for the minikube cluster, the IP must be: private, IPv4, and the last octet must be between 2 and 254, for example 192.168.200.200 (Docker and Podman drivers only)": "",
 	"Set failed": "Échec de la définition",
 	"Set flag to delete all profiles": "Définir un indicateur pour supprimer tous les profils",
 	"Set flag to stop all profiles (clusters)": "Définir un indicateur pour arrêter tous les profils (clusters)",
@@ -872,6 +875,7 @@
 	"You cannot change the CPUs for an existing minikube cluster. Please first delete the cluster.": "Vous ne pouvez pas modifier les processeurs d'un cluster minikube existant. Veuillez d'abord supprimer le cluster.",
 	"You cannot change the disk size for an existing minikube cluster. Please first delete the cluster.": "Vous ne pouvez pas modifier la taille du disque pour un cluster minikube existant. Veuillez d'abord supprimer le cluster.",
 	"You cannot change the memory size for an existing minikube cluster. Please first delete the cluster.": "Vous ne pouvez pas modifier la taille de la mémoire d'un cluster minikube existant. Veuillez d'abord supprimer le cluster.",
+	"You cannot change the static IP of an existing minikube cluster. Please first delete the cluster.": "",
 	"You have authenticated with a service account that does not have an associated JSON file. The GCP Auth addon requires credentials with a JSON file in order to continue.": "Vous vous êtes authentifié avec un compte de service qui n'a pas de fichier JSON associé. Le module complémentaire GCP Auth nécessite des informations d'identification avec un fichier JSON pour continuer.",
 	"You have authenticated with a service account that does not have an associated JSON file. The GCP Auth addon requires credentials with a JSON file in order to continue. The image pull secret has been imported.": "Vous vous êtes authentifié avec un compte de service qui n'a pas de fichier JSON associé. Le module complémentaire GCP Auth nécessite des informations d'identification avec un fichier JSON pour continuer. Le secret d'extraction d'image a été importé.",
 	"You have authenticated with a service account that does not have an associated JSON. The GCP Auth requires credentials with a JSON file in order to continue. The image pull secret has been imported.": "Vous vous êtes authentifié avec un compte de service qui n'a pas de fichier JSON associé. L'authentification GCP nécessite des informations d'identification avec un fichier JSON pour continuer. Le secret d'extraction d'image a été importé.",
diff --git a/translations/ja.json b/translations/ja.json
index 3ba905c11..878f283b3 100644
--- a/translations/ja.json
+++ b/translations/ja.json
@@ -24,6 +24,8 @@
 	"--network flag is only valid with the docker/podman and KVM drivers, it will be ignored": "--network フラグは、docker/podman および KVM ドライバーでのみ有効であるため、無視されます",
 	"--network flag is only valid with the docker/podman, KVM and Qemu drivers, it will be ignored": "--network フラグは、docker/podman, KVM および Qemu ドライバーでのみ有効であるため、無視されます",
 	"--network with QEMU must be 'user' or 'socket_vmnet'": "QEMU を用いる場合、--network は、'user' か 'socket_vmnet' でなければなりません",
+	"--static-ip is only implemented on Docker and Podman drivers, flag will be ignored": "",
+	"--static-ip overrides --subnet, --subnet will be ignored": "",
 	"1) Recreate the cluster with Kubernetes {{.new}}, by running:\n\t  \n\t\t  minikube delete{{.profile}}\n\t\t  minikube start{{.profile}} --kubernetes-version={{.prefix}}{{.new}}\n\t  \n\t\t2) Create a second cluster with Kubernetes {{.new}}, by running:\n\t  \n\t\t  minikube start -p {{.suggestedName}} --kubernetes-version={{.prefix}}{{.new}}\n\t  \n\t\t3) Use the existing cluster at version Kubernetes {{.old}}, by running:\n\t  \n\t\t  minikube start{{.profile}} --kubernetes-version={{.prefix}}{{.old}}\n\t\t": "1) 次のコマンドで Kubernetes {{.new}} によるクラスターを再構築します:\n\t  \n\t\t  minikube delete{{.profile}}\n\t\t  minikube start{{.profile}} --kubernetes-version={{.prefix}}{{.new}}\n\t  \n\t\t2) 次のコマンドで Kubernetes {{.new}} による第 2 のクラスターを作成します:\n\t  \n\t\t  minikube start -p {{.suggestedName}} --kubernetes-version={{.prefix}}{{.new}}\n\t  \n\t\t3) 次のコマンドで Kubernetes {{.old}} による既存クラスターを使用します:\n\t  \n\t\t  minikube start{{.profile}} --kubernetes-version={{.prefix}}{{.old}}\n\t\t",
 	"1. Click on \"Docker for Desktop\" menu icon\n\t\t\t2. Click \"Preferences\"\n\t\t\t3. Click \"Resources\"\n\t\t\t4. Increase \"CPUs\" slider bar to 2 or higher\n\t\t\t5. Click \"Apply \u0026 Restart\"": "1. 「Docker for Desktop」メニューアイコンをクリックします\n\t\t\t2. 「Preferences」をクリックします\n\t\t\t3. 「Resources」をクリックします\n\t\t\t4. 「CPUs」スライドバーを 2 以上に増やします\n\t\t\t5. 「Apply \u0026 Restart」をクリックします",
 	"1. Click on \"Docker for Desktop\" menu icon\n\t\t\t2. Click \"Preferences\"\n\t\t\t3. Click \"Resources\"\n\t\t\t4. Increase \"Memory\" slider bar to {{.recommend}} or higher\n\t\t\t5. Click \"Apply \u0026 Restart\"": "1. 「Docker for Desktop」メニューアイコンをクリックします\n\t\t\t2. 「Preferences」をクリックします\n\t\t\t3. 「Resources」をクリックします\n\t\t\t4. 「Memory」スライドバーを {{.recommend}} 以上に増やします\n\t\t\t5. 「Apply \u0026 Restart」をクリックします",
@@ -550,6 +552,7 @@
 	"Select a valid value for --dnsdomain": "--dnsdomain に有効な値を選択してください",
 	"Send trace events. Options include: [gcp]": "トレースイベントを送信します。含まれるオプション: [gcp]",
 	"Service '{{.service}}' was not found in '{{.namespace}}' namespace.\nYou may select another namespace by using 'minikube service {{.service}} -n \u003cnamespace\u003e'. Or list out all the services using 'minikube service list'": "'{{.namespace}}' ネームスペース中に '{{.service}}' サービスが見つかりませんでした。\n'minikube service {{.service}} -n \u003cnamespace\u003e' を使って別のネームスペースを選択できます。または、'minikube service list' を使って全サービスを一覧表示してください",
+	"Set a static IP for the minikube cluster, the IP must be: private, IPv4, and the last octet must be between 2 and 254, for example 192.168.200.200 (Docker and Podman drivers only)": "",
 	"Set failed": "設定に失敗しました",
 	"Set flag to delete all profiles": "全プロファイルを削除します",
 	"Set flag to stop all profiles (clusters)": "全プロファイル (クラスター) を停止します",
@@ -835,6 +838,7 @@
 	"You cannot change the CPUs for an existing minikube cluster. Please first delete the cluster.": "既存の minikube クラスターに対して、CPU を変更できません。最初にクラスターを削除してください。",
 	"You cannot change the disk size for an existing minikube cluster. Please first delete the cluster.": "既存の minikube クラスターに対して、ディスクサイズを変更できません。最初にクラスターを削除してください。",
 	"You cannot change the memory size for an existing minikube cluster. Please first delete the cluster.": "既存の minikube クラスターに対して、メモリサイズを変更できません。最初にクラスターを削除してください。",
+	"You cannot change the static IP of an existing minikube cluster. Please first delete the cluster.": "",
 	"You have authenticated with a service account that does not have an associated JSON file. The GCP Auth addon requires credentials with a JSON file in order to continue.": "",
 	"You have authenticated with a service account that does not have an associated JSON file. The GCP Auth addon requires credentials with a JSON file in order to continue. The image pull secret has been imported.": "関連する JSON ファイルがないサービスアカウントで認証しています。GCP Auth アドオンは、作業を続行するために JSON ファイル付きクレデンシャルを要求します。イメージ取得シークレットがインポートされました。",
 	"You have chosen to disable the CNI but the \"{{.name}}\" container runtime requires CNI": "CNI 無効が選択されましたが、「{{.name}}」コンテナランタイムは CNI が必要です",
diff --git a/translations/ko.json b/translations/ko.json
index d3e6100f6..529080905 100644
--- a/translations/ko.json
+++ b/translations/ko.json
@@ -29,6 +29,8 @@
 	"--kvm-numa-count range is 1-8": "--kvm-numa-count 범위는 1부터 8입니다",
 	"--network flag is only valid with the docker/podman, KVM and Qemu drivers, it will be ignored": "--network 는 docker나 podman 에서만 유효합니다. KVM이나 Qemu 드라이버에서는 인자가 무시됩니다",
 	"--network with QEMU must be 'user' or 'socket_vmnet'": "",
+	"--static-ip is only implemented on Docker and Podman drivers, flag will be ignored": "",
+	"--static-ip overrides --subnet, --subnet will be ignored": "",
 	"1) Recreate the cluster with Kubernetes {{.new}}, by running:\n\t  \n\t\t  minikube delete{{.profile}}\n\t\t  minikube start{{.profile}} --kubernetes-version={{.prefix}}{{.new}}\n\t  \n\t\t2) Create a second cluster with Kubernetes {{.new}}, by running:\n\t  \n\t\t  minikube start -p {{.suggestedName}} --kubernetes-version={{.prefix}}{{.new}}\n\t  \n\t\t3) Use the existing cluster at version Kubernetes {{.old}}, by running:\n\t  \n\t\t  minikube start{{.profile}} --kubernetes-version={{.prefix}}{{.old}}\n\t\t": "",
 	"1. Click on \"Docker for Desktop\" menu icon\n\t\t\t2. Click \"Preferences\"\n\t\t\t3. Click \"Resources\"\n\t\t\t4. Increase \"CPUs\" slider bar to 2 or higher\n\t\t\t5. Click \"Apply \u0026 Restart\"": "",
 	"1. Click on \"Docker for Desktop\" menu icon\n\t\t\t2. Click \"Preferences\"\n\t\t\t3. Click \"Resources\"\n\t\t\t4. Increase \"Memory\" slider bar to {{.recommend}} or higher\n\t\t\t5. Click \"Apply \u0026 Restart\"": "",
@@ -600,6 +602,7 @@
 	"Select a valid value for --dnsdomain": "",
 	"Send trace events. Options include: [gcp]": "",
 	"Service '{{.service}}' was not found in '{{.namespace}}' namespace.\nYou may select another namespace by using 'minikube service {{.service}} -n \u003cnamespace\u003e'. Or list out all the services using 'minikube service list'": "",
+	"Set a static IP for the minikube cluster, the IP must be: private, IPv4, and the last octet must be between 2 and 254, for example 192.168.200.200 (Docker and Podman drivers only)": "",
 	"Set failed": "설정이 실패하였습니다",
 	"Set flag to delete all profiles": "",
 	"Set flag to stop all profiles (clusters)": "",
@@ -898,6 +901,7 @@
 	"You cannot change the CPUs for an existing minikube cluster. Please first delete the cluster.": "",
 	"You cannot change the disk size for an existing minikube cluster. Please first delete the cluster.": "",
 	"You cannot change the memory size for an existing minikube cluster. Please first delete the cluster.": "",
+	"You cannot change the static IP of an existing minikube cluster. Please first delete the cluster.": "",
 	"You have authenticated with a service account that does not have an associated JSON file. The GCP Auth addon requires credentials with a JSON file in order to continue.": "",
 	"You have chosen to disable the CNI but the \"{{.name}}\" container runtime requires CNI": "",
 	"You have selected \"virtualbox\" driver, but there are better options !\nFor better performance and support consider using a different driver: {{.drivers}}\n\nTo turn off this warning run:\n\n\t$ minikube config set WantVirtualBoxDriverWarning false\n\n\nTo learn more about on minikube drivers checkout https://minikube.sigs.k8s.io/docs/drivers/\nTo see benchmarks checkout https://minikube.sigs.k8s.io/docs/benchmarks/cpuusage/\n\n": "",
diff --git a/translations/pl.json b/translations/pl.json
index 12da01420..7c94161ea 100644
--- a/translations/pl.json
+++ b/translations/pl.json
@@ -28,6 +28,8 @@
 	"--kvm-numa-count range is 1-8": "",
 	"--network flag is only valid with the docker/podman, KVM and Qemu drivers, it will be ignored": "",
 	"--network with QEMU must be 'user' or 'socket_vmnet'": "",
+	"--static-ip is only implemented on Docker and Podman drivers, flag will be ignored": "",
+	"--static-ip overrides --subnet, --subnet will be ignored": "",
 	"1) Recreate the cluster with Kubernetes {{.new}}, by running:\n\t  \n\t\t  minikube delete{{.profile}}\n\t\t  minikube start{{.profile}} --kubernetes-version={{.prefix}}{{.new}}\n\t  \n\t\t2) Create a second cluster with Kubernetes {{.new}}, by running:\n\t  \n\t\t  minikube start -p {{.suggestedName}} --kubernetes-version={{.prefix}}{{.new}}\n\t  \n\t\t3) Use the existing cluster at version Kubernetes {{.old}}, by running:\n\t  \n\t\t  minikube start{{.profile}} --kubernetes-version={{.prefix}}{{.old}}\n\t\t": "",
 	"1. Click on \"Docker for Desktop\" menu icon\n\t\t\t2. Click \"Preferences\"\n\t\t\t3. Click \"Resources\"\n\t\t\t4. Increase \"CPUs\" slider bar to 2 or higher\n\t\t\t5. Click \"Apply \u0026 Restart\"": "",
 	"1. Click on \"Docker for Desktop\" menu icon\n\t\t\t2. Click \"Preferences\"\n\t\t\t3. Click \"Resources\"\n\t\t\t4. Increase \"Memory\" slider bar to {{.recommend}} or higher\n\t\t\t5. Click \"Apply \u0026 Restart\"": "",
@@ -602,6 +604,7 @@
 	"Select a valid value for --dnsdomain": "",
 	"Send trace events. Options include: [gcp]": "",
 	"Service '{{.service}}' was not found in '{{.namespace}}' namespace.\nYou may select another namespace by using 'minikube service {{.service}} -n \u003cnamespace\u003e'. Or list out all the services using 'minikube service list'": "",
+	"Set a static IP for the minikube cluster, the IP must be: private, IPv4, and the last octet must be between 2 and 254, for example 192.168.200.200 (Docker and Podman drivers only)": "",
 	"Set failed": "",
 	"Set flag to delete all profiles": "",
 	"Set flag to stop all profiles (clusters)": "",
@@ -910,6 +913,7 @@
 	"You cannot change the CPUs for an existing minikube cluster. Please first delete the cluster.": "",
 	"You cannot change the disk size for an existing minikube cluster. Please first delete the cluster.": "",
 	"You cannot change the memory size for an existing minikube cluster. Please first delete the cluster.": "",
+	"You cannot change the static IP of an existing minikube cluster. Please first delete the cluster.": "",
 	"You have authenticated with a service account that does not have an associated JSON file. The GCP Auth addon requires credentials with a JSON file in order to continue.": "",
 	"You have chosen to disable the CNI but the \"{{.name}}\" container runtime requires CNI": "",
 	"You have selected \"virtualbox\" driver, but there are better options !\nFor better performance and support consider using a different driver: {{.drivers}}\n\nTo turn off this warning run:\n\n\t$ minikube config set WantVirtualBoxDriverWarning false\n\n\nTo learn more about on minikube drivers checkout https://minikube.sigs.k8s.io/docs/drivers/\nTo see benchmarks checkout https://minikube.sigs.k8s.io/docs/benchmarks/cpuusage/\n\n": "",
diff --git a/translations/ru.json b/translations/ru.json
index 38f5f6f2b..a366b53fc 100644
--- a/translations/ru.json
+++ b/translations/ru.json
@@ -23,6 +23,8 @@
 	"--kvm-numa-count range is 1-8": "",
 	"--network flag is only valid with the docker/podman, KVM and Qemu drivers, it will be ignored": "",
 	"--network with QEMU must be 'user' or 'socket_vmnet'": "",
+	"--static-ip is only implemented on Docker and Podman drivers, flag will be ignored": "",
+	"--static-ip overrides --subnet, --subnet will be ignored": "",
 	"1) Recreate the cluster with Kubernetes {{.new}}, by running:\n\t  \n\t\t  minikube delete{{.profile}}\n\t\t  minikube start{{.profile}} --kubernetes-version={{.prefix}}{{.new}}\n\t  \n\t\t2) Create a second cluster with Kubernetes {{.new}}, by running:\n\t  \n\t\t  minikube start -p {{.suggestedName}} --kubernetes-version={{.prefix}}{{.new}}\n\t  \n\t\t3) Use the existing cluster at version Kubernetes {{.old}}, by running:\n\t  \n\t\t  minikube start{{.profile}} --kubernetes-version={{.prefix}}{{.old}}\n\t\t": "1) Пересоздайте кластер с Kubernetes {{.new}}, выполнив:\n\t  \n\t\t  minikube delete{{.profile}}\n\t\t  minikube start{{.profile}} --kubernetes-version={{.prefix}}{{.new}}\n\t  \n\t\t2) Создайье второй кластер с Kubernetes {{.new}}, выполнив:\n\t  \n\t\t  minikube start -p {{.suggestedName}} --kubernetes-version={{.prefix}}{{.new}}\n\t  \n\t\t3) Используйте существующий кластер с версией Kubernetes {{.old}}, выполнив:\n\t  \n\t\t  minikube start{{.profile}} --kubernetes-version={{.prefix}}{{.old}}\n\t\t",
 	"1. Click on \"Docker for Desktop\" menu icon\n\t\t\t2. Click \"Preferences\"\n\t\t\t3. Click \"Resources\"\n\t\t\t4. Increase \"CPUs\" slider bar to 2 or higher\n\t\t\t5. Click \"Apply \u0026 Restart\"": "1. Кликните на иконку \"Docker for Desktop\"\n\t\t\t2. Выберите \"Preferences\"\n\t\t\t3. Нажмите \"Resources\"\n\t\t\t4. Увеличьте кол-во \"CPUs\" до 2 или выше\n\t\t\t5. Нажмите \"Apply \u0026 Перезапуск\"",
 	"1. Click on \"Docker for Desktop\" menu icon\n\t\t\t2. Click \"Preferences\"\n\t\t\t3. Click \"Resources\"\n\t\t\t4. Increase \"Memory\" slider bar to {{.recommend}} or higher\n\t\t\t5. Click \"Apply \u0026 Restart\"": "1. Кликните на иконку \"Docker for Desktop\"\n\t\t\t2. Выберите \"Preferences\"\n\t\t\t3. Нажмите \"Resources\"\n\t\t\t4. Увеличьте кол-во \"emory\" до {{.recommend}} или выше\n\t\t\t5. Нажмите \"Apply \u0026 Перезапуск\"",
@@ -548,6 +550,7 @@
 	"Select a valid value for --dnsdomain": "",
 	"Send trace events. Options include: [gcp]": "",
 	"Service '{{.service}}' was not found in '{{.namespace}}' namespace.\nYou may select another namespace by using 'minikube service {{.service}} -n \u003cnamespace\u003e'. Or list out all the services using 'minikube service list'": "",
+	"Set a static IP for the minikube cluster, the IP must be: private, IPv4, and the last octet must be between 2 and 254, for example 192.168.200.200 (Docker and Podman drivers only)": "",
 	"Set failed": "",
 	"Set flag to delete all profiles": "",
 	"Set flag to stop all profiles (clusters)": "",
@@ -831,6 +834,7 @@
 	"You cannot change the CPUs for an existing minikube cluster. Please first delete the cluster.": "",
 	"You cannot change the disk size for an existing minikube cluster. Please first delete the cluster.": "",
 	"You cannot change the memory size for an existing minikube cluster. Please first delete the cluster.": "",
+	"You cannot change the static IP of an existing minikube cluster. Please first delete the cluster.": "",
 	"You have authenticated with a service account that does not have an associated JSON file. The GCP Auth addon requires credentials with a JSON file in order to continue.": "",
 	"You have chosen to disable the CNI but the \"{{.name}}\" container runtime requires CNI": "",
 	"You have selected \"virtualbox\" driver, but there are better options !\nFor better performance and support consider using a different driver: {{.drivers}}\n\nTo turn off this warning run:\n\n\t$ minikube config set WantVirtualBoxDriverWarning false\n\n\nTo learn more about on minikube drivers checkout https://minikube.sigs.k8s.io/docs/drivers/\nTo see benchmarks checkout https://minikube.sigs.k8s.io/docs/benchmarks/cpuusage/\n\n": "",
diff --git a/translations/strings.txt b/translations/strings.txt
index 6c1d0abed..96b20fc9d 100644
--- a/translations/strings.txt
+++ b/translations/strings.txt
@@ -23,6 +23,8 @@
 	"--kvm-numa-count range is 1-8": "",
 	"--network flag is only valid with the docker/podman, KVM and Qemu drivers, it will be ignored": "",
 	"--network with QEMU must be 'user' or 'socket_vmnet'": "",
+	"--static-ip is only implemented on Docker and Podman drivers, flag will be ignored": "",
+	"--static-ip overrides --subnet, --subnet will be ignored": "",
 	"1) Recreate the cluster with Kubernetes {{.new}}, by running:\n\t  \n\t\t  minikube delete{{.profile}}\n\t\t  minikube start{{.profile}} --kubernetes-version={{.prefix}}{{.new}}\n\t  \n\t\t2) Create a second cluster with Kubernetes {{.new}}, by running:\n\t  \n\t\t  minikube start -p {{.suggestedName}} --kubernetes-version={{.prefix}}{{.new}}\n\t  \n\t\t3) Use the existing cluster at version Kubernetes {{.old}}, by running:\n\t  \n\t\t  minikube start{{.profile}} --kubernetes-version={{.prefix}}{{.old}}\n\t\t": "",
 	"1. Click on \"Docker for Desktop\" menu icon\n\t\t\t2. Click \"Preferences\"\n\t\t\t3. Click \"Resources\"\n\t\t\t4. Increase \"CPUs\" slider bar to 2 or higher\n\t\t\t5. Click \"Apply \u0026 Restart\"": "",
 	"1. Click on \"Docker for Desktop\" menu icon\n\t\t\t2. Click \"Preferences\"\n\t\t\t3. Click \"Resources\"\n\t\t\t4. Increase \"Memory\" slider bar to {{.recommend}} or higher\n\t\t\t5. Click \"Apply \u0026 Restart\"": "",
@@ -548,6 +550,7 @@
 	"Select a valid value for --dnsdomain": "",
 	"Send trace events. Options include: [gcp]": "",
 	"Service '{{.service}}' was not found in '{{.namespace}}' namespace.\nYou may select another namespace by using 'minikube service {{.service}} -n \u003cnamespace\u003e'. Or list out all the services using 'minikube service list'": "",
+	"Set a static IP for the minikube cluster, the IP must be: private, IPv4, and the last octet must be between 2 and 254, for example 192.168.200.200 (Docker and Podman drivers only)": "",
 	"Set failed": "",
 	"Set flag to delete all profiles": "",
 	"Set flag to stop all profiles (clusters)": "",
@@ -831,6 +834,7 @@
 	"You cannot change the CPUs for an existing minikube cluster. Please first delete the cluster.": "",
 	"You cannot change the disk size for an existing minikube cluster. Please first delete the cluster.": "",
 	"You cannot change the memory size for an existing minikube cluster. Please first delete the cluster.": "",
+	"You cannot change the static IP of an existing minikube cluster. Please first delete the cluster.": "",
 	"You have authenticated with a service account that does not have an associated JSON file. The GCP Auth addon requires credentials with a JSON file in order to continue.": "",
 	"You have chosen to disable the CNI but the \"{{.name}}\" container runtime requires CNI": "",
 	"You have selected \"virtualbox\" driver, but there are better options !\nFor better performance and support consider using a different driver: {{.drivers}}\n\nTo turn off this warning run:\n\n\t$ minikube config set WantVirtualBoxDriverWarning false\n\n\nTo learn more about on minikube drivers checkout https://minikube.sigs.k8s.io/docs/drivers/\nTo see benchmarks checkout https://minikube.sigs.k8s.io/docs/benchmarks/cpuusage/\n\n": "",
diff --git a/translations/zh-CN.json b/translations/zh-CN.json
index b3d8ef157..e6c661863 100644
--- a/translations/zh-CN.json
+++ b/translations/zh-CN.json
@@ -31,6 +31,8 @@
 	"--network flag is only valid with the docker/podman and KVM drivers, it will be ignored": "--network 标识仅对 docker/podman 和 KVM 驱动程序有效，它将被忽略",
 	"--network flag is only valid with the docker/podman, KVM and Qemu drivers, it will be ignored": "",
 	"--network with QEMU must be 'user' or 'socket_vmnet'": "",
+	"--static-ip is only implemented on Docker and Podman drivers, flag will be ignored": "",
+	"--static-ip overrides --subnet, --subnet will be ignored": "",
 	"1) Recreate the cluster with Kubernetes {{.new}}, by running:\n\t  \n\t\t  minikube delete{{.profile}}\n\t\t  minikube start{{.profile}} --kubernetes-version={{.prefix}}{{.new}}\n\t  \n\t\t2) Create a second cluster with Kubernetes {{.new}}, by running:\n\t  \n\t\t  minikube start -p {{.suggestedName}} --kubernetes-version={{.prefix}}{{.new}}\n\t  \n\t\t3) Use the existing cluster at version Kubernetes {{.old}}, by running:\n\t  \n\t\t  minikube start{{.profile}} --kubernetes-version={{.prefix}}{{.old}}\n\t\t": "",
 	"1. Click on \"Docker for Desktop\" menu icon\n\t\t\t2. Click \"Preferences\"\n\t\t\t3. Click \"Resources\"\n\t\t\t4. Increase \"CPUs\" slider bar to 2 or higher\n\t\t\t5. Click \"Apply \u0026 Restart\"": "",
 	"1. Click on \"Docker for Desktop\" menu icon\n\t\t\t2. Click \"Preferences\"\n\t\t\t3. Click \"Resources\"\n\t\t\t4. Increase \"Memory\" slider bar to {{.recommend}} or higher\n\t\t\t5. Click \"Apply \u0026 Restart\"": "",
@@ -684,6 +686,7 @@
 	"Selecting '{{.driver}}' driver from user configuration (alternates: {{.alternates}})": "从用户配置中选择 {{.driver}}' 驱动程序（可选：{{.alternates}}）",
 	"Send trace events. Options include: [gcp]": "",
 	"Service '{{.service}}' was not found in '{{.namespace}}' namespace.\nYou may select another namespace by using 'minikube service {{.service}} -n \u003cnamespace\u003e'. Or list out all the services using 'minikube service list'": "",
+	"Set a static IP for the minikube cluster, the IP must be: private, IPv4, and the last octet must be between 2 and 254, for example 192.168.200.200 (Docker and Podman drivers only)": "",
 	"Set failed": "",
 	"Set flag to delete all profiles": "设置标志以删除所有配置文件",
 	"Set flag to stop all profiles (clusters)": "",
@@ -1018,6 +1021,7 @@
 	"You cannot change the CPUs for an existing minikube cluster. Please first delete the cluster.": "",
 	"You cannot change the disk size for an existing minikube cluster. Please first delete the cluster.": "",
 	"You cannot change the memory size for an existing minikube cluster. Please first delete the cluster.": "",
+	"You cannot change the static IP of an existing minikube cluster. Please first delete the cluster.": "",
 	"You have authenticated with a service account that does not have an associated JSON file. The GCP Auth addon requires credentials with a JSON file in order to continue.": "",
 	"You have chosen to disable the CNI but the \"{{.name}}\" container runtime requires CNI": "",
 	"You have selected \"virtualbox\" driver, but there are better options !\nFor better performance and support consider using a different driver: {{.drivers}}\n\nTo turn off this warning run:\n\n\t$ minikube config set WantVirtualBoxDriverWarning false\n\n\nTo learn more about on minikube drivers checkout https://minikube.sigs.k8s.io/docs/drivers/\nTo see benchmarks checkout https://minikube.sigs.k8s.io/docs/benchmarks/cpuusage/\n\n": "",


Test patch:
diff --git a/cmd/minikube/cmd/start_test.go b/cmd/minikube/cmd/start_test.go
index ef4a1f854..9b0088f1e 100644
--- a/cmd/minikube/cmd/start_test.go
+++ b/cmd/minikube/cmd/start_test.go
@@ -665,3 +665,62 @@ func TestValidateSubnet(t *testing.T) {
 		})
 	}
 }
+
+func TestValidateStaticIP(t *testing.T) {
+	tests := []struct {
+		staticIP string
+		drvName  string
+		errorMsg string
+	}{
+		{
+			staticIP: "8.8.8.8",
+			drvName:  "docker",
+			errorMsg: "static IP must be private",
+		},
+		{
+			staticIP: "8.8.8.8",
+			drvName:  "hyperkit",
+			errorMsg: "",
+		},
+		{
+			staticIP: "fdfc:a4c0:e99e:7ad3::",
+			drvName:  "docker",
+			errorMsg: "static IP must be IPv4",
+		},
+		{
+			staticIP: "192.168.49.0",
+			drvName:  "docker",
+			errorMsg: "static IPs last octet must be between 2 and 254 (X.X.X.2 - X.X.X.254), for example 192.168.200.200",
+		},
+		{
+			staticIP: "192.168.49.1",
+			drvName:  "docker",
+			errorMsg: "static IPs last octet must be between 2 and 254 (X.X.X.2 - X.X.X.254), for example 192.168.200.200",
+		},
+		{
+			staticIP: "192.168.49.255",
+			drvName:  "docker",
+			errorMsg: "static IPs last octet must be between 2 and 254 (X.X.X.2 - X.X.X.254), for example 192.168.200.200",
+		},
+		{
+			staticIP: "192.168.49.2",
+			drvName:  "docker",
+			errorMsg: "",
+		},
+		{
+			staticIP: "192.168.49.254",
+			drvName:  "docker",
+			errorMsg: "",
+		},
+	}
+	for _, tt := range tests {
+		gotError := ""
+		got := validateStaticIP(tt.staticIP, tt.drvName, "")
+		if got != nil {
+			gotError = got.Error()
+		}
+		if gotError != tt.errorMsg {
+			t.Errorf("validateStaticIP(%s, %s): got %v, expected %v", tt.staticIP, tt.drvName, got, tt.errorMsg)
+		}
+	}
+}
diff --git a/site/content/en/docs/contrib/tests.en.md b/site/content/en/docs/contrib/tests.en.md
index a5fd4fe49..93b872aec 100644
--- a/site/content/en/docs/contrib/tests.en.md
+++ b/site/content/en/docs/contrib/tests.en.md
@@ -455,6 +455,9 @@ verifies the docker driver and run with an existing network
 ## TestKicCustomSubnet
 verifies the docker/podman driver works with a custom subnet
 
+## TestKicStaticIP
+starts minikube with the static IP flag
+
 ## TestingKicBaseImage
 will return true if the integraiton test is running against a passed --base-image flag
 
diff --git a/test/integration/kic_custom_network_test.go b/test/integration/kic_custom_network_test.go
index 85d2822e0..322916290 100644
--- a/test/integration/kic_custom_network_test.go
+++ b/test/integration/kic_custom_network_test.go
@@ -74,7 +74,7 @@ func TestKicExistingNetwork(t *testing.T) {
 	}
 	// create custom network
 	networkName := "existing-network"
-	if _, err := oci.CreateNetwork(oci.Docker, networkName, ""); err != nil {
+	if _, err := oci.CreateNetwork(oci.Docker, networkName, "", ""); err != nil {
 		t.Fatalf("error creating network: %v", err)
 	}
 	defer func() {
@@ -117,6 +117,34 @@ func TestKicCustomSubnet(t *testing.T) {
 	verifySubnet(ctx, t, profile, subnet)
 }
 
+// TestKicStaticIP starts minikube with the static IP flag
+func TestKicStaticIP(t *testing.T) {
+	if !KicDriver() {
+		t.Skip("only run with docker/podman driver")
+	}
+	profile := UniqueProfileName("static-ip")
+	ctx, cancel := context.WithTimeout(context.Background(), Minutes(5))
+	defer Cleanup(t, profile, cancel)
+
+	staticIP := "192.168.200.200"
+	startArgs := []string{"start", "-p", profile, fmt.Sprintf("--static-ip=%s", staticIP)}
+	c := exec.CommandContext(ctx, Target(), startArgs...)
+	rr, err := Run(t, c)
+	if err != nil {
+		t.Fatalf("%v failed: %v\n%v", rr.Command(), err, rr.Output())
+	}
+
+	c = exec.CommandContext(ctx, Target(), "-p", profile, "ip")
+	rr, err = Run(t, c)
+	if err != nil {
+		t.Fatalf("%s failed: %v\n%s", rr.Command(), err, rr.Output())
+	}
+
+	if !strings.Contains(rr.Output(), staticIP) {
+		t.Errorf("static IP (%s) not found in output %s", staticIP, rr.Output())
+	}
+}
+
 func verifyNetworkExists(ctx context.Context, t *testing.T, networkName string) {
 	c := exec.CommandContext(ctx, "docker", "network", "ls", "--format", "{{.Name}}")
 	rr, err := Run(t, c)