Flatcar Linux no VMware Player — Deploy em 5 minutos no terminal
Em um certo momento eu precisei criar um novo lab de Kubernetes. De volta ao passado, eu criei um shell script para criar uma porrada de servidores CoreOS no meu VMWare Player, mas não voltei a esse script desde então.
Com a depreciação do CoreOS e o glorioso surgimento do Flatcar Linux para nos salvar, e enquanto eu precisava testar algumas coisas no Calico, me veio na cabeça “porque não escrever como fazer um deploy rápido de uma VM Flatcar Linux no VMware Player sem script?”. E aqui vamos nós!
Você precisará:
- OVA do Flatcar Linux
- CoreOS Configuration Transpiler (ou você pode escrever seu próprio arquivo Ignition, o que não é recomendado). Por sinal, você vai precisar compilar o Configuration Transpiler (foi mal!), mas eu ACHO que num futuro próximo eles devem prover os binários. De qualquer forma, é simples como a compilação de um programa em Go.
- VMware player / ovftool, ambos inclusos na instalação do VMware Player
Escrevendo o arquivo de configuração
Aqui temos os primeiros passos para gerar uma Configuração para o Container Linux contendo ao menos um usuário com uma chave SSH autorizada e o hostname da VM. Você pode configurar a VM com qualquer configuração suportada no link acima.
Vamos criar um arquivo chamado config.yaml
1passwd:
2 users:
3 - name: core
4 ssh_authorized_keys:
5 - ssh-rsa AAAAB3NzaC1y...... user@springfield
6storage:
7 files:
8 - path: /etc/hostname
9 filesystem: root
10 mode: 0644
11 contents:
12 inline: homer
13 user:
14 id: 0
15 group:
16 id: 0
O código acima será usado para, quando a VM do Flatcar estiver bootando pela primeira vez, fazer a criação/alteração do usuário core
permitindo a autenticação SSH com as chaves SSH publicas acima, e também escrever um arquivo /etc/hostname
contendo o hostname da máquina. Esse arquivo será usado pelo Flatcar CL para configurar seu hostname.
Por favor tenha em mente que isso é um YAML, logo você nunca deve copiar e colar para não ser punido ferozmente por algum espaço/tab sobrando ou faltando.
Você pode agora ’transplantar’ essa configuração e transformá-la em um JSON que será usado pelo Ignition quando a VM estiver iniciando pela primeira vez.
Executando o comando ct --in-file config.yaml --pretty
será exibida uma saída com uma versão ‘botininha’ do arquivo ignition:
1{
2 "ignition": {
3 "config": {},
4 "security": {
5 "tls": {}
6 },
7 "timeouts": {},
8 "version": "2.2.0"
9 },
10 "networkd": {},
11 "passwd": {
12 "users": [
13 {
14 "name": "core",
15 "sshAuthorizedKeys": [
16 "ssh-rsa AAAAB3NzaC1y...... user@springfield"
17 ]
18 }
19 ]
20 },
21 "storage": {
22 "files": [
23 {
24 "filesystem": "root",
25 "group": {
26 "id": 0
27 },
28 "user": {
29 "id": 0
30 },
31 "path": "/etc/hostname",
32 "contents": {
33 "source": "data:,homer",
34 "verification": {}
35 },
36 "mode": 420
37 }
38 ]
39 },
40 "systemd": {}
41}
Agora você pode pegar esse JSON e converter para base64, que será lido pelo Flatcar quando estiver iniciando. Essa configuração não precisa necessariamente ser convertida para base64, mas reduz a chance de existir algum caracter errado no meio da configuração quando você fizer o copiar/colar ela.
O comando completo é ct --in-file config.yaml --pretty |base64 -w0
mas por favor TENHA EM MENTE que no MacOS/Darwin o comando base64 pode não conter um -w0, dependendo da versão que você usa, então será necessário fazer sed/replace em todas as quebras de linha. A linha do Base64 ficará mais ou menos assim:
1ewogICJpZ25pdGlvbiI6IHsKICAgICJjb25maWciOiB7fSwKICAgICJzZWN1cml0eSI6IHsKICAgICAgInRscyI6IHt9CiAgICB9LAogICAgInRpbWVvdXRzIjoge30sCiAgICAidmVyc2lvbiI6ICIyLjIuMCIKICB9LAogICJuZXR3b3JrZCI6IHt9LAogICJwYXNzd2QiOiB7CiAgICAidXNlcnMiOiBbCiAgICAgIHsKICAgICAgICAibmFtZSI6ICJjb3JlIiwKICAgICAgICAic3NoQXV0aG9yaXplZEtleXMiOiBbCiAgICAgICAgICAic3NoLXJzYSBBQUFBQjNOemF[........]
Fazendo deploy no VMware Player
Bom, se você chegou até aqui com o conteúdo base64 criado corretamente, e contendo a configuração do Flatcar Container Linux, agora será apenas necessário criar a Máquina Virtual usando o utilitário ovftool
e sua VM estará pronta para uso:
1ovftool --allowExtraConfig --X:enableHiddenProperties \
2--X:injectOvfEnv --name=flatcar --memorySize:'*'=3072 \
3--extraConfig:guestinfo.coreos.config.data.encoding=base64 \
4--extraConfig:guestinfo.coreos.config.data=BASE64_GERADO_ACIMA \
5--net:"VM Network"="NAT" flatcar.ova novodiretorio
Alguns pontos importantes sobre esse comando:
- Como eu disse anteriormente, você não precisa usar um formato de configuração base64, mas para isso a flag
--extraConfig:guestinfo.coreos.config.data.encoding
deve ser removida. - Você precisa substituir o conteúdo da flag
guestinfo.coreos.config.data
para o base64 gerado no passo anterior. - Você pode usar qualquer rede que desejar no VMware Player, se você quiser usar a rede de Bridge ao invés do Nat basta substituir a flag –net para
--net:"VM Network"="Bridge"
- Se o diretório
novodiretorio
que está no fim do exemplo acima já existir ele irá colocar o vmx da máquina virtual dentro desse diretório. - As flags
guestinfo.coreos.config.data
andguestinfo.coreos.config.data.encoding
estão depreciadas em favor das flags com prefixoguestinfo.ignition.config.*
mas no momento que esse artigo foi escrito essas novas chaves eram suportadas apenas na release Alpha do Flatcar - O ovftool não consegue alterar o tamanho de memória, então mesmo que você tenha criado a sua VM com o parâmetro
--memorySize:
você precisará alterar manualmente a quantidade de memória diretamente no arquivo vmx criado.
Após isso, a VM pode ser iniciada com:
vmplayer newdir/flatcar/flatcar.vmx
E voilà, você tem uma VM Flatcar Linux funcionando.
Claro que você pode pegar o OVA e fazer o mesmo deploy com a configuração gerada acima diretamente na interface gráfica do VMPlayer, mas uma vez automatizado esse processo via linha de comando é muito mais rápido para criar um ambiente de laboratório :)