Auf dieser Seite wird erläutert, wie Sie die virtuelle Maschine der Administrator-Workstation zum ersten Mal erstellen. Auf dieser Seite wird auch erläutert, wie Sie den Docker-Daemon der Workstation für die Arbeit mit einem Proxy konfigurieren.
Siehe auch Upgrade einer vorhandenen Administrator-Workstation.
Übersicht
Verwenden Sie HashiCorp Terraform Version 0.11, um eine virtuelle Administrator-Workstation in vSphere bereitzustellen, und verwenden Sie die Verwaltungsworkstation, um GKE On-Prem zu installieren. Sie laden die Open Virtual Appliance-Datei (OVA) der Administrator-Workstation herunter und stellen die VM mit Terraform in vSphere bereit.
Hinweis
- Laden Sie die OVA für die Administrator-Workstation herunter.
- Übersicht über die Administrator-Workstation
OVA der Administrator-Workstation bereitstellen
Führen Sie die folgenden Schritte aus, um die OVA bereitzustellen:
Speichern Sie eine der folgenden Terraform-Konfigurationen, je nachdem, ob Sie DHCP- oder statische IP-Adressen verwenden. Achten Sie darauf, sowohl die TZ- als auch die TFVARS-Datei zu speichern. Die TF-Datei ist die Terraform-HCL-Konfiguration und die TFVARS-Datei deklariert die in der Konfiguration zu verwendenden Variablen:
dhcp.tf
######################### ####### VARIABLES ####### ######################### # vSphere username variable "vsphere_user" { } # vSphere password variable "vsphere_password" { } # vSphere server address variable "vsphere_server" { } # Install this public key in the created VM variable "ssh_public_key_path" { default = "~/.ssh/vsphere_workstation.pub" } # vSphere network to use for the VM variable "network" { default = "VM Network"} # Hostname for the VM variable "vm_name" { default = "vsphere-workstation" } # vSphere datacenter to create this VM in variable "datacenter" { } # vSphere datastore to create this VM in variable "datastore" { } # vSphere cluster to create this VM in variable "cluster" { } # vSphere resource pool to create this VM in variable "resource_pool" { } # Number of CPUs for this VM. Recommended minimum 4. variable "num_cpus" { default = 4 } # Memory in MB for this VM. Recommended minimum 8192. variable "memory" { default = 8192 } # The VM template to clone variable "vm_template" { } # Enable the provided Docker registry. If you use your own registry, set to "false" variable "registry_enable" { default = "true" } # Username to set for the Docker registry variable "registry_username" { default = "gke" } # Password to set for the Docker registry variable "registry_password" { default = "password" } # Optional DNS hostname for the registry's certificate variable "registry_dns_hostname" { default = "" } ######################### ##### FOR UPGRADING ##### ######################### # Path on disk to the htpasswd file variable "registry_htpasswd" { default = "" } // filepath # Path on disk to the certificate for the Docker registry in the admin workstation variable "registry_cert" { default = "" } // filepath # Path on disk to the registry's CA variable "registry_ca" { default = "" } // filepath # Path on disk to the registry's private key variable "registry_private_key" { default = "" } // filepath ########################## ########################## provider "vsphere" { version = "~> 1.5" user = "${var.vsphere_user}" password = "${var.vsphere_password}" vsphere_server = "${var.vsphere_server}" # if you have a self-signed cert allow_unverified_ssl = true } ### vSphere Data ### data "vsphere_datastore" "datastore" { name = "${var.datastore}" datacenter_id = "${data.vsphere_datacenter.dc.id}" } data "vsphere_datacenter" "dc" { name = "${var.datacenter}" } data "vsphere_compute_cluster" "cluster" { name = "${var.cluster}" datacenter_id = "${data.vsphere_datacenter.dc.id}" } data "vsphere_resource_pool" "pool" { name = "${var.resource_pool}" datacenter_id = "${data.vsphere_datacenter.dc.id}" } data "vsphere_network" "network" { name = "${var.network}" datacenter_id = "${data.vsphere_datacenter.dc.id}" } data "vsphere_virtual_machine" "template_from_ovf" { name = "${var.vm_template}" datacenter_id = "${data.vsphere_datacenter.dc.id}" } data "template_file" "dhcp_ip_config" { template = <<EOF network: version: 2 ethernets: ens192: dhcp4: true EOF } data "template_file" "user_data" { template = <<EOF #cloud-config apt: primary: - arches: [default] uri: http://us-west1.gce.archive.ubuntu.com/ubuntu/ write_files: - path: /etc/netplan/99-dhcp.yaml permissions: '0644' encoding: base64 content: | $${dhcp_ip_config} runcmd: - netplan apply - /var/lib/gke/guest-startup.sh $${reg_enable} $${reg_username} $${reg_password} $${reg_dns_hostname} $${reg_htpasswd} $${reg_cert} $${reg_private_key} $${reg_ca} EOF vars = { dhcp_ip_config = "${base64encode(data.template_file.dhcp_ip_config.rendered)}" reg_enable = "${var.registry_enable}" reg_username = "${var.registry_username}" reg_password = "${var.registry_password}" reg_dns_hostname = "${var.registry_dns_hostname}" reg_htpasswd = "" reg_cert = "" reg_private_key = "" reg_ca = "" ######################### ##### FOR UPGRADING ##### # reg_htpasswd = "${file(var.registry_htpasswd)}" # reg_cert = "${file(var.registry_cert)}" # reg_private_key = "${file(var.registry_private_key)}" # reg_ca = "${file(var.registry_ca)}" ######################### } } ### vSphere Resources ### resource "vsphere_virtual_machine" "vm" { name = "${var.vm_name}" resource_pool_id = "${data.vsphere_resource_pool.pool.id}" datastore_id = "${data.vsphere_datastore.datastore.id}" num_cpus = "${var.num_cpus}" memory = "${var.memory}" guest_id = "${data.vsphere_virtual_machine.template_from_ovf.guest_id}" enable_disk_uuid = "true" scsi_type = "${data.vsphere_virtual_machine.template_from_ovf.scsi_type}" network_interface { network_id = "${data.vsphere_network.network.id}" adapter_type = "${data.vsphere_virtual_machine.template_from_ovf.network_interface_types[0]}" } wait_for_guest_net_timeout = 15 nested_hv_enabled = false cpu_performance_counters_enabled = false disk { label = "disk0" size = "${max(50, data.vsphere_virtual_machine.template_from_ovf.disks.0.size)}" eagerly_scrub = "${data.vsphere_virtual_machine.template_from_ovf.disks.0.eagerly_scrub}" thin_provisioned = "${data.vsphere_virtual_machine.template_from_ovf.disks.0.thin_provisioned}" } cdrom { client_device = true } vapp { properties = { hostname = "${var.vm_name}" public-keys = "${file(var.ssh_public_key_path)}" user-data = "${base64encode(data.template_file.user_data.rendered)}" } } clone { template_uuid = "${data.vsphere_virtual_machine.template_from_ovf.id}" } } output "ip_address" { value = "${vsphere_virtual_machine.vm.default_ip_address}" }
dhcp.tfvars
vsphere_user = "administrator@vsphere.local" vsphere_password = "" # vSphere server IP or DNS name vsphere_server = "" ssh_public_key_path = "~/.ssh/vsphere_workstation.pub" vm_name = "admin-workstation" datastore = "" datacenter = "" cluster = "" resource_pool = "" network = "VM Network" num_cpus = 4 memory = 8192 vm_template = "gke-on-prem-admin-appliance-vsphere-1.0.2-gke.3" # docker registry credentials registry_enable = "true" registry_username = "gke" registry_password = "password" registry_dns_hostname = "" # only needed when re-creating the workstation and you want to # reuse registry certs. Each value is a filepath relative to this file. # registry_htpasswd="" # registry_cert="" # registry_ca="" # registry_private_key=""
static-ip.tf
######################### ####### VARIABLES ####### ######################### # vSphere username variable "vsphere_user" { } # vSphere password variable "vsphere_password" { } # vSphere server address variable "vsphere_server" { } # Install this public key in the created VM variable "ssh_public_key_path" { default = "~/.ssh/vsphere_workstation.pub" } # vSphere network to use for the VM variable "network" { default = "VM Network"} # Hostname for the VM variable "vm_name" { default = "vsphere-workstation" } # vSphere datacenter to create this VM in variable "datacenter" { } # vSphere datastore to create this VM in variable "datastore" { } # vSphere cluster to create this VM in variable "cluster" { } # vSphere resource pool to create this VM in variable "resource_pool" { } # Number of CPUs for this VM. Recommended minimum 4. variable "num_cpus" { default = 4 } # Memory in MB for this VM. Recommended minimum 8192. variable "memory" { default = 8192 } # The VM template to clone variable "vm_template" { } # The IP address to assign this this VM variable "ipv4_address" { } # Netmask prefix length variable "ipv4_netmask_prefix_length" { } # Default gateway to use variable "ipv4_gateway" { } # DNS resolvers to use variable "dns_nameservers" { } # Enable the provided Docker registry. If you use your own registry, set to "false" variable "registry_enable" { default = "true" } # Username to set for the Docker registry variable "registry_username" { default = "gke" } # Password to set for the Docker registry variable "registry_password" { default = "password" } # Optional DNS hostname for the registry's certificate variable "registry_dns_hostname" { default = "" } ######################### ##### FOR UPGRADING ##### ######################### # Path on disk to the htpasswd file variable "registry_htpasswd" { default = "" } // filepath # Path on disk to the certificate for the Docker registry in the admin workstation variable "registry_cert" { default = "" } // filepath # Path on disk to the registry's CA variable "registry_ca" { default = "" } // filepath # Path on disk to the registry's private key variable "registry_private_key" { default = "" } // filepath ########################## ########################## provider "vsphere" { version = "~> 1.5" user = "${var.vsphere_user}" password = "${var.vsphere_password}" vsphere_server = "${var.vsphere_server}" # if you have a self-signed cert allow_unverified_ssl = true } ### vSphere Data ### data "vsphere_datastore" "datastore" { name = "${var.datastore}" datacenter_id = "${data.vsphere_datacenter.dc.id}" } data "vsphere_datacenter" "dc" { name = "${var.datacenter}" } data "vsphere_compute_cluster" "cluster" { name = "${var.cluster}" datacenter_id = "${data.vsphere_datacenter.dc.id}" } data "vsphere_resource_pool" "pool" { name = "${var.resource_pool}" datacenter_id = "${data.vsphere_datacenter.dc.id}" } data "vsphere_network" "network" { name = "${var.network}" datacenter_id = "${data.vsphere_datacenter.dc.id}" } data "vsphere_virtual_machine" "template_from_ovf" { name = "${var.vm_template}" datacenter_id = "${data.vsphere_datacenter.dc.id}" } ########################## ### IF USING STATIC IP ### ########################## data "template_file" "static_ip_config" { template = <<EOF network: version: 2 ethernets: ens192: dhcp4: no dhcp6: no addresses: ["${var.ipv4_address}/${var.ipv4_netmask_prefix_length}"] gateway4: ${var.ipv4_gateway} nameservers: addresses: [${var.dns_nameservers}] EOF } data "template_file" "user_data" { template = <<EOF #cloud-config apt: primary: - arches: [default] uri: http://us-west1.gce.archive.ubuntu.com/ubuntu/ write_files: - path: /tmp/static-ip.yaml permissions: '0644' encoding: base64 content: | $${static_ip_config} runcmd: - /var/lib/gke/guest-startup.sh $${reg_enable} $${reg_username} $${reg_password} $${reg_dns_hostname} $${reg_htpasswd} $${reg_cert} $${reg_private_key} $${reg_ca} EOF vars = { static_ip_config = "${base64encode(data.template_file.static_ip_config.rendered)}" reg_enable = "${var.registry_enable}" reg_username = "${var.registry_username}" reg_password = "${var.registry_password}" reg_dns_hostname = "${var.registry_dns_hostname}" reg_htpasswd = "" reg_cert = "" reg_private_key = "" reg_ca = "" ######################## #### FOR UPGRADING ##### # reg_htpasswd = "${file(var.registry_htpasswd)}" # reg_cert = "${file(var.registry_cert)}" # reg_private_key = "${file(var.registry_private_key)}" # reg_ca = "${file(var.registry_ca)}" ######################## } } ########################## ### IF USING STATIC IP ### ########################## ### vSphere Resources ### resource "vsphere_virtual_machine" "vm" { name = "${var.vm_name}" resource_pool_id = "${data.vsphere_resource_pool.pool.id}" datastore_id = "${data.vsphere_datastore.datastore.id}" num_cpus = "${var.num_cpus}" memory = "${var.memory}" guest_id = "${data.vsphere_virtual_machine.template_from_ovf.guest_id}" enable_disk_uuid = "true" scsi_type = "${data.vsphere_virtual_machine.template_from_ovf.scsi_type}" network_interface { network_id = "${data.vsphere_network.network.id}" adapter_type = "${data.vsphere_virtual_machine.template_from_ovf.network_interface_types[0]}" } wait_for_guest_net_timeout = 15 nested_hv_enabled = false cpu_performance_counters_enabled = false disk { label = "disk0" size = "${max(50, data.vsphere_virtual_machine.template_from_ovf.disks.0.size)}" eagerly_scrub = "${data.vsphere_virtual_machine.template_from_ovf.disks.0.eagerly_scrub}" thin_provisioned = "${data.vsphere_virtual_machine.template_from_ovf.disks.0.thin_provisioned}" } cdrom { client_device = true } vapp { properties = { hostname = "${var.vm_name}" public-keys = "${file(var.ssh_public_key_path)}" user-data = "${base64encode(data.template_file.user_data.rendered)}" } } clone { template_uuid = "${data.vsphere_virtual_machine.template_from_ovf.id}" } } output "ip_address" { value = "${vsphere_virtual_machine.vm.default_ip_address}" }
static-ip.tfvars
vsphere_user = "administrator@vsphere.local" vsphere_password = "" # vSphere server IP or DNS name vsphere_server = "" ssh_public_key_path = "~/.ssh/vsphere_workstation.pub" vm_name = "admin-workstation" datastore = "" datacenter = "" cluster = "" resource_pool = "" network = "VM Network" num_cpus = 4 memory = 8192 vm_template = "gke-on-prem-admin-appliance-vsphere-1.0.2-gke.3" # XXX.XXX.XXX.XXX ipv4_address = "100.115.250.100" # Eg 22 ipv4_netmask_prefix_length = "22" # XXX.XXX.XXX.XXX ipv4_gateway = "100.115.251.254" # comma separated DNS servers dns_nameservers = "8.8.8.8,8.8.4.4" # docker registry credentials registry_enable = "true" registry_username = "gke" registry_password = "password" registry_dns_hostname = "" # only needed when re-creating the workstation and you want to # reuse registry certs. Each value is a filepath relative to this file. # registry_htpasswd="" # registry_cert="" # registry_ca="" # registry_private_key=""
Erstellen Sie ein SSH-Schlüssel/Wert-Paar, damit Sie sich bei der Administrator-Workstation-VM authentifizieren können:
ssh-keygen -t rsa -f ~/.ssh/vsphere_workstation -N ""
Erstellen Sie ein Verzeichnis für Ihre Terraform-Dateien:
mkdir [TERRAFORM_DIR]
Dabei ist [TERRAFORM_DIR] der Pfad eines Verzeichnisses, in dem Sie Ihre Terraform-Dateien speichern möchten.
Kopieren Sie die Terraform-Konfiguration, die Ihrer Hostnetzwerkkonfiguration entspricht, in
[TERRAFORM_DIR]/terraform.tf
und[TERRAFORM_DIR]/terraform.tfvars
.Geben Sie in
terraform.tfvars
-Werte für die folgenden Variablen ein, die Elemente Ihrer vSphere-Umgebung angeben:vsphere_server
vspher_user
vsphere_password
datastore
datacenter
cluster
resource_pool
network
vm_template
(Sie haben dies in einem vorherigen Schritt durch Ausführen vongovc markastemplate
erstellt.)
Geben Sie einen Wert für
vm_name
ein. Dies ist der Name der Administrator-Workstation, die Sie erstellen möchten. Sie können einen beliebigen Namen wählen.Wenn Sie statische IP-Adressen verwenden, geben Sie Werte für die folgenden Variablen ein:
ipv4_address
ipv4_netmask_prefix_length
ipv4_gateway
dns_nameservers
Wenn Sie die Docker-Registry verwenden möchten, die auf der Administrator-Workstation-VM ausgeführt wird, setzen Sie
registry_enable
auf "true". Geben Sie auch Werte für diese Variablen ein:registry_username
registry_password
Wenn Sie einen DNS-Hostnamen für die Docker-Registry haben möchten, die auf der Administrator-Workstation-VM ausgeführt wird, geben Sie einen Wert für
registry_dns_hostname
ein. Dies ist nützlich, wenn Ihre VM auf der Administrator-Workstation über keine statische IP-Adresse verfügt.Wenn Sie Ihre eigene private Docker-Registry verwenden möchten, setzen Sie
registry_enable
auf "false".Erstellen Sie die Administrator-Workstation-VM. Dies kann einige Minuten dauern:
cd [TERRAFORM_DIR] terraform init && terraform apply -auto-approve -input=false
Stellen Sie eine SSH-Verbindung zu Ihrer Administrator-Workstation her
Wechseln Sie in das Verzeichnis, das die Terraform-Konfiguration enthält.
Rufen Sie die IP-Adresse der Administrator-Workstation-VM ab:
terraform output ip_address
Stellen Sie mithilfe der generierten Schlüssel und der IP-Adresse eine SSH-Verbindung zur VM der Administrator-Workstation her:
ssh -i ~/.ssh/vsphere_workstation ubuntu@$(terraform output ip_address)
oder, wenn Sie nur die Adresse verwenden möchten:
ssh -i ~/.ssh/vsphere_workstation ubuntu@[IP_ADDRESS]
Prüfen, ob die Administrator-Workstation korrekt eingerichtet ist
Überprüfen Sie, ob gkectl
und docker
installiert sind:
gkectl version docker version
Wenn Sie registry_enable
auf "true" setzen, können Sie überprüfen, ob Docker-Images für die GKE On-Prem-Komponenten in den Docker-Daemon der VM Ihrer Administrator-Workstation geladen wurden:
docker images
Es kann 15 Minuten oder länger dauern, bis alle Docker-Images geladen sind.
Schließlich können Sie überprüfen, ob auf Ihrer Administrator-Workstation-VM eine Docker-Registry ausgeführt wird:
docker ps
Die Ausgabe zeigt den Container, in dem die Docker-Registry ausgeführt wird:
IMAGE ... COMMAND ... NAMES docker-registry:v2.7.1-gke.0 "registry serve /e..." registry2
Docker für das Abrufen Ihres Proxys konfigurieren
Wenn Ihr Netzwerk hinter einem Proxy ausgeführt wird und die VM Ihrer Verwaltungs-Workstation eine Docker-Registrierung ausführt, müssen Sie den Docker-Daemon, der auf Ihrer Verwaltungs-Workstation läuft, so konfigurieren, dass er Bilder über Ihren Proxy abruft:
Erfassen Sie die Adressen Ihrer HTTP- und HTTPS-Proxys.
Sammeln Sie die IP-Adressen und Hostnamen aller Hosts, die Sie ohne Proxys kontaktieren möchten, einschließlich:
- Die IP-Adresse des vCenter-Servers.
- Die IP-Adressen aller ESXi-Hosts.
- IP-Adressen, die Sie auf Ihrem Load-Balancer konfigurieren möchten.
- Die 192.168.0.0/16 Reichweite.
Fügen Sie in Ihrer Administrator-Workstation der Variablen
no_proxy
diese Adressen hinzu:printf -v no_proxy '%s,' [ADDRESSES];
Optional können Sie den Bereich zur späteren Verwendung in eine Umgebungsvariable exportieren. Beachten Sie, dass Anwendungen und Prozesse möglicherweise diese Variable verwenden:
export no_proxy="${no_proxy%,}";
Öffnen Sie je nach Konfiguration die Konfigurationsdatei von Docker, die unter
/root/.docker/config.json
,/home/
[USER]/.docker/config.json
oder an einem anderen Speicherort gespeichert ist.Fügen Sie innerhalb von
config.json
die folgenden Zeilen hinzu:"proxies": { "default": { "httpProxy": "[HTTP_PROXY]", "httpsProxy": "[HTTPS_PROXY]", "noProxy": "[ADDRESSES]" } }
Dabei gilt:
- [HTTP_PROXY] ist Ihr HTTP-Proxy, falls Sie einen haben.
- [HTTPS_PROXY] ist Ihr HTTPS-Proxy, falls Sie einen haben.
- [ADDRESSES] ist eine durch Kommas getrennte Liste von Adressen und Hostnamen, die Sie ohne Proxy-Verbindung kontaktieren müssen.
Starten Sie Docker neu, damit die Änderungen wirksam werden:
sudo systemctl restart docker
Problembehebung
Weitere Informationen finden Sie unter Fehlerbehebung.
Sitzungslimit für Terraform vSphere-Anbieter
GKE On-Prem verwendet den vSphere-Anbieter von Terraform, um VMs in Ihrer vSphere-Umgebung zu aktivieren. Das Sitzungslimit des Anbieters beträgt 1.000 Sitzungen. Die aktuelle Implementierung schließt aktive Sitzungen nach der Verwendung nicht. Wenn zu viele Sitzungen ausgeführt werden, können Fehler vom Typ 503 auftreten.
Sitzungen werden nach 300 Sekunden automatisch beendet.
- Symptome
Wenn zu viele Sitzungen ausgeführt werden, kann der folgende Fehler auftreten:
Error connecting to CIS REST endpoint: Login failed: body: {"type":"com.vmware.vapi.std.errors.service_unavailable","value": {"messages":[{"args":["1000","1000"],"default_message":"Sessions count is limited to 1000. Existing sessions are 1000.", "id":"com.vmware.vapi.endpoint.failedToLoginMaxSessionCountReached"}]}}, status: 503 Service Unavailable
- Mögliche Ursachen
In Ihrer Umgebung werden zu viele Terraform-Anbietersitzungen ausgeführt.
- Lösung
Derzeit funktioniert dies wie vorgesehen. Sitzungen werden nach 300 Sekunden automatisch beendet. Weitere Informationen finden Sie im Artikel zum GitHub-Problem 618.
Für Docker wird ein Proxy verwendet: oauth2: cannot fetch token
- Symptome
Bei der Verwendung eines Proxys tritt der folgende Fehler auf:
oauth2: cannot fetch token: Post https://oauth2.googleapis.com/token: proxyconnect tcp: tls: oversized record received with length 20527
- Mögliche Ursachen
Möglicherweise haben Sie statt eines HTTP-Proxys einen HTTPS-Proxy angegeben.
- Lösung
Ändern Sie in der Docker-Konfiguration die Proxyadresse in
http://
statthttps://
.
Gültigkeit der Lizenzen prüfen
Achten Sie darauf, dass Ihre Lizenzen gültig sind, insbesondere, wenn Sie Testlizenzen verwenden. Wenn Ihre F5-, ESXi-Host- oder vCenter-Lizenzen abgelaufen sind, können unerwartete Fehler auftreten.
openssl
kann die OVA-Datei für die Administrator-Workstation nicht validieren
- Symptome
Wenn Sie
openssl dgst
für die OVA-Datei für die Administrator-Workstation ausführen, wird nichtVerified OK
zurückgegeben.- Mögliche Ursache
Die OVA-Datei enthält ein Problem, das die erfolgreiche Validierung verhindert.
- Lösung
Versuchen Sie, die OVA-Datei der Administrator-Workstation noch einmal herunterzuladen und bereitzustellen, wie unter OVA-Datei der Administrator-Workstation herunterladen beschrieben. Wenn das Problem weiterhin besteht, wenden Sie sich an Google.
Weitere Informationen
Vor der Installation von GKE On-Prem finden Sie hier einige optionale Konfigurationsoptionen:
- Manuelles Load-Balancing aktivieren.
- Verwenden Sie Ihre eigene private Docker-Registry..
- Konfigurieren Sie statische IP-Adressen für Ihre Cluster.