Personalizar stacks e buildpacks

Os buildpacks são usados pelo Kf para transformar o código fonte de uma aplicação numa imagem executável. Os Cloud Native Buildpacks usam a API Buildpack v3 mais recente, e empresas como a VMware e a Heroku estão a adicionar ativamente suporte para a v3 aos buildpacks existentes.

O Kf suporta Buildpacks em conformidade com as versões V2 e V3 da especificação da API Buildpack.

Comparação entre os buildpacks V2 e V3

V2 Buildpacks V3 Buildpacks
Nomes alternativos Buildpacks do Cloud Foundry Cloud Native Buildpacks (CNB), imagens de criação
Estado 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 kf Namespace. 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
  ...

Personalizar 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

Pode encontrar uma lista de stacks de CNB publicadas na CLI de 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 config-defaults ConfigMap no kf Namespace. Adicione uma entrada à chave spaceStacksV3 da seguinte forma:

$ kubectl edit configmap config-defaults -n kf

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 Trabalhar com criadores usando o create-builder do pack para criar a sua própria imagem do criador. Depois de criado, envie-o para um registo de contentores e adicione-o ao config-defaults ConfigMap.

Predefinir 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 config-defaults ConfigMap no kf namespace como "true":

$ kubectl edit configmap config-defaults -n kf

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