Projetos
Um projeto é uma coleção de recursos que definem configurações de nó. Os projetos contêm especificações. Quando um nó começa, é configurado processando e executando uma sequência de especificações.
O Azure CycleCloud utiliza projetos para gerir aplicações agrupadas, como agendadores de lotes. No CycleCloud HPCPack, o projeto é uma hn
especificação e cn
especificação que definem as configurações e receitas para headnode e computenode HPCPack.
Abaixo está uma definição parcial do nó. O nó de registo de estivar terá três especificações: ligar as especificações da versão 1.3.0 do projeto okta, bem como as especificações de núcleo e registo da versão 2.0.0 do projeto docker:
[[node docker-registry]]
Locker = base-storage
[[[cluster-init okta:bind:1.3.0]]]
[[[cluster-init docker:core:2.0.0]]]
[[[cluster-init docker:registry:2.0.0]]]
A etiqueta de fuga é o número da versão do projeto.
[[[cluster-init <project>:<spec>:<project version>]]]
Um armário é uma referência a um recipiente de conta de armazenamento e credencial. Os nós têm um armário predefinido, por isso este atributo não é estritamente necessário.
O Azure CycleCloud utiliza uma abreviatura para contas de armazenamento, pelo https://mystorage.blob.core.windows.net/mycontainer
que pode ser escrita como az://mystorage/mycontainer.
O nó irá descarregar cada projeto que faz referência a partir do cacifo utilizando a ferramenta pogo:
pogo get az://mystorage/mycontainer/projects/okta/1.3.0/bind
Se um projeto for definido num nó mas não existir no local de armazenamento esperado, então o nó reportará um Software Installation Failure
ao CycleCloud.
O CycleCloud tem projetos internos que funcionam por padrão em todos os nós para executar o volume especial e o manuseamento de rede e comunicação de configuração para o CycleCloud. Estes projetos internos são espelhados automaticamente no armário.
O utilizador é responsável por espelhar quaisquer projetos adicionais para o cacifo. O CycleCloud CLI tem métodos para compor projetos:
cyclecloud project init myproject
e espelho:
cyclecloud project init mylocker
projetos para armários.
As especificações são compostas por scripts de pitão, concha ou powershell.
Criar um novo projeto
Para criar um novo projeto, utilize o comando cyclecloud project init myproject
CLI, onde myproject
está o nome do projeto que pretende criar. Isto criará um projeto chamado "myproject", com uma única especificação chamada "padrão" que pode alterar. A árvore do diretório será criada com ficheiros de esqueletos que irá alterar para incluir a sua própria informação.
Estrutura do Diretório
Os seguintes diretórios serão criados pelo comando do projeto:
\myproject
├── project.ini
├── blobs
├── templates
├── specs
│ ├── default
│ └── cluster-init
│ ├── scripts
│ ├── files
│ └── tests
│ └── chef
│ ├── site-cookbooks
│ ├── data_bag
│ └── roles
O diretório de modelos irá manter os seus modelos de cluster, enquanto as especificações conterão as especificações que definem o seu projeto. especificação tem duas subdireitações: cluster-init e chef personalizado. O cluster-init contém diretórios que têm um significado especial, como o diretório de scripts (contém scripts que são executados por ordem lexicográfica no nó), ficheiros (ficheiros de dados brutos a serem colocados no nó) e testes (contém testes a serem executados quando um cluster é iniciado no modo de teste).
O subdiretório personalizado do chef tem três diretórios: livros de receitas de sites (para definições de livro de receitas), data_bags (definições de databag) e papéis (ficheiros de definição de função do chef).
project.ini
project.ini
é o ficheiro que contém todos os metadados para o seu projeto. Pode conter:
Parâmetro | Descrição |
---|---|
name | O nome do projeto. As palavras devem ser separadas por traços, por exemplo, ordem-66-2018 |
etiqueta | O nome do projeto. Nome comprido (com espaços) do cluster para fins de exibição. |
tipo | Três opções: programador, aplicação, <em branco>. Determina o tipo de projeto e gera o modelo apropriado. Predefinição: aplicação |
versão | Formato: x.x.x |
Armários
Os conteúdos do projeto são armazenados dentro de um armário. Pode fazer o upload do conteúdo do seu projeto para qualquer locker definido na sua instalação CycleCloud através do comando cyclecloud project upload (locker)
, onde (locker) é o nome de um armário de armazenamento em nuvem na sua instalação CycleCloud. Este cacifo será definido como o alvo padrão. Em alternativa, pode ver quais os cacifos disponíveis para si com o comando cyclecloud locker list
. Os detalhes sobre um cacifo específico podem ser vistos com cyclecloud locker show (locker)
.
Se adicionar mais do que um armário, pode definir o seu padrão com cyclecloud project default_target (locker)
, em seguida, simplesmente executar cyclecloud project upload
. Também pode definir um armário padrão global que pode ser partilhado por projetos com o comando cyclecloud project default locker (locker) -global
.
Nota
Os armários predefinidos serão armazenados no ficheiro config cyclecloud (normalmente localizado em ~/.cycle/config.ini), não no project.ini. Isto é feito para permitir que project.ini seja controlado pela versão.
O upload dos conteúdos do seu projeto irá fechar os diretórios do chef e sincronizar tanto o chef como o cluster no seu armário alvo. Estes serão armazenados em:
- (cacifo)/projetos/(projeto)/(versão)/spec_name)/cluster-init
- (cacifo)/projetos/(projeto)/(versão)/(spec_name)/chef
Blob Download
Utilize project download
para descarregar todas as bolhas referenciadas no project.ini para o seu diretório de blobs local. O comando utiliza o [locker]
parâmetro e tentará descarregar bolhas listadas em project.ini do cacifo para o armazenamento local. Um erro será devolvido se os ficheiros não puderem ser localizados.
Configuração do projeto
Especificações
Ao criar um novo projeto, é definida uma especificação padrão única. Pode adicionar especificações adicionais ao seu projeto através do cyclecloud project add_spec
comando.
Controlo de versões
Por predefinição, todos os projetos têm uma versão de 1.0.0. Pode definir uma versão personalizada à medida que desenvolve e implementa projetos definindo version=x.y.z
o ficheiro project.ini .
Por exemplo, se "locker_url" fosse "az://my-account/my-container/projects", o projeto chamava-se "Order66", a versão era "1.6.9", e a especificação é "padrão", o seu url seria:
- az://my-account/my-container/projects/Order66/1.6.9/default/cluster-init
- az://my-account/my-container/projects/Order66/1.6.9/default/chef
Blobs
Existem dois tipos de bolhas: bolhas de projeto e bolhas de utilizador.
Projeto Blobs
Os Project Blobs são ficheiros binários fornecidos pelo autor do projeto com o pressuposto de que podem ser distribuídos (ou seja, um ficheiro binário para um projeto open source que legalmente pode redistribuir). O Project Blobs vai para o diretório "blobs" de um projeto, e quando enviado para um cacifo, eles serão localizados em /project/blobs.
Para adicionar bolhas a projetos, adicione os ficheiros ao seu project.ini:
[[blobs optionalname]]
Files = projectblob1.tgz, projectblob2.tgz, projectblob3.tgz
Várias bolhas podem ser separadas por uma vírgula. Também pode especificar o caminho relativo para o diretório blob do projeto.
Bolhas de utilizador
As Bolhas de Utilizador são ficheiros binários que o autor do projeto não pode redistribuir legalmente, como binários UGE. Estes ficheiros não são embalados com o projeto, mas devem ser encenados manualmente para o cacifo. Os ficheiros serão localizados em /blobs/my-project/my-blob.tgz. As bolhas do utilizador não precisam de ser definidas no project.ini.
Para descarregar qualquer bolha, use o jetpack download
comando do CLI, ou o jetpack_download
recurso Chef. CycleCloud procurará primeiro a bolha do utilizador. Se esse ficheiro não estiver localizado, será utilizada a bolha de nível de projeto.
Nota
É possível sobrepor uma bolha de projeto com uma bolha de utilizador com o mesmo nome.
Especifique o projeto dentro de um modelo de cluster
A sintaxe do projeto permite-lhe especificar várias especificações nos seus nós. Para definir um projeto, utilize o seguinte:
[[[cluster-init myspec]]]
Project = myproject # inferred from name
Version = x.y.z
Spec = default # (alternatively, you can name your own spec to be used here)
Locker = default # (optional, will use default locker for node)
Nota
O nome especificado após 'especificação' pode ser qualquer coisa, mas pode e deve ser usado como atalho para definir algumas propriedades comuns > .
Também pode aplicar várias especificações a um dado nó da seguinte forma:
[[node scheduler]]
[[[cluster-init myspec]]]
Project = myproject
Version = x.y.z
Spec = default # (alternatively, you can name your own spec to be used here)
Locker = default # (optional, will use default locker for node)
[[[cluster-init otherspec]]]
Project = otherproject
Version = a.b.c
Spec = otherspec # (optional)
Ao separar automaticamente o nome do projeto, o nome das especificações e a versão com os cólons, o CycleCloud pode analisar esses valores nas definições apropriadas Project/Version/Spec
automaticamente:
[[node scheduler]]
AdditionalClusterInitSpecs = $ClusterInitSpecs
[[[cluster-init myproject:myspec:x.y.z]]]
[[[cluster-init otherproject:otherspec:a.b.c]]]
As especificações também podem ser herdadas entre nós. Por exemplo, pode partilhar uma especificação comum entre todos os nós e, em seguida, executar uma especificação personalizada no nó do programador:
[[node defaults]]
[[[cluster-init my-project:common:1.0.0]]]
Order = 2 # optional
[[node scheduler]]
[[[cluster-init my-project:scheduler:1.0.0]]]
Order = 1 # optional
[[nodearray execute]]
[[[cluster-init my-project:execute:1.0.0]]]
Order = 1 # optional
Isto aplicaria tanto as common
especificações como scheduler
as especificações ao nó do programador, aplicando apenas as common
especificações e execute
especificações ao nó de execução.
Por predefinição, as especificações serão executadas na ordem que são mostradas no modelo, executando as especificações herdadas primeiro.
Order
é um número inteiro opcional definido para um padrão de 1000, e pode ser usado para definir a ordem das especificações.
Se apenas um nome for especificado na definição [[[cluster-init]]]
, será assumido como o nome de especificação. Por exemplo:
[[[cluster-init myspec]]]
Project = myproject
Version = 1.0.0
é uma configuração de especificações válida na qual Spec=myspec
é implícita pelo nome.
run_list
Pode especificar uma lista de execução no projeto ou nível de especificações dentro do seu project.ini:
[spec scheduler]
run_list = role[a], recipe[b]
Quando um nó inclui a especificação "scheduler", o run_list definido será automaticamente anexado a qualquer lista de execução previamente definida. Por exemplo, se o meu run_list definido em baixo [configuration]
fosse run_list = recipe[test]
, a lista final seria run_list = recipe[cyclecloud], recipe[test], role[a], recipe[b], recipe[cluster_init]
.
Também pode substituir uma lista de runlist ao nível de especificações num nó. Isto substituirá quaisquer run_list incluídos no project.ini. Por exemplo, se alterarmos a definição do nó para o seguinte:
[cluster-init test-project:scheduler:1.0.0]
run_list = recipe[different-test]
A lista de candidaturas definida no projeto seria ignorada e as que precedem seriam utilizadas. A lista final no nó seria então run_list = recipe[cyclecloud], recipe[test], recipe[different-test], recipe[cluster_init]
.
Nota
runlists são específicos para chef e não se aplicam de outra forma.
Localizações de arquivos
Os ficheiros do chef com fecho serão descarregados durante a fase de arranque do nó. Eles são descarregados para $JETPACK_HOME/system/chef/tarballs e desapertados para $JETPACK_HOME/system/chef/chef-repo/, e usados ao convergir o nó.
Nota
Para executar livros de receitas personalizados, deve especificá-los no run_list para o nó.
Os ficheiros cluster-init serão descarregados para /mnt/cluster-init/(project)/(spec)/. Para "my-project" e "my-spec", verá os seus scripts, ficheiros e testes localizados em /mnt/cluster-init/my-project/my-spec.
Projetos de Sincronização
Os projetos CycleCloud podem ser sincronizados a partir de espelhos para o armazenamento de nuvens locais do cluster. Desaver um atributo SourceLocker numa [cluster-init]
secção dentro do seu modelo. O nome do cacifo especificado será usado como a fonte do projeto, e o conteúdo será sincronizado com o seu cacifo no início do cluster. Também pode usar o nome do cacifo como primeira parte do nome do cluster-init. Por exemplo, se o armário de origem era "cyclecloud", as duas definições seguintes são as mesmas:
[cluster-init my-project:my-spect:1.2.3]
SourceLocker=cyclecloud
[cluster-init cyclecloud/my-proect:my-spec:1.2.3]
Armazenamento de arquivos grandes
Os projetos suportam ficheiros grandes. Ao nível superior de um projeto recém-criado, você verá um diretório "blobs" para os seus grandes ficheiros (bolhas). Por favor, note que as bolhas colocadas neste diretório têm um propósito específico, e agirão de forma diferente dos itens dentro do diretório de "ficheiros".
Os itens dentro do diretório "blobs" são de especificações e versão independentes: qualquer coisa em "bolhas" pode ser partilhada entre especificações ou versões de projeto. Como exemplo, um instalador para um programa que muda raramente pode ser armazenado dentro de "blobs" e referenciado dentro do seuproject.ini. À medida que itera nas versões do seu projeto, esse ficheiro único permanece o mesmo e só é copiado para o seu armazenamento em nuvem uma vez, o que poupa no custo de transferência e armazenamento.
Para adicionar uma bolha, basta colocar um ficheiro no diretório "blobs" e editar o seu project.ini para fazer referência a esse ficheiro:
[blobs]
Files=big_file1.tgz
Quando utilizar o project upload
comando, todas as bolhas referenciadas no project.ini serão transferidas para o armazenamento em nuvem.
Ficheiros de Registo
Os ficheiros de registo gerados ao executar o cluster-init estão localizados em $JETPACK_HOME/logs/cluster-init/(projeto)/(spec).
Executar ficheiros
Quando um script de cluster-init é executado com sucesso, um ficheiro é colocado em /mnt/cluster-init/.run/((spec) para garantir que não é executado novamente numa convergência subsequente. Se quiser voltar a executar o script, elimine o ficheiro apropriado neste diretório.
Diretórios de Script
Quando o CycleCloud executa scripts no diretório de scripts, irá adicionar variáveis ambientais ao caminho e nome das especificações e diretórios do projeto:
CYCLECLOUD_PROJECT_NAME
CYCLECLOUD_PROJECT_PATH
CYCLECLOUD_SPEC_NAME
CYCLECLOUD_SPEC_PATH
No linux, um projeto chamado "test-project" com uma especificação de "padrão" teria caminhos como se segue:
CYCLECLOUD_PROJECT_NAME = test-project
CYCLECLOUD_PROJECT_PATH = /mnt/cluster-init/test-project
CYCLECLOUD_SPEC_NAME = default
CYCLECLOUD_SPEC_PATH = /mnt/cluster-init/test-project/default
Executar scripts apenas
Para executar apenas os scripts de cluster-init:
jetpack converge --cluster-init
A saída do comando irá tanto para STDOUT como para jetpack.log. Cada script também terá a sua saída registada para:
$JETPACK_HOME/logs/cluster-init/(project)/(spec)/scripts/(script.sh).out
Chef personalizado e especificações composíveis
Cada especificação tem um diretório de chef nele. Antes de uma convergência, cada especificação será desatado e extraída para o chef-repo local, substituindo quaisquer livros de receitas, papéis e sacos de dados existentes com o mesmo nome. Isto é feito na ordem que as especificações são definidas, por isso, no caso de uma colisão de nomeação, a última especificação definida sempre vencerá.
download de jetpack
Para descarregar uma bolha dentro de um script de cluster-init, use o comando jetpack download (filename)
para retirá-lo do diretório blobs. Executar este comando a partir de um script de cluster-init determinará o projeto e URL base para si. Para usá-lo num contexto não-cluster-init, você precisará especificar o projeto (ver -- ajuda para mais informações).
Para os utilizadores de chef, foi criado um jetpack_download
LWRP:
jetpack_download "big-file1.tgz" do
project "my-project"
end
No chef, a localização de descarregamento padrão é #{node[:jetpack][:downloads]}
. Para alterar o destino do ficheiro, utilize o seguinte:
jetpack_download "foo.tgz" do
project "my-project"
dest "/tmp/download.tgz"
end
Quando usado dentro do chef, você deve especificar o projeto.