Os buildpacks são usados pelo Kf para transformar o código fonte de uma aplicação numa imagem executável. Os buildpacks nativos da nuvem usam a API Buildpack v3 mais recente. As empresas estão a adicionar ativamente o suporte da v3 aos conjuntos de compilação existentes.
O Kf suporta buildpacks em conformidade com as versões V2 e V3 da especificação da API Buildpack.
Compare os buildpacks V2 e V3
V2 buildpacks | Buildpacks V3 | |
---|---|---|
Nomes alternativos | Buildpacks do Cloud Foundry | Cloud Native Buildpacks (CNB), imagens de criação |
Estado | Está a ser substituído | Atual |
Propriedade | Cloud Foundry | Buildpacks.io |
Empilhar | Partilhada pelo criador e pelo tempo de execução | Opcionalmente, diferente para o criador e o tempo de execução |
Desenvolvimento local | Não é possível | Sim, com a CLI pack |
Buildpacks personalizados | Disponível no tempo de execução | Tem de estar integrado no criador |
Ciclo de vida do pacote de compilação
Passo | Cloud Foundry | Kf com buildpacks V2 | Kf com buildpacks V3 |
---|---|---|---|
Localização da origem | Serviço BITS | Registo de contentores | Registo de contentores |
Localização do buildpack | BOSH/HTTP | HTTP | Registo de contentores |
Localização da pilha | BOSH | Registo de contentores | Registo de contentores |
Resultado | Droplet (binário da app sem pilha) | Imagem (gota numa pilha) | Imagem |
Tempo de execução | A gota é colada na parte superior da pilha e é executada | Executar imagem produzida | Executar imagem produzida |
O Kf produz sempre uma imagem executável completa como resultado do respetivo processo de compilação. Por outro lado, o Cloud Foundry produz partes de uma imagem executável no momento da compilação e o resto é adicionado no momento da execução.
Kf optou por seguir o modelo de produzir sempre uma imagem completa pelos seguintes motivos:
- As imagens podem ser exportadas, executadas localmente e inspecionadas estaticamente
- Melhor segurança e auditoria com ferramentas como a autorização binária
- As implementações de apps são reproduzíveis
Kf e buildpacks
O Kf armazena a respetiva lista global de buildpacks e stacks no
config-defaults
ConfigMap no espaço de nomes kf
. A modificação das propriedades buildpacks e stacks deve ser feita no kfsystem
recurso personalizado. O operador Kf atualiza automaticamente o config-defaults
ConfigMap com base nos valores definidos em kfsystem
.
Cada espaço reflete estes buildpacks no respetivo campo de estado.
Para um espaço com o nome buildpack-docs
, pode executar o seguinte comando para ver a configuração completa do espaço:
kf space buildpack-docs
Getting Space buildpack-docs API Version: kf.dev/v1alpha1 Kind: Space Metadata: Creation Timestamp: 2020-02-14T15:09:52Z Name: buildpack-docs Self Link: /apis/kf.dev/v1alpha1/spaces/buildpack-docs UID: 0cf1e196-4f3c-11ea-91a4-42010a80008d Status: Build Config: Buildpacks V2: - Name: staticfile_buildpack URL: https://github.com/cloudfoundry/staticfile-buildpack Disabled: false - Name: java_buildpack URL: https://github.com/cloudfoundry/java-buildpack Disabled: false Stacks V2: - Image: cloudfoundry/cflinuxfs3 Name: cflinuxfs3 Stacks V3: - Build Image: cloudfoundry/cnb:cflinuxfs3 Description: A large Cloud Foundry stack based on Ubuntu 18.04 Name: org.cloudfoundry.stacks.cflinuxfs3 Run Image: cloudfoundry/run:full-cnb
Na secção Build Config
, existem três campos a ter em atenção:
- O Buildpacks V2 contém uma lista de buildpacks compatíveis com a V2 pela ordem em que vão ser executados
- O Stacks V2 indica as stacks que podem ser escolhidas para acionar uma compilação de buildpack V2
- O Stacks V3 indica as stacks que podem ser escolhidas para acionar uma compilação de buildpack V3
Também pode listar as associações com kf stacks
:
kf stacks
Getting stacks in Space: buildpack-docs Version Name Build Image Run Image Description V2 cflinuxfs3 cloudfoundry/cflinuxfs3 cloudfoundry/cflinuxfs3 V3 org.cloudfoundry.stacks.cflinuxfs3 cloudfoundry/cnb:cflinuxfs3 cloudfoundry/run:full-cnb A large Cloud Foundry stack based on Ubuntu 18.04
Uma vez que as imagens de compilação da V3 já têm os respetivos buildpacks incorporados, tem de usar kf buildpacks
para obter a lista:
kf buildpacks
Getting buildpacks in Space: buildpack-docs Buildpacks for V2 stacks: Name Position URL staticfile_buildpack 0 https://github.com/cloudfoundry/staticfile-buildpack java_buildpack 1 https://github.com/cloudfoundry/java-buildpack V3 Stack: org.cloudfoundry.stacks.cflinuxfs3: Name Position Version Latest org.cloudfoundry.jdbc 0 v1.0.179 true org.cloudfoundry.jmx 1 v1.0.180 true org.cloudfoundry.go 2 v0.0.2 true org.cloudfoundry.tomcat 3 v1.1.102 true org.cloudfoundry.distzip 4 v1.0.171 true org.cloudfoundry.springboot 5 v1.1.2 true ...
Personalize os buildpacks V3
Pode personalizar os buildpacks disponíveis para os seus programadores criando a sua própria imagem do criador com exatamente os buildpacks aos quais devem ter acesso. Também pode usar imagens do criador publicadas por outros autores.
Use uma imagem de criador de terceiros
Está disponível uma lista de conjuntos de CNB publicados na
CLI Buildpack pack
.
No momento da redação deste artigo, o pack suggest-stacks
produz:
pack suggest-stacks
Stacks maintained by the community:
Stack ID: heroku-18 Description: The official Heroku stack based on Ubuntu 18.04 Maintainer: Heroku Build Image: heroku/pack:18-build Run Image: heroku/pack:18
Stack ID: io.buildpacks.stacks.bionic Description: A minimal Cloud Foundry stack based on Ubuntu 18.04 Maintainer: Cloud Foundry Build Image: cloudfoundry/build:base-cnb Run Image: cloudfoundry/run:base-cnb
Stack ID: org.cloudfoundry.stacks.cflinuxfs3 Description: A large Cloud Foundry stack based on Ubuntu 18.04 Maintainer: Cloud Foundry Build Image: cloudfoundry/build:full-cnb Run Image: cloudfoundry/run:full-cnb
Stack ID: org.cloudfoundry.stacks.tiny Description: A tiny Cloud Foundry stack based on Ubuntu 18.04, similar to distroless Maintainer: Cloud Foundry Build Image: cloudfoundry/build:tiny-cnb Run Image: cloudfoundry/run:tiny-cnb
Para modificar o Kf de modo a usar a pilha publicada pelo Heroku, edite o
kfsystem
recurso personalizado, que atualiza automaticamente o config-defaults
ConfigMap no kf
espaço de nomes.
Adicione uma entrada à chave spaceStacksV3
da seguinte forma:
kubectl edit kfsystem kfsystem
spaceStacksV3: | - name: org.cloudfoundry.stacks.cflinuxfs3 description: A large Cloud Foundry stack based on Ubuntu 18.04 buildImage: cloudfoundry/cnb:cflinuxfs3 runImage: cloudfoundry/run:full-cnb - name: heroku-18 description: The official Heroku stack based on Ubuntu 18.04 buildImage: heroku/pack:18-build runImage: heroku/pack:18
Em seguida, execute stacks
novamente:
kf stacks
Getting stacks in Space: buildpack-docs Version Name Build Image Run Image Description V2 cflinuxfs3 cloudfoundry/cflinuxfs3 cloudfoundry/cflinuxfs3 V3 org.cloudfoundry.stacks.cflinuxfs3 cloudfoundry/cnb:cflinuxfs3 cloudfoundry/run:full-cnb A large Cloud Foundry stack based on Ubuntu 18.04 V3 heroku-18 heroku/pack:18-build heroku/pack:18 The official Heroku stack based on Ubuntu 18.04
Crie a sua própria imagem do criador
A CLI Buildpack pack
é usada para criar a sua própria imagem do criador. Pode seguir a documentação pack
's
Trabalhar com criadores usando o create-builder
para criar a sua própria imagem do criador. Depois de criado, envie-o para um registo de contentores e adicione-o ao recurso personalizado kfsystem
.
Predefina uma hierarquia
É atribuída às apps uma pilha predefinida se não for fornecida nenhuma no respetivo manifesto. A hierarquia predefinida é a primeira na lista de hierarquias V2 ou V3. Salvo se for substituído, é escolhida uma pilha V2 para compatibilidade com o Cloud Foundry.
Pode forçar o Kf a usar uma pilha V3 em vez de uma V2 definindo o campo spaceDefaultToV3Stack
no recurso personalizado como "true"
(o kfsystem
atualiza automaticamente o campo spaceDefaultToV3Stack
correspondente no config-defaults
ConfigMap):kfsystem
kubectl edit kfsystem kfsystem
spaceDefaultToV3Stack: "true"
Esta opção também pode ser modificada por espaço, alterando a definição do campo spec.buildConfig.defaultToV3Stack
para true
ou false
. Se não estiver definido, é usado o valor do config-defaults
ConfigMap.
Valor config-defaults para spaceDefaultToV3Stack |
spec.buildConfig.defaultToV3Stack do espaço |
Conjunto predefinido |
---|---|---|
unset | unset | V2 |
"false" |
unset | V2 |
"true" |
unset | V3 |
qualquer | false |
V2 |
qualquer | true |
V3 |