Skip to content

Commit 7b32547

Browse files
authored
Merge pull request #3108 from sebcworks/sebcworks-customapiserverport
Allow to specify api server port through CLI fix #2781
2 parents 00caba2 + e551231 commit 7b32547

File tree

6 files changed

+66
-4
lines changed

6 files changed

+66
-4
lines changed

Diff for: cmd/minikube/cmd/start.go

+4-1
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,7 @@ const (
6666
createMount = "mount"
6767
featureGates = "feature-gates"
6868
apiServerName = "apiserver-name"
69+
apiServerPort = "apiserver-port"
6970
dnsDomain = "dns-domain"
7071
serviceCIDR = "service-cluster-ip-range"
7172
mountString = "mount-string"
@@ -226,6 +227,7 @@ func runStart(cmd *cobra.Command, args []string) {
226227
kubernetesConfig := cfg.KubernetesConfig{
227228
KubernetesVersion: selectedKubernetesVersion,
228229
NodeIP: ip,
230+
NodePort: viper.GetInt(apiServerPort),
229231
NodeName: constants.DefaultNodeName,
230232
APIServerName: viper.GetString(apiServerName),
231233
APIServerNames: apiServerNames,
@@ -281,7 +283,7 @@ func runStart(cmd *cobra.Command, args []string) {
281283
glog.Errorln("Error connecting to cluster: ", err)
282284
}
283285
kubeHost = strings.Replace(kubeHost, "tcp://", "https://", -1)
284-
kubeHost = strings.Replace(kubeHost, ":2376", ":"+strconv.Itoa(pkgutil.APIServerPort), -1)
286+
kubeHost = strings.Replace(kubeHost, ":2376", ":"+strconv.Itoa(kubernetesConfig.NodePort), -1)
285287

286288
fmt.Println("Setting up kubeconfig...")
287289
// setup kubeconfig
@@ -472,6 +474,7 @@ func init() {
472474
startCmd.Flags().String(NFSSharesRoot, "/nfsshares", "Where to root the NFS Shares (defaults to /nfsshares, only supported with hyperkit now)")
473475
startCmd.Flags().StringArrayVar(&dockerEnv, "docker-env", nil, "Environment variables to pass to the Docker daemon. (format: key=value)")
474476
startCmd.Flags().StringArrayVar(&dockerOpt, "docker-opt", nil, "Specify arbitrary flags to pass to the Docker daemon. (format: key=value)")
477+
startCmd.Flags().Int(apiServerPort, pkgutil.APIServerPort, "The apiserver listening port")
475478
startCmd.Flags().String(apiServerName, constants.APIServerName, "The apiserver name which is used in the generated certificate for kubernetes. This can be used if you want to make the apiserver available from outside the machine")
476479
startCmd.Flags().StringArrayVar(&apiServerNames, "apiserver-names", nil, "A set of apiserver names which are used in the generated certificate for kubernetes. This can be used if you want to make the apiserver available from outside the machine")
477480
startCmd.Flags().IPSliceVar(&apiServerIPs, "apiserver-ips", nil, "A set of apiserver IP Addresses which are used in the generated certificate for kubernetes. This can be used if you want to make the apiserver available from outside the machine")

Diff for: pkg/minikube/bootstrapper/kubeadm/kubeadm.go

+7-1
Original file line numberDiff line numberDiff line change
@@ -427,6 +427,12 @@ func generateConfig(k8s config.KubernetesConfig) (string, error) {
427427
return "", errors.Wrap(err, "generating extra component config for kubeadm")
428428
}
429429

430+
// In case of no port assigned, use util.APIServerPort
431+
nodePort := k8s.NodePort
432+
if nodePort <= 0 {
433+
nodePort = util.APIServerPort
434+
}
435+
430436
opts := struct {
431437
CertDir string
432438
ServiceCIDR string
@@ -443,7 +449,7 @@ func generateConfig(k8s config.KubernetesConfig) (string, error) {
443449
CertDir: util.DefaultCertPath,
444450
ServiceCIDR: util.DefaultServiceCIDR,
445451
AdvertiseAddress: k8s.NodeIP,
446-
APIServerPort: util.APIServerPort,
452+
APIServerPort: nodePort,
447453
KubernetesVersion: k8s.KubernetesVersion,
448454
EtcdDataDir: "/data/minikube", //TODO(r2d4): change to something else persisted
449455
NodeName: k8s.NodeName,

Diff for: pkg/minikube/bootstrapper/kubeadm/kubeadm_test.go

+26
Original file line numberDiff line numberDiff line change
@@ -228,6 +228,32 @@ schedulerExtraArgs:
228228
},
229229
shouldErr: true,
230230
},
231+
{
232+
description: "custom api server port",
233+
cfg: config.KubernetesConfig{
234+
NodeIP: "192.168.1.100",
235+
NodePort: 18443,
236+
KubernetesVersion: "v1.10.0",
237+
NodeName: "minikube",
238+
},
239+
expectedCfg: `apiVersion: kubeadm.k8s.io/v1alpha1
240+
kind: MasterConfiguration
241+
noTaintMaster: true
242+
api:
243+
advertiseAddress: 192.168.1.100
244+
bindPort: 18443
245+
controlPlaneEndpoint: localhost
246+
kubernetesVersion: v1.10.0
247+
certificatesDir: /var/lib/minikube/certs/
248+
networking:
249+
serviceSubnet: 10.96.0.0/12
250+
etcd:
251+
dataDir: /data/minikube
252+
nodeName: minikube
253+
apiServerExtraArgs:
254+
admission-control: "Initializers,NamespaceLifecycle,LimitRanger,ServiceAccount,DefaultStorageClass,DefaultTolerationSeconds,NodeRestriction,MutatingAdmissionWebhook,ValidatingAdmissionWebhook,ResourceQuota"
255+
`,
256+
},
231257
}
232258

233259
for _, test := range tests {

Diff for: pkg/minikube/bootstrapper/kubeadm/util.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -177,7 +177,7 @@ func restartKubeProxy(k8s config.KubernetesConfig) error {
177177
APIServerPort int
178178
}{
179179
AdvertiseAddress: k8s.NodeIP,
180-
APIServerPort: util.APIServerPort,
180+
APIServerPort: k8s.NodePort,
181181
}
182182

183183
kubeconfig := bytes.Buffer{}

Diff for: pkg/minikube/config/types.go

+1
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,7 @@ type MachineConfig struct {
5858
type KubernetesConfig struct {
5959
KubernetesVersion string
6060
NodeIP string
61+
NodePort int
6162
NodeName string
6263
APIServerName string
6364
APIServerNames []string

Diff for: pkg/util/kubeconfig/config.go

+27-1
Original file line numberDiff line numberDiff line change
@@ -249,12 +249,16 @@ func UpdateKubeconfigIP(ip net.IP, filename string, machineName string) (bool, e
249249
if kip.Equal(ip) {
250250
return false, nil
251251
}
252+
kport, err := getPortFromKubeConfig(filename, machineName)
253+
if err != nil {
254+
return false, err
255+
}
252256
con, err := ReadConfigOrNew(filename)
253257
if err != nil {
254258
return false, errors.Wrap(err, "Error getting kubeconfig status")
255259
}
256260
// Safe to lookup server because if field non-existent getIPFromKubeconfig would have given an error
257-
con.Clusters[machineName].Server = "https://" + ip.String() + ":" + strconv.Itoa(util.APIServerPort)
261+
con.Clusters[machineName].Server = "https://" + ip.String() + ":" + strconv.Itoa(kport)
258262
err = WriteConfig(con, filename)
259263
if err != nil {
260264
return false, err
@@ -284,3 +288,25 @@ func getIPFromKubeConfig(filename, machineName string) (net.IP, error) {
284288
ip := net.ParseIP(kip)
285289
return ip, nil
286290
}
291+
292+
// getPortFromKubeConfig returns the Port number stored for minikube in the kubeconfig specified
293+
func getPortFromKubeConfig(filename, machineName string) (int, error) {
294+
con, err := ReadConfigOrNew(filename)
295+
if err != nil {
296+
return 0, errors.Wrap(err, "Error getting kubeconfig status")
297+
}
298+
cluster, ok := con.Clusters[machineName]
299+
if !ok {
300+
return 0, errors.Errorf("Kubeconfig does not have a record of the machine cluster")
301+
}
302+
kurl, err := url.Parse(cluster.Server)
303+
if err != nil {
304+
return util.APIServerPort, nil
305+
}
306+
_, kport, err := net.SplitHostPort(kurl.Host)
307+
if err != nil {
308+
return util.APIServerPort, nil
309+
}
310+
port, err := strconv.Atoi(kport)
311+
return port, err
312+
}

0 commit comments

Comments
 (0)