Cette page explique comment créer la machine virtuelle (VM) du poste de travail administrateur pour la première fois. Cette page explique également comment configurer le daemon Docker du poste de travail pour qu'il fonctionne avec un proxy.
Consultez également l'article Mettre à niveau un poste de travail administrateur existant.
Présentation
Vous utilisez la version 0.11 de HashiCorp Terraform pour provisionner une machine virtuelle (VM) de poste de travail administrateur dans vSphere, et vous installez GKE On-Prem via ce poste. Vous téléchargez le fichier Open Virtual Appliance (OVA) du poste de travail administrateur et vous utilisez Terraform pour déployer la VM sur vSphere.
Avant de commencer
- Télécharger le fichier OVA du poste de travail administrateur
- Consultez la présentation du poste de travail administrateur.
Déployer l'OVA du poste de travail administrateur
Pour déployer l'OVA, procédez comme suit :
Enregistrez l'une des configurations Terraform ci-dessous, selon que vous utilisez un DHCP ou des adresses IP statiques. Veillez à enregistrer à la fois les fichiers TF et TFVARS. Le fichier TF est la configuration HCL de Terraform, et le fichier TFVARS déclare les variables à utiliser dans la configuration :
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=""
Créez une paire clé/valeur SSH afin de pouvoir vous authentifier sur la VM du poste de travail administrateur :
ssh-keygen -t rsa -f ~/.ssh/vsphere_workstation -N ""
Créez un répertoire pour vos fichiers terraform :
mkdir [TERRAFORM_DIR]
où [TERRAFORM_DIR] est le chemin d'accès au répertoire dans lequel vous souhaitez conserver vos fichiers Terraform.
Copiez la configuration Terraform correspondant à la configuration de votre réseau hôte dans
[TERRAFORM_DIR]/terraform.tf
et[TERRAFORM_DIR]/terraform.tfvars
.Dans
terraform.tfvars
, saisissez les valeurs des variables suivantes, qui spécifient les éléments de votre environnement vSphere :vsphere_server
vspher_user
vsphere_password
datastore
datacenter
cluster
resource_pool
network
vm_template
(Vous avez créé cet élément lors d'une étape précédente en exécutantgovc markastemplate
.)
Saisissez une valeur pour
vm_name
. Il s'agit du nom du poste de travail administrateur que vous êtes sur le point de créer. Vous pouvez choisir le nom de votre choix.Si vous utilisez des adresses IP statiques, saisissez des valeurs pour les variables suivantes :
ipv4_address
ipv4_netmask_prefix_length
ipv4_gateway
dns_nameservers
Si vous souhaitez utiliser le registre Docker exécuté sur la VM du poste de travail administrateur, définissez
registry_enable
sur "true". Saisissez également des valeurs pour ces variables :registry_username
registry_password
Si vous souhaitez disposer d'un nom d'hôte DNS pour le registre Docker qui s'exécute sur la VM du poste de travail administrateur, saisissez la valeur
registry_dns_hostname
. Cela est utile si votre VM de poste de travail administrateur ne dispose pas d'adresse IP statique.Si vous souhaitez utiliser votre propre registre Docker privé, définissez
registry_enable
sur "false".Créez la VM du poste de travail administrateur. Cela peut prendre quelques minutes.
cd [TERRAFORM_DIR] terraform init && terraform apply -auto-approve -input=false
Se connecter en SSH au poste de travail administrateur
Accédez au répertoire contenant la configuration Terraform.
Récupérez l'adresse IP de la VM du poste de travail administrateur :
terraform output ip_address
Connectez-vous en SSH à la VM du poste de travail administrateur à l'aide dela clé et de l'adresse IP générées :
ssh -i ~/.ssh/vsphere_workstation ubuntu@$(terraform output ip_address)
Ou, si vous souhaitez simplement utiliser son adresse :
ssh -i ~/.ssh/vsphere_workstation ubuntu@[IP_ADDRESS]
Vérifier la bonne configuration du poste de travail administrateur
Vérifiez que gkectl
et docker
sont installés :
gkectl version docker version
"Si vous définissez registry_enable
sur" "true" ", vous pouvez vérifier que les images Docker des composants GKE On-Prem ont été chargées dans le démon Docker de votre VM de poste de travail administrateur :
docker images
Le chargement de toutes les images Docker peut prendre 15 minutes ou plus.
À terme, vous pouvez vérifier que la VM de votre poste de travail administrateur exécute un registre Docker :
docker ps
Le résultat affiche le conteneur qui exécute le registre Docker :
IMAGE ... COMMAND ... NAMES docker-registry:v2.7.1-gke.0 "registry serve /e..." registry2
Configurer Docker pour extraire le proxy
Si votre réseau s'exécute derrière un proxy et que votre VM de poste de travail administrateur exécute un registre Docker, vous devez configurer le daemon Docker exécuté sur votre poste de travail administrateur pour extraire des images via votre proxy :
Rassemblez les adresses de vos proxys HTTP et HTTPS.
Rassemblez les adresses IP et les noms d'hôte de chaque hôte que vous devez contacter sans proxy, y compris :
- Adresse IP du serveur vCenter.
- Adresses IP de tous les hôtes ESXi.
- Adresses IP que vous souhaitez configurer sur votre équilibreur de charge.
- La plage 192.168.0.0/16.
Dans votre poste de travail administrateur, ajoutez les adresses suivantes à la variable
no_proxy
:printf -v no_proxy '%s,' [ADDRESSES];
Vous pouvez éventuellement exporter la plage vers une variable d'environnement pour référence ultérieure. Gardez à l'esprit que les applications et les processus peuvent utiliser cette variable :
export no_proxy="${no_proxy%,}";
Ouvrez le fichier de configuration de Docker, stocké dans
/root/.docker/config.json
,/home/
[USER]/.docker/config.json
ou ailleurs, en fonction de votre configuration.Dans le fichier
config.json
, ajoutez les lignes suivantes :"proxies": { "default": { "httpProxy": "[HTTP_PROXY]", "httpsProxy": "[HTTPS_PROXY]", "noProxy": "[ADDRESSES]" } }
où :
- [HTTP_PROXY] est votre proxy HTTP, si vous en avez un.
- [HTTPS_PROXY] est votre proxy HTTPS, si vous en avez un.
- [ADDRESSES] est une liste d'adresses et de noms d'hôtes séparés par des virgules que vous devez contacter sans proxy.
Redémarrez Docker pour que les modifications prennent effet :
sudo systemctl restart docker
Dépannage
Pour en savoir plus, consultez Dépannage.
Limite de session du fournisseur vSphere Terraform
GKE On-Prem utilise le fournisseur vSphere de Terraform pour afficher les VM dans votre environnement vSphere. La limite de session du fournisseur est de 1 000 sessions. La mise en œuvre actuelle ne ferme pas les sessions actives après utilisation. Vous pouvez rencontrer des erreurs 503 si trop de sessions sont en cours d'exécution.
Les sessions sont automatiquement fermées après 300 secondes.
- Symptômes
Si trop de sessions sont en cours d'exécution, vous pouvez rencontrer l'erreur suivante :
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
- Causes probables
Trop de sessions de fournisseur Terraform s'exécutent dans votre environnement.
- Solution
Actuellement, cela fonctionne comme prévu. Les sessions sont automatiquement fermées après 300 secondes. Pour en savoir plus, reportez-vous au problème GitHub #618.
Utiliser un proxy pour Docker : oauth2: cannot fetch token
- Symptômes
Lorsque vous utilisez un proxy, vous rencontrez l'erreur suivante :
oauth2: cannot fetch token: Post https://oauth2.googleapis.com/token: proxyconnect tcp: tls: oversized record received with length 20527
- Causes probables
Vous avez peut-être fourni un proxy HTTPS au lieu d'un proxy HTTP.
- Solution
Dans votre configuration Docker, définissez l'adresse du proxy sur
http://
au lieu dehttps://
.
Vérifier la validité des licences
N'oubliez pas de vérifier que vos licences sont valides, en particulier si vous utilisez des licences d'essai. Des échecs inattendus peuvent se produire si vos licences F5, vos licences vCenter ou vos licences d'hôte ESXi sont arrivées à expiration.
openssl
ne peut pas valider le fichier OVA du poste de travail administrateur.
- Symptômes
L'exécution de
openssl dgst
sur le fichier OVA du poste de travail administrateur ne renvoie pasVerified OK
.- Causes probables
Le fichier OVA comporte un problème qui empêche la validation.
- Solution
Essayez à nouveau de télécharger et de déployer le fichier OVA du poste de travail administrateur, comme indiqué dans la section Télécharger le fichier OVA du poste de travail administrateur. Si le problème persiste, contactez Google pour obtenir de l'aide.
Étapes suivantes
Avant d'installer GKE On-Prem, voici quelques options de configuration facultatives :
- Activer l'équilibrage de charge manuel.
- Utilisez votre propre registre Docker privé.
- Configurez des adresses IP statiques pour vos clusters.