@@ -237,24 +237,23 @@ function Set-EnvironmentVars {
237
237
" CNI_DIR" = ${kube_env} [' CNI_DIR' ]
238
238
" CNI_CONFIG_DIR" = ${kube_env} [' CNI_CONFIG_DIR' ]
239
239
" PKI_DIR" = ${kube_env} [' PKI_DIR' ]
240
+ " CA_FILE_PATH" = ${kube_env} [' CA_FILE_PATH' ]
240
241
" KUBELET_CONFIG" = ${kube_env} [' KUBELET_CONFIG_FILE' ]
241
242
" BOOTSTRAP_KUBECONFIG" = ${kube_env} [' BOOTSTRAP_KUBECONFIG_FILE' ]
243
+ " KUBECONFIG" = ${kube_env} [' KUBECONFIG_FILE' ]
242
244
" KUBEPROXY_KUBECONFIG" = ${kube_env} [' KUBEPROXY_KUBECONFIG_FILE' ]
245
+ " LOGS_DIR" = ${kube_env} [' LOGS_DIR' ]
246
+ " MANIFESTS_DIR" = ${kube_env} [' MANIFESTS_DIR' ]
243
247
244
248
" Path" = ${env: Path} + " ;" + ${kube_env} [' NODE_DIR' ]
245
249
" KUBE_NETWORK" = " l2bridge" .ToLower()
246
- " CA_CERT_BUNDLE_PATH" = ${kube_env} [' PKI_DIR' ] + ' \ca-certificates.crt'
247
250
" KUBELET_CERT_PATH" = ${kube_env} [' PKI_DIR' ] + ' \kubelet.crt'
248
251
" KUBELET_KEY_PATH" = ${kube_env} [' PKI_DIR' ] + ' \kubelet.key'
249
252
250
253
" CONTAINER_RUNTIME" = ${kube_env} [' CONTAINER_RUNTIME' ]
251
254
" CONTAINER_RUNTIME_ENDPOINT" = ${kube_env} [' CONTAINER_RUNTIME_ENDPOINT' ]
252
255
253
- # TODO(pjh): these are only in flags, can be removed from env once flags are
254
- # moved to util.sh:
255
- " LOGS_DIR" = ${kube_env} [' LOGS_DIR' ]
256
- " MANIFESTS_DIR" = ${kube_env} [' MANIFESTS_DIR' ]
257
- " KUBECONFIG" = ${kube_env} [' KUBECONFIG_FILE' ]
256
+ ' LICENSE_DIR' = ' C:\Program Files\Google\Compute Engine\THIRD_PARTY_NOTICES'
258
257
}
259
258
260
259
# Set the environment variables in two ways: permanently on the machine (only
@@ -289,7 +288,7 @@ function Create-Directories {
289
288
Log- Output " Creating ${env: K8S_DIR} and its subdirectories."
290
289
ForEach ($dir in (" ${env: K8S_DIR} " , " ${env: NODE_DIR} " , " ${env: LOGS_DIR} " ,
291
290
" ${env: CNI_DIR} " , " ${env: CNI_CONFIG_DIR} " , " ${env: MANIFESTS_DIR} " ,
292
- " ${env: PKI_DIR} " ), " C:\tmp" , " C:\var\log" ) {
291
+ " ${env: PKI_DIR} " , " ${ env: LICENSE_DIR} " ), " C:\tmp" , " C:\var\log" ) {
293
292
mkdir - Force $dir
294
293
}
295
294
}
@@ -322,6 +321,39 @@ function Get_ContainerVersionLabel {
322
321
" version label" )
323
322
}
324
323
324
+ # Downloads the gke-exec-auth-plugin for TPM-based authentication to the
325
+ # master, if auth plugin support has been requested for this node (see
326
+ # Test-NodeUsesAuthPlugin).
327
+ # https://github.com/kubernetes/cloud-provider-gcp/tree/master/cmd/gke-exec-auth-plugin
328
+ #
329
+ # Required ${kube_env} keys:
330
+ # EXEC_AUTH_PLUGIN_LICENSE_URL
331
+ # EXEC_AUTH_PLUGIN_SHA1
332
+ # EXEC_AUTH_PLUGIN_URL
333
+ function DownloadAndInstall-AuthPlugin {
334
+ if (-not (Test-NodeUsesAuthPlugin ${kube_env} )) {
335
+ Log- Output ' Skipping download of auth plugin'
336
+ return
337
+ }
338
+ if (-not (ShouldWrite- File " ${env: NODE_DIR} \gke-exec-auth-plugin.exe" )) {
339
+ return
340
+ }
341
+
342
+ if (-not ($kube_env.ContainsKey (' EXEC_AUTH_PLUGIN_LICENSE_URL' ) -and
343
+ $kube_env.ContainsKey (' EXEC_AUTH_PLUGIN_SHA1' ) -and
344
+ $kube_env.ContainsKey (' EXEC_AUTH_PLUGIN_URL' ))) {
345
+ Log- Output - Fatal (" Missing one or more kube-env keys needed for " +
346
+ " downloading auth plugin: $ ( Out-String $kube_env ) " )
347
+ }
348
+ MustDownload- File `
349
+ - URLs ${kube_env} [' EXEC_AUTH_PLUGIN_URL' ] `
350
+ - Hash ${kube_env} [' EXEC_AUTH_PLUGIN_SHA1' ] `
351
+ - OutFile " ${env: NODE_DIR} \gke-exec-auth-plugin.exe"
352
+ MustDownload- File `
353
+ - URLs ${kube_env} [' EXEC_AUTH_PLUGIN_LICENSE_URL' ] `
354
+ - OutFile " ${env: LICENSE_DIR} \LICENSE_gke-exec-auth-plugin.txt"
355
+ }
356
+
325
357
# Downloads the Kubernetes binaries from kube-env's NODE_BINARY_TAR_URL and
326
358
# puts them in a subdirectory of $env:K8S_DIR.
327
359
#
@@ -477,44 +509,66 @@ function Write_PkiData {
477
509
#
478
510
# Required ${kube_env} keys:
479
511
# CA_CERT
512
+ # ${kube_env} keys that can be omitted for nodes that do not use an
513
+ # authentication plugin:
480
514
# KUBELET_CERT
481
515
# KUBELET_KEY
482
516
function Create-NodePki {
483
- Log- Output " Creating node pki files"
517
+ Log- Output ' Creating node pki files'
518
+
519
+ if ($kube_env.ContainsKey (' CA_CERT' )) {
520
+ $CA_CERT_BUNDLE = ${kube_env} [' CA_CERT' ]
521
+ Write_PkiData " ${CA_CERT_BUNDLE} " ${env: CA_FILE_PATH}
522
+ }
523
+ else {
524
+ Log- Output - Fatal ' CA_CERT not present in kube-env'
525
+ }
484
526
485
- $CA_CERT_BUNDLE = ${kube_env} [' CA_CERT' ]
486
- $KUBELET_CERT = ${kube_env} [' KUBELET_CERT' ]
487
- $KUBELET_KEY = ${kube_env} [' KUBELET_KEY' ]
527
+ # On nodes that use a plugin to support authentication, KUBELET_CERT and
528
+ # KUBELET_KEY will not be present - TPM_BOOTSTRAP_CERT and TPM_BOOTSTRAP_KEY
529
+ # should be set instead.
530
+ if (Test-NodeUsesAuthPlugin ${kube_env} ) {
531
+ Log- Output (' Skipping KUBELET_CERT and KUBELET_KEY, plugin will be used ' +
532
+ ' for authentication' )
533
+ return
534
+ }
535
+
536
+ if ($kube_env.ContainsKey (' KUBELET_CERT' )) {
537
+ $KUBELET_CERT = ${kube_env} [' KUBELET_CERT' ]
538
+ Write_PkiData " ${KUBELET_CERT} " ${env: KUBELET_CERT_PATH}
539
+ }
540
+ else {
541
+ Log- Output - Fatal ' KUBELET_CERT not present in kube-env'
542
+ }
543
+ if ($kube_env.ContainsKey (' KUBELET_KEY' )) {
544
+ $KUBELET_KEY = ${kube_env} [' KUBELET_KEY' ]
545
+ Write_PkiData " ${KUBELET_KEY} " ${env: KUBELET_KEY_PATH}
546
+ }
547
+ else {
548
+ Log- Output - Fatal ' KUBELET_KEY not present in kube-env'
549
+ }
488
550
489
- Write_PkiData " ${CA_CERT_BUNDLE} " ${env: CA_CERT_BUNDLE_PATH}
490
- Write_PkiData " ${KUBELET_CERT} " ${env: KUBELET_CERT_PATH}
491
- Write_PkiData " ${KUBELET_KEY} " ${env: KUBELET_KEY_PATH}
492
551
Get-ChildItem ${env: PKI_DIR}
493
552
}
494
553
495
- # Creates the kubelet kubeconfig at $env:BOOTSTRAP_KUBECONFIG.
554
+ # Creates the bootstrap kubelet kubeconfig at $env:BOOTSTRAP_KUBECONFIG.
555
+ # https://kubernetes.io/docs/reference/command-line-tools-reference/kubelet-tls-bootstrapping/
496
556
#
497
557
# Create-NodePki() must be called first.
498
558
#
499
559
# Required ${kube_env} keys:
500
560
# KUBERNETES_MASTER_NAME: the apiserver IP address.
501
- function Create-KubeletKubeconfig {
502
- # The API server IP address comes from KUBERNETES_MASTER_NAME in kube- env, I
503
- # think. cluster/gce/gci/configure-helper.sh?l=2801
504
- $apiserverAddress = ${kube_env} [ ' KUBERNETES_MASTER_NAME ' ]
561
+ function Write_BootstrapKubeconfig {
562
+ if ( -not (ShouldWrite - File ${ env: BOOTSTRAP_KUBECONFIG} )) {
563
+ return
564
+ }
505
565
506
- # TODO(pjh): set these using kube-env values.
507
- $createBootstrapConfig = $true
508
- $fetchBootstrapConfig = $false
566
+ # TODO(mtaufen): is user "kubelet" correct? Other examples use e.g.
567
+ # "system:node:$(hostname)".
509
568
510
- if (${createBootstrapConfig} ) {
511
- if (-not (ShouldWrite- File ${env: BOOTSTRAP_KUBECONFIG} )) {
512
- return
513
- }
514
- New-Item - Force - ItemType file ${env: BOOTSTRAP_KUBECONFIG} | Out-Null
515
- # TODO(mtaufen): is user "kubelet" correct? Other examples use e.g.
516
- # "system:node:$(hostname)".
517
- Set-Content ${env: BOOTSTRAP_KUBECONFIG} `
569
+ $apiserverAddress = ${kube_env} [' KUBERNETES_MASTER_NAME' ]
570
+ New-Item - Force - ItemType file ${env: BOOTSTRAP_KUBECONFIG} | Out-Null
571
+ Set-Content ${env: BOOTSTRAP_KUBECONFIG} `
518
572
' apiVersion: v1
519
573
kind: Config
520
574
users:
@@ -526,30 +580,53 @@ clusters:
526
580
- name: local
527
581
cluster:
528
582
server: https://APISERVER_ADDRESS
529
- certificate-authority: CA_CERT_BUNDLE_PATH
583
+ certificate-authority: CA_FILE_PATH
530
584
contexts:
531
585
- context:
532
586
cluster: local
533
587
user: kubelet
534
588
name: service-account-context
535
589
current-context: service-account-context' .`
536
- replace(' KUBELET_CERT_PATH' , ${env: KUBELET_CERT_PATH} ).`
537
- replace(' KUBELET_KEY_PATH' , ${env: KUBELET_KEY_PATH} ).`
538
- replace(' APISERVER_ADDRESS' , ${apiserverAddress} ).`
539
- replace(' CA_CERT_BUNDLE_PATH' , ${env: CA_CERT_BUNDLE_PATH} )
540
- Log- Output (" kubelet bootstrap kubeconfig:`n " +
541
- " $ ( Get-Content - Raw ${env: BOOTSTRAP_KUBECONFIG} ) " )
590
+ replace(' KUBELET_CERT_PATH' , ${env: KUBELET_CERT_PATH} ).`
591
+ replace(' KUBELET_KEY_PATH' , ${env: KUBELET_KEY_PATH} ).`
592
+ replace(' APISERVER_ADDRESS' , ${apiserverAddress} ).`
593
+ replace(' CA_FILE_PATH' , ${env: CA_FILE_PATH} )
594
+ Log- Output (" kubelet bootstrap kubeconfig:`n " +
595
+ " $ ( Get-Content - Raw ${env: BOOTSTRAP_KUBECONFIG} ) " )
596
+ }
597
+
598
+ # Fetches the kubelet kubeconfig from the metadata server and writes it to
599
+ # $env:KUBECONFIG.
600
+ #
601
+ # Create-NodePki() must be called first.
602
+ function Write_KubeconfigFromMetadata {
603
+ if (-not (ShouldWrite- File ${env: KUBECONFIG} )) {
604
+ return
542
605
}
543
- elseif (${fetchBootstrapConfig} ) {
544
- Log_NotImplemented `
545
- " fetching kubelet bootstrap-kubeconfig file from metadata"
546
- # get-metadata-value "instance/attributes/bootstrap-kubeconfig" >
547
- # /var/lib/kubelet/bootstrap-kubeconfig
548
- Log- Output (" kubelet bootstrap kubeconfig:`n " +
549
- " $ ( Get-Content - Raw ${env: BOOTSTRAP_KUBECONFIG} ) " )
606
+
607
+ $kubeconfig = Get-InstanceMetadataAttribute ' kubeconfig'
608
+ if ($kubeconfig -eq $null ) {
609
+ Log- Output `
610
+ " kubeconfig metadata key not found, can't write ${env: KUBECONFIG} " `
611
+ - Fatal
550
612
}
551
- else {
552
- Log_NotImplemented " fetching kubelet kubeconfig file from metadata"
613
+ Set-Content ${env: KUBECONFIG} $kubeconfig
614
+ Log- Output (" kubelet kubeconfig from metadata (non-bootstrap):`n " +
615
+ " $ ( Get-Content - Raw ${env: KUBECONFIG} ) " )
616
+ }
617
+
618
+ # Creates the kubelet kubeconfig at $env:KUBECONFIG for nodes that use an
619
+ # authentication plugin, or at $env:BOOTSTRAP_KUBECONFIG for nodes that do not.
620
+ #
621
+ # Create-NodePki() must be called first.
622
+ #
623
+ # Required ${kube_env} keys:
624
+ # KUBERNETES_MASTER_NAME: the apiserver IP address.
625
+ function Create-KubeletKubeconfig {
626
+ if (Test-NodeUsesAuthPlugin ${kube_env} ) {
627
+ Write_KubeconfigFromMetadata
628
+ } else {
629
+ Write_BootstrapKubeconfig
553
630
}
554
631
}
555
632
@@ -1045,6 +1122,11 @@ function Start-WorkerServices {
1045
1122
" --pod-infra-container-image=${INFRA_CONTAINER} "
1046
1123
)
1047
1124
$kubelet_args = ${default_kubelet_args} + ${kubelet_args}
1125
+ if (-not (Test-NodeUsesAuthPlugin ${kube_env} )) {
1126
+ Log- Output ' Using bootstrap kubeconfig for authentication'
1127
+ $kubelet_args = (${kubelet_args} +
1128
+ " --bootstrap-kubeconfig=${env: BOOTSTRAP_KUBECONFIG} " )
1129
+ }
1048
1130
Log- Output " Final kubelet_args: ${kubelet_args} "
1049
1131
1050
1132
# Compute kube-proxy args
0 commit comments