En esta página, se explica cómo crear la máquina virtual (VM) de la estación de trabajo de administrador por primera vez. En esta página, también se explica cómo configurar el daemon de Docker de la estación de trabajo para trabajar con un proxy.
Consulta también Actualiza una estación de trabajo de administrador existente.
Descripción general
Usa la versión 0.11 de HashiCorp Terraform para aprovisionar una máquina virtual (VM) de estación de trabajo de administrador y la estación de trabajo de administrador para instalar GKE On-Prem. Descarga el archivo Open Virtual Appliance (OVA) de la estación de trabajo de administrador y usa Terraform para implementar la VM en vSphere.
Antes de comenzar
- Descarga el OVA de la estación de trabajo de administrador.
- Lee la descripción general de la estación de trabajo de administrador.
Implementa el archivo OVA de la estación de trabajo de administrador
Para implementar el OVA, sigue estos pasos:
Guarda una de las siguientes configuraciones de Terraform, en función de si estás usando IP estáticas o DHCP. Asegúrate de guardar los archivos TF y TFVARS. El archivo TF es el archivo de configuración de HCL de Terraform y en el archivo TFVARS se declaran las variables que se usarán en la configuración:
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=""
Crea un par clave-valor SSH para que puedas autenticarte en la VM de la estación de trabajo de administrador:
ssh-keygen -t rsa -f ~/.ssh/vsphere_workstation -N ""
Crea un directorio para los archivos de Terraform:
mkdir [TERRAFORM_DIR]
En el ejemplo anterior, [TERRAFORM_DIR] es la ruta de acceso del directorio en el que quieres almacenar tus archivos de Terraform.
Copia la configuración de Terraform que coincida con tu configuración de red host en
[TERRAFORM_DIR]/terraform.tf
y[TERRAFORM_DIR]/terraform.tfvars
.En
terraform.tfvars
, ingresa valores para las siguientes variables, que especifican elementos de tu entorno de vSphere:vsphere_server
vspher_user
vsphere_password
datastore
datacenter
cluster
resource_pool
network
vm_template
(creaste esto en un paso anterior mediante la ejecución degovc markastemplate
).
Ingresa un valor para
vm_name
. Este es el nombre de la estación de trabajo de administrador que estás a punto de crear. Puede ser el que elijas.Si usas direcciones IP estáticas, ingresa los valores de las siguientes variables:
ipv4_address
ipv4_netmask_prefix_length
ipv4_gateway
dns_nameservers
Si deseas usar el registro de Docker que se ejecuta en la VM de la estación de trabajo de administrador, configura
registry_enable
como “true”. Además, ingresa valores para estas variables:registry_username
registry_password
Si quieres tener un nombre de host DNS para el registro de Docker que se ejecuta en la VM de la estación de trabajo de administrador, ingresa un valor para
registry_dns_hostname
. Esto es útil si tu VM de estación de trabajo de administrador no tiene una dirección IP estática.Si deseas usar tu propio registro privado de Docker, configura
registry_enable
como “false”.Crea la VM de la estación de trabajo de administrador. Esto puede tardar algunos minutos:
cd [TERRAFORM_DIR] terraform init && terraform apply -auto-approve -input=false
Establece una conexión SSH en tu estación de trabajo de administrador
Cambia al directorio que contiene la configuración de Terraform.
Recupera la dirección IP de la estación de trabajo del administrador:
terraform output ip_address
Establece una conexión SSH a la estación de trabajo de administrador con la clave y la dirección IP generadas:
ssh -i ~/.ssh/vsphere_workstation ubuntu@$(terraform output ip_address)
o, si solo quieres usar su dirección, ejecuta lo siguiente:
ssh -i ~/.ssh/vsphere_workstation ubuntu@[IP_ADDRESS]
Verifica que la estación de trabajo del administrador esté configurada de manera correcta
Verifica que gkectl
y docker
estén instalados:
gkectl version docker version
Si configuras registry_enable
en "true", puedes verificar que las imágenes de Docker para los componentes de GKE On-Prem se hayan cargado en el daemon de Docker de la VM de la estación de trabajo de administrador:
docker images
La carga de todas las imágenes de Docker puede tardar quince minutos o más.
Finalmente, puede verificar que la VM de su estación de trabajo de administrador esté ejecutando un registro de Docker:
docker ps
El resultado muestra el contenedor que ejecuta el registro de Docker:
IMAGE ... COMMAND ... NAMES docker-registry:v2.7.1-gke.0 "registry serve /e..." registry2
Configura Docker para que extraiga a través de tu proxy
Si tu red se ejecuta detrás de un proxy y la VM de tu estación de trabajo de administrador ejecuta un registro de Docker, debes configurar el daemon de Docker que se ejecuta en tu estación de trabajo de administrador para extraer imágenes a través del proxy:
Recopila las direcciones de tus proxies HTTP y HTTPS.
Recopila las direcciones IP y los nombres de host de cada host con el que necesites comunicarte sin necesidad de un proxy, incluidos los siguientes:
- La dirección IP del servidor de vCenter
- Las direcciones IP de todos los hosts de ESXi
- Direcciones IP que deseas configurar en tu balanceador de cargas
- El rango 192.168.0.0/16
En tu estación de trabajo de administrador, agrega estas direcciones a la variable
no_proxy
:printf -v no_proxy '%s,' [ADDRESSES];
De manera opcional, puedes exportar el rango a una variable de entorno para referencia posterior. Ten en cuenta que las aplicaciones y los procesos pueden usar esta variable:
export no_proxy="${no_proxy%,}";
Abre el archivo de configuración de Docker, almacenado en
/root/.docker/config.json
,/home/
[USER]/.docker/config.json
o en otro lugar, según tu configuración.En
config.json
, agrega las siguientes líneas:"proxies": { "default": { "httpProxy": "[HTTP_PROXY]", "httpsProxy": "[HTTPS_PROXY]", "noProxy": "[ADDRESSES]" } }
En el ejemplo anterior, se ilustra lo siguiente:
- [HTTP_PROXY] es el proxy HTTP, si tienes uno.
- [HTTPS_PROXY] es tu proxy HTTPS, si tienes uno.
- [ADDRESSES] es una lista delimitada por comas de nombres de host y direcciones que necesitas para comunicarte sin proxy.
Reinicia Docker para que se apliquen los cambios:
sudo systemctl restart docker
Solución de problemas
Para obtener más información, consulta Soluciona problemas.
Límite de sesiones del proveedor de vSphere de Terraform
GKE On-Prem usa el proveedor de vSphere de Terraform para abrir las VM en tu entorno de vSphere. El límite de sesiones del proveedor es de 1,000 sesiones. La implementación actual no cierra las sesiones activas después de su uso. Es posible que experimentes errores 503 si tienes demasiadas sesiones en ejecución.
Las sesiones se cierran de forma automática después de 300 segundos.
- Síntomas
Si tienes demasiadas sesiones en ejecución, es posible que encuentres el siguiente error:
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
- Causas posibles
Hay demasiadas sesiones de proveedor de Terraform en ejecución en el entorno.
- Solución
Por el momento, esto funciona según lo previsto. Las sesiones se cierran de forma automática después de 300 segundos. Para obtener más información, consulta el problema n.º 618 de GitHub.
Usa un proxy para Docker: oauth2: cannot fetch token
- Síntomas
Mientras uses un proxy, verás el siguiente error:
oauth2: cannot fetch token: Post https://oauth2.googleapis.com/token: proxyconnect tcp: tls: oversized record received with length 20527
- Causas posibles
Es posible que hayas proporcionado un proxy HTTPS en lugar de HTTP.
- Solución
En tu configuración de Docker, cambia la dirección del proxy por
http://
en lugar dehttps://
.
Verifica que las licencias sean válidas
Recuerda verificar que tus licencias sean válidas, en especial si usas licencias de prueba. Es posible que encuentres fallas inesperadas si tus licencias de F5, host de ESXi o vCenter vencieron.
openssl
no puede validar el OVA de la estación de trabajo de administrador
- Síntomas
Si ejecutas
openssl dgst
en el archivo OVA de la estación de trabajo de administrador, no se muestra el mensajeVerified OK
.- Causas posibles
Hay un problema en el archivo OVA que impide que la validación se realice con éxito.
- Solución
Vuelve a descargar y a implementar el OVA de la estación de trabajo de administrador, como se indica en Descarga el OVA de la estación de trabajo de administrador. Si el problema persiste, comunícate con Google para obtener asistencia.
¿Qué sigue?
Antes de instalar GKE On-Prem, ten en cuenta estos parámetros opcionales de configuración:
- Habilita el balanceo de cargas manual.
- Usa tu propio registro privado de Docker.
- Configura IP estáticas para tus clústeres.