Quando usa a versão 1.13.0 e posteriores do Google Distributed Cloud, pode especificar rotinas de arranque para personalizar a inicialização da sua VM no arranque. Pode configurar a VM para criar chaves SSH, adicionar utilizadores e palavras-passe, instalar pacotes, escrever ficheiros, configurar definições de rede e muito mais.
Estas tarefas de arranque são configuradas com a API cloud-init ou com a API de scripts de arranque (não ambas). Estas diretivas de arranque são especificadas no ficheiro de manifesto YAML VirtualMachine
e executadas automaticamente sempre que a VM é iniciada.
Pré-requisitos
Para configurar uma VM com diretivas de arranque, tem de cumprir os seguintes pré-requisitos:
Use um SO convidado Linux validado e defina
osType
comoLinux
no manifesto da VM. Os SOs convidados do Windows não são suportados para esta capacidade, uma vez que não suportam o cloud-init.Certifique-se de que o SO convidado tem o cloud-init instalado. Os SOs Linux mais recentes incluem o cloud-init.
As secções seguintes descrevem como especificar rotinas de arranque no manifesto da VM com a API cloud-init ou os scripts de arranque.
Use a API cloud-init para inicializar VMs
O cloud-init é usado frequentemente para a inicialização de instâncias na nuvem e para personalizar VMs durante o arranque. Normalmente, a inicialização da VM envolve tarefas como instalações de pacotes, configuração do repositório, criação de chaves SSH, gravação de dados em ficheiros e configuração de outros aspetos da VM. Incorpora o YAML de configuração do cloud-init no
VirtualMachine
recurso personalizado com o campo spec.cloudInit
. Quando a instância de VM é iniciada, o cloud-init lê os dados fornecidos e inicializa a VM em conformidade.
Tenha em atenção os seguintes detalhes da nossa implementação do cloud-init:
Especifica os dados cloud-init no manifesto YAML quando cria ou atualiza uma VM.
VirtualMachine
Para obter instruções sobre como criar uma VM aplicando um manifesto, consulte o Tutorial: crie e faça a gestão de uma VM Linux no tempo de execução de VMs no GDC.Usamos a
NoCloud
origem de dados,spec.cloudInit.noCloud
, na nossa especificação de VM.Especifica os dados do utilizador e os dados de rede em secções separadas no manifesto
VirtualMachine
. A nomenclatura e a estrutura da secção dependem do formato de dados que decidir usar.Pode especificar informações de configuração do cloud-init nos seguintes formatos de dados:
- Limpar texto
- String codificada em Base64
- Segredo do Kubernetes
Para ajudar a começar, fornecemos alguns exemplos de configuração para tarefas comuns de inicialização de VMs.
Dados do utilizador do cloud-init
O tempo de execução de VMs no GDC suporta dados de utilizadores cloud-init na sintaxe cloud-config, pelo que deve começar os dados de utilizadores com #cloud-config
. Pode formatar os dados do utilizador como texto simples, uma string codificada em base64 ou um segredo do Kubernetes.
Para mais informações acerca da sintaxe dos dados do utilizador e da referência do módulo, consulte a documentação do cloud-init.
Dados do utilizador do cloud-init como texto não processado
O manifesto de exemplo seguinte mostra como especificar os dados do utilizador como texto não cifrado. Neste caso, o cloud-init executa um comando quando a VM é iniciada:
apiVersion: vm.cluster.gke.io/v1
kind: VirtualMachine
metadata:
name: "my-vm"
spec:
...
cloudInit:
noCloud:
userData: |
#cloud-config
runcmd:
- echo hello
Dados do utilizador do cloud-init como uma string codificada em Base64
O exemplo seguinte mostra como especificar dados do utilizador no formato codificado em base64.
Neste exemplo, os dados do utilizador consistem no mesmo comando echo hello
que no exemplo de texto não cifrado:
apiVersion: vm.cluster.gke.io/v1
kind: VirtualMachine
metadata:
name: "my-vm"
spec:
...
cloudInit:
noCloud:
userDataBase64: I2Nsb3VkLWNvbmZpZwpydW5jbWQ6CiAgLSBlY2hvIGhlbGxvCg==
Dados do utilizador do cloud-init como um secret do Kubernetes
O exemplo seguinte mostra um manifesto YAML para um VirtualMachine
e um
Secret
. A secção spec.cloudInit.noCloud.secretRef
na configuração indica que os dados do utilizador do cloud-init estão num segredo do Kubernetes denominado my-sec
.VirtualMachine
A configuração Secret
correspondente especifica os dados do utilizador
como um par de chave-valor. Neste caso, o valor codificado em base64 são os dados do utilizador do cloud-init na sintaxe cloud-config.
No segredo referenciado, use a chave de dados userData
(mostrada) ou userdata
para
especificar os dados do utilizador do cloud-init.
Neste exemplo, os dados do utilizador consistem no mesmo comando echo hello
que no exemplo de texto não cifrado:
apiVersion: vm.cluster.gke.io/v1
kind: VirtualMachine
metadata:
name: "my-vm"
spec:
...
cloudInit:
noCloud:
secretRef:
name: my-sec
---
apiVersion: v1
kind: Secret
type: Opaque
metadata:
name: my-sec
data:
userData: I2Nsb3VkLWNvbmZpZwpydW5jbWQ6CiAgLSBlY2hvIGhlbGxvCg==
Se o segredo referenciado não for encontrado ou a chave de dados userData
ou userdata
não existir no segredo, tenha em atenção o seguinte comportamento de arranque da VM:
Para a criação de VMs, a VM é colocada num estado
ErrorConfiguration
com um motivo e uma mensagem detalhados.Noutros casos, a VM continua a usar os dados do utilizador do cloud-init antigos até a VM ser configurada corretamente. Como resultado, as atualizações de ativação ou desativação do agente convidado não entram em vigor até que a VM esteja configurada corretamente.
Para obter informações da VM, incluindo os dados do utilizador do cloud-init que foram usados, use o seguinte comando:
kubectl get vm VM_NAME -o yaml --kubeconfig KUBECONFIG_PATH
Substitua o seguinte:
VM_NAME
: o nome da sua VM.KUBECONFIG_PATH
: o caminho para o ficheiro kubeconfig do cluster que contém a sua VM.
Para obter o evento de aviso do Kubernetes relacionado, use kubectl get event
ou kubectl describe gvm
.
Dados de rede do cloud-init
Tal como os dados do utilizador, pode formatar os dados da rede como texto não cifrado, uma string codificada em base64 ou um segredo do Kubernetes. Ao contrário dos dados do utilizador, os dados de rede não usam a sintaxe cloud-config.
Quando usar texto simples ou uma string codificada em base64, o tamanho máximo permitido é de 2048 bytes. Se o tamanho dos dados do utilizador for próximo ou superior a 2048 bytes, especifique-o como um segredo do Kubernetes.
Para mais informações sobre a sintaxe dos dados de rede e detalhes relacionados, consulte a versão 2 da configuração de rede na documentação do cloud-init.
Dados de rede do cloud-init como texto simples
O exemplo de manifesto seguinte mostra como especificar dados de rede como texto não cifrado.
Neste caso, o cloud-init ativa o DHCP para todos os dispositivos Ethernet com nomes que começam com um "e" (e*
):
apiVersion: vm.cluster.gke.io/v1
kind: VirtualMachine
metadata:
name: "my-vm"
spec:
...
cloudInit:
noCloud:
userData: |
#cloud-config
runcmd:
- echo hello
networkData: |
version: 2
ethernets:
alleths:
match:
name: e*
dhcp4: true
Dados de rede do cloud-init como uma string codificada em base64
O exemplo seguinte mostra como especificar dados de rede no formato codificado em base64. Neste exemplo, os dados de rede consistem na mesma configuração de DHCP especificada no exemplo de texto não cifrado:
apiVersion: vm.cluster.gke.io/v1
kind: VirtualMachine
metadata:
name: "my-vm"
spec:
...
cloudInit:
noCloud:
networkDataBase64: dmVyc2lvbjogMgpldGhlcm5ldHM6CiAgYWxsZXRoczoKICAgIG1hdGNoOgogICAgICBuYW1lOiBlKgogICAgZGhjcDQ6IHRydWUK
Dados de rede do cloud-init como um secret do Kubernetes
O exemplo seguinte mostra um manifesto YAML para um VirtualMachine
e um
Secret
. A secção spec.cloudInit.noCloud.networkDataSecretRef
na configuração VirtualMachine
indica que os dados de rede do cloud-init estão num segredo do Kubernetes
denominado my-sec
. A configuração Secret
correspondente especifica os dados da rede como um par de chave-valor. Neste caso, o valor codificado em Base64 são os dados de rede do cloud-init.
No segredo referenciado, use a chave de dados networkData
(apresentada) ou
networkdata
para especificar os dados de rede do cloud-init.
Neste exemplo, os dados de rede consistem na mesma configuração de DHCP especificada no exemplo de texto não cifrado:
apiVersion: vm.cluster.gke.io/v1
kind: VirtualMachine
metadata:
name: "my-vm"
spec:
...
cloudInit:
noCloud:
networkDataSecretRef:
name: my-sec
---
apiVersion: v1
kind: Secret
type: Opaque
metadata:
name: my-sec
data:
networkData: dmVyc2lvbjogMgpldGhlcm5ldHM6CiAgYWxsZXRoczoKICAgIG1hdGNoOgogICAgICBuYW1lOiBlKgogICAgZGhjcDQ6IHRydWUK
Exemplos de cloud-init
As secções seguintes contêm exemplos de texto simples de alguns exemplos de utilização comuns para a inicialização de VMs com o cloud-init:
- Configure chaves SSH autorizadas
- Adicione um novo utilizador
- Execute comandos no primeiro arranque
- Escrever ficheiros
Configure chaves SSH autorizadas
O seguinte exemplo de dados do utilizador atribui a chave SSH autorizada
ssh-rsa AAAAB3NzaK8L93bWxnyp
ao utilizador predefinido.
apiVersion: vm.cluster.gke.io/v1
kind: VirtualMachine
metadata:
name: "my-vm"
spec:
...
cloudInit:
noCloud:
userData: |
#cloud-config
ssh_authorized_keys:
- ssh-rsa AAAAB3NzaK8L93bWxnyp
Adicionar um novo utilizador
O exemplo de dados do utilizador seguinte cria um utilizador test
e concede test
acesso total de superutilizador. Este exemplo atribui ao utilizador uma palavra-passe que não expira de pwd
.
apiVersion: vm.cluster.gke.io/v1
kind: VirtualMachine
metadata:
name: "my-vm"
spec:
...
cloudInit:
noCloud:
userData: |
#cloud-config
users:
- default
- name: test
sudo: ALL=(ALL) NOPASSWD:ALL
chpasswd:
list: |
test:pwd
expire: False
Execute comandos no primeiro arranque
O exemplo de dados do utilizador seguinte executa um comando echo
e um comando ls
. Pode usar comandos para instalar pacotes e muito mais quando a VM é iniciada.
apiVersion: vm.cluster.gke.io/v1
kind: VirtualMachine
metadata:
name: "my-vm"
spec:
...
cloudInit:
noCloud:
userData: |
#cloud-config
runcmd:
- [ echo, hello ]
- [ ls, -l, / ]
Escrever ficheiros
O exemplo de dados do utilizador seguinte escreve um script bash no ficheiro test
no diretório /var/lib/google
da sua VM. As diretivas cloud-init definem as autorizações de ficheiros como leitura, escrita e execução (0744
) para o proprietário do ficheiro.
apiVersion: vm.cluster.gke.io/v1
kind: VirtualMachine
metadata:
name: "my-vm"
spec:
...
cloudInit:
noCloud:
userData: |
#cloud-config
write_files:
- path: /var/lib/google/test
permissions: 0744
content: |
#!/bin/bash
echo hello
Resolução de problemas do cloud-init
Se tiver problemas com a inicialização da VM e estiver a usar o cloud-init, verifique os seguintes registos do cloud-init na VM:
/var/log/cloud-init.log
: por predefinição, o cloud-init escreve todos os eventos com um nível deDEBUG
ou superior neste registo./var/log/cloud-init-output.log
: por predefinição, o cloud-init direciona o stdout e o stderr de todas as fases do cloud-init para este registo.
Use scripts de arranque para inicializar VMs
Os scripts de arranque executam tarefas durante o processo de arranque de uma instância de máquina virtual (VM). Pode especificar um ou mais scripts na secção spec.startupScripts
da especificação VirtualMachine
. Os scripts de arranque podem ser usados para inicializar a VM. Normalmente, a inicialização da VM envolve tarefas como instalações de pacotes, configuração do repositório, criação de chaves SSH, gravação de dados em ficheiros e configuração de outros aspetos da VM.
Tenha em atenção os seguintes detalhes para scripts de arranque:
Especifica scripts de arranque no manifesto YAML
VirtualMachine
quando cria ou atualiza uma VM. Para obter instruções sobre como criar uma VM aplicando um manifesto, consulte o Tutorial: crie e faça a gestão de uma VM Linux no tempo de execução de VMs no GDC.Os scripts especificados são executados sempre que a VM é iniciada.
Inclua
#!/bin/...
na parte superior do script para indicar o intérprete do script. Por exemplo, inclua#!/bin/bash
para executar o script com o shell Bash.Não pode especificar diretivas da API cloud-init (
spec.cloudInit
) e scripts de arranque (spec.startupScripts
) no mesmo manifestoVirtualMachine
.
Formatos de scripts
Pode especificar scripts de arranque nos seguintes formatos de dados:
- Limpar texto
- String codificada em Base64
- Segredo do Kubernetes
Tenha em atenção as seguintes regras para trabalhar com diferentes formatos de scripts:
Quando usar texto simples ou uma string codificada em base64, o tamanho máximo permitido para conteúdos de script é de 2048 bytes. Se o tamanho do conteúdo do script for próximo ou superior a 2048 bytes, especifique os scripts como um segredo do Kubernetes.
Quando usar um segredo do Kubernetes, use a chave de dados
script
no segredo referenciado para especificar o conteúdo do script.Se não for encontrado um segredo referenciado ou a chave de dados
script
não existir no segredo referenciado, a VM continua a executar o script. No entanto, a MV não escreve nem atualiza o conteúdo do script. Neste caso, pode encontrar o evento de aviso do Kubernetes comkubectl get event
oukubectl describe gvm
.
O seguinte manifesto YAML de exemplo contém três scripts, um
em cada um dos formatos suportados.VirtualMachine
Neste caso, cada script executa o comando echo
hello
apresentado em myscript1
, o exemplo de texto simples.
apiVersion: vm.cluster.gke.io/v1
kind: VirtualMachine
metadata:
name: "my-vm"
spec:
...
startupScripts:
- name: myscript1
script: |
#!/bin/bash
echo hello
- name: myscript2
scriptBase64: IyEvYmluL2Jhc2gKICAgICAgZWNobyBoZWxsbwo=
- name: myscript3
scriptSecretRef:
name: my-sec
---
apiVersion: v1
kind: Secret
type: Opaque
metadata:
name: my-sec
data:
script: IyEvYmluL2Jhc2gKICAgICAgZWNobyBoZWxsbwo=
Resolução de problemas de scripts
Para verificar os resultados ou os registos do script, execute o seguinte comando:
journalctl -u cloud-final
As entradas do registo do script de arranque começam com o seguinte texto:
started to run the command /var/lib/google/startup-scripts/SCRIPT_NAME ...
A entrada do registo inclui SCRIPT_NAME
, o nome do script de arranque.