Personalize 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 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

O que se segue?