Os buildpacks são usados pelo Kf para transformar o código-fonte de um aplicativo em uma imagem executável. Os buildpacks nativos da nuvem usam a API Buildpack v3 mais recente. As empresas adicionam ativamente o suporte da v3 aos buildpacks.
O Kf é compatível com buildpacks em conformidade com a V2 e a V3 da especificação da API Buildpack.
Comparação entre os buildpacks V2 e V3
| Buildpacks da V2 | Buildpacks da V3 | |
|---|---|---|
| Nomes alternativos | Buildpacks do Cloud Foundry | Buildpacks (CNB) nativos da nuvem, imagens do builder |
| Status | Sendo substituído | Atual |
| Propriedade | Cloud Foundry | Buildpacks.io |
| Pilha | Compartilhado pelo builder e pelo ambiente de execução | Pode ser diferente para builder e ambiente de execução |
| Desenvolvimento local | Não é possível | Sim, com a CLI pack |
| Buildpacks personalizados | Disponível no ambiente de execução | Precisa ser incorporado ao builder. |
Ciclo de vida do buildpack
| Etapa | Cloud Foundry | Kf com buildpacks da V2 | Kf com buildpacks da V3 |
|---|---|---|---|
| Local de origem | Serviço de BITS | Container Registry | Container Registry |
| Local do Buildpack | BOSH/HTTP | HTTP | Container Registry |
| Local da pilha | BOSH | Container Registry | Container Registry |
| Resultado | Droplet (binário de aplicativo sem pilha) | Imagem (Droplet em uma pilha) | Imagem |
| Ambiente de execução | Droplet montado sobre a pilha e executado | Executar a imagem produzida | Executar a imagem produzida |
O Kf sempre produz uma imagem completa e executável como resultado do processo de build. O Cloud Foundry, por outro lado, produz partes de uma imagem executável no tempo de build e o restante é adicionado no tempo de execução.
O Kf optou por seguir o modelo de sempre produzir uma imagem completa pelos seguintes motivos:
- As imagens podem ser exportadas, executadas localmente e inspecionadas estaticamente
- Mais segurança e auditoria com ferramentas, como autorização binária
- As implantações de apps são reproduzíveis.
Kf e buildpacks
O Kf armazena a lista global de buildpacks e
pilhas no ConfigMap config-defaults no namespace kf. A modificação das propriedades de buildpacks e pilhas precisa ser feita no recurso personalizado kfsystem. O operador Kf atualiza automaticamente o ConfigMap config-defaults com base nos valores definidos em kfsystem.
Cada Space reflete esses buildpacks no campo de status.
Para um Space chamado buildpack-docs, é possível executar o seguinte para conferir a configuração completa dele:
kf space buildpack-docsGetting 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 seção Build Config, três campos devem ser observados:
- Os buildpacks V2 contêm uma lista de buildpacks compatíveis com V2 na ordem em que serão executados
- Pilhas V2 indicam as que podem ser escolhidas para acionar um build do buildpack da V2
- Pilhas V3 indicam as que podem ser escolhidas para acionar um build do buildpack da V3
Também é possível listar as pilhas com kf stacks:
kf stacksGetting 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
Como as imagens de build V3 já têm buildpacks integrados, use kf buildpacks para conferir a lista:
kf buildpacksGetting 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 ...
Personalizar buildpacks da V3
Você pode personalizar os buildpacks disponíveis para os desenvolvedores criando sua própria imagem de builder exatamente com os buildpacks a que eles têm acesso. Você também pode usar imagens de builder publicadas por outros autores.
Usar uma imagem de builder de terceiros
Uma lista de pilhas CNB publicadas está disponível na CLI do buildpack pack.
No momento em que este artigo foi escrito, a saída de pack suggest-stacks era assim:
pack suggest-stacksStacks 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:18Stack 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-cnbStack 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-cnbStack 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 para usar a pilha publicada pelo Heroku, edite o recurso personalizado kfsystem, que atualiza automaticamente o ConfigMap config-defaults no namespace kf.
Adicione uma entrada à chave spaceStacksV3 como esta:
kubectl edit kfsystem kfsystemspaceStacksV3: | - 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 stacksGetting 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
Criar sua própria imagem de builder
Use a CLI do buildpack pack para criar sua própria imagem do builder. Siga a documentação Como trabalhar com builders usando create-builder do pack para criar sua própria imagem do builder. Depois de criá-la, envie-a para um Container Registry e adicione-a ao recurso personalizado kfsystem.
Definir uma pilha padrão
Os apps vão receber uma pilha padrão, se não houver uma no manifesto. A pilha padrão é a primeira na lista de pilhas da V2 ou da V3. A menos que seja substituída, uma pilha V2 é escolhida pela compatibilidade com o Cloud Foundry.
Para o Kf usar uma pilha V3 em vez de V2, defina o campo spaceDefaultToV3Stack no recurso personalizado kfsystem como "true" (kfsystem atualiza automaticamente o campo spaceDefaultToV3Stack correspondente no ConfigMap config-defaults):
kubectl edit kfsystem kfsystemspaceDefaultToV3Stack: "true"
Altere a configuração do campo spec.buildConfig.defaultToV3Stack para true ou false para modificar essa opção de acordo com o Space. Se essa configuração não estiver definida,
o valor do ConfigMap config-defaults será usado.
Valor de config-defaults para spaceDefaultToV3Stack |
spec.buildConfig.defaultToV3Stack do Space |
Pilha padrão |
|---|---|---|
| não definido | não definido | V2 |
"false" |
não definido | V2 |
"true" |
não definido | V3 |
| qualquer um | false |
V2 |
| qualquer um | true |
V3 |