스택 및 빌드팩 맞춤설정

빌드팩은 Kf에서 애플리케이션의 소스 코드를 실행 가능한 이미지로 변환하는 데 사용됩니다. 클라우드 네이티브 빌드팩은 최신 Buildpack API v3를 사용하며, VMware나 Heroku를 비롯한 기업들은 기존 빌드팩에 v3 지원을 적극적으로 추가합니다.

Kf는 Buildpack API 사양의 V2V3을 모두 준수하는 빌드팩을 지원합니다.

V2와 V3 빌드팩 비교

V2 빌드팩 V3 빌드팩
대체 이름 Cloud Foundry 빌드팩 클라우드 네이티브 빌드팩(CNB), 빌더 이미지
상태 교체 중 사용 중
소유권 Cloud Foundry Buildpacks.io
스택 빌더 및 런타임에서 공유 빌더 및 런타임에서 선택적으로 다름
로컬 개발 불가능 예(pack CLI 사용 시)
커스텀 빌드팩 런타임에 사용 가능 빌더에 빌드되어야 함

빌드팩 수명주기

단계 Cloud Foundry 빌드팩 V2가 있는 Kf 빌드팩 V3이 있는 Kf
소스 위치 BITS 서비스 Container Registry Container Registry
빌드팩 위치 BOSH/HTTP HTTP Container Registry
스택 위치 BOSH Container Registry Container Registry
결과 Droplet (스택 없는 앱 바이너리) 이미지 (스택 위의 Droplet) 이미지
런타임 스택 위에 Droplet 놓고 실행 생성된 이미지 실행 생성된 이미지 실행

Kf는 항상 빌드 프로세스의 결과로 전체 실행 가능한 이미지를 생성합니다. 반면에 Cloud Foundry는 빌드 시 실행 가능한 이미지의 일부를 생성하고 나머지는 런타임에 추가됩니다.

Kf는 다음 이유 때문에 항상 전체 이미지를 생성하는 모델을 따르기로 선택했습니다.

  • 이미지를 로컬에서 내보내고 실행할 수 있으며 정적으로 검사 가능
  • Binary Authorization 같은 도구를 사용하여 보안 및 감사 개선
  • 앱 배포 재현 가능

Kf 및 빌드팩

Kf는 빌드팩 및 스택의 전역 목록을 kf 네임스페이스의 config-defaults ConfigMap에 저장합니다. 각 공간은 해당 상태 필드에 이러한 빌드팩을 반영합니다. 이름이 buildpack-docs인 공간의 경우 다음을 실행하여 전체 공간 구성을 확인할 수 있습니다.

$ 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

Build Config 섹션에는 확인할 세 가지 필드가 있습니다.

  • Buildpacks V2에는 실행 순서대로 V2 호환 빌드팩 목록이 포함됩니다.
  • 스택 V2는 V2 빌드팩 빌드를 트리거하도록 선택할 수 있는 스택을 나타냅니다.
  • 스택 V3는 V3 빌드팩 빌드를 트리거하도록 선택할 수 있는 스택을 나타냅니다.

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

V3 빌드 이미지에 이미 기본 제공 빌드팩이 포함되기 때문에 목록을 가져오려면 kf buildpacks를 사용해야 합니다.

$ 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
  ...

V3 빌드팩 맞춤설정

정확히 액세스 권한이 있어야 하는 빌드팩으로 자체 빌더 이미지를 만들어서 개발자에게 제공되는 빌드팩을 맞춤설정할 수 있습니다. 다른 작성자가 게시한 빌더 이미지를 사용할 수도 있습니다.

타사 빌더 이미지 사용

게시된 CNB 스택 목록은 빌드팩 CLI pack에서 확인할 수 있습니다. 이 문서의 현재 작성 시점에서 pack suggest-stacks의 출력은 다음과 같습니다.

$ 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

Heroku에서 게시된 스택을 사용하도록 Kf를 수정하려면 kf 네임스페이스에서 config-defaults ConfigMap을 수정합니다. 다음과 같이 spaceStacksV3 키에 항목을 추가합니다.

$ 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

그런 후 다시 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
V3       heroku-18                           heroku/pack:18-build         heroku/pack:18             The official Heroku stack based on Ubuntu 18.04

자체 빌더 이미지 만들기

Buildpack CLI pack은 자체 빌더 이미지를 만들기 위해 사용됩니다. packcreate-builder를 사용하여 빌더 작업 문서에 따라 자체 빌더 이미지를 만들 수 있습니다. 만든 다음에는 이를 Container Registry에 푸시하고 config-defaults ConfigMap에 추가합니다.

기본 스택 설정

매니페스트에 제공되지 않은 경우 앱에 기본 스택이 할당됩니다. 기본 스택은 V2 또는 V3 스택 목록에서 첫 번째 항목입니다. 재정의되지 않은 한 Cloud Foundry와의 호환성을 위해 V2 스택이 선택됩니다.

kf 네임스페이스의 config-defaults ConfigMap에서 spaceDefaultToV3Stack 필드를 "true"로 설정하여 Kf가 V2 대신 V3 스택을 사용하게 강제할 수 있습니다.

$ kubectl edit configmap config-defaults -n kf

spaceDefaultToV3Stack: "true"

이 옵션은 또한 spec.buildConfig.defaultToV3Stack 필드 설정을 true 또는 false로 변경하여 공간별 기준으로 수정될 수 있습니다. 설정되지 않은 경우 config-defaults ConfigMap의 값이 사용됩니다.

spaceDefaultToV3Stackconfig-defaults 공간의 spec.buildConfig.defaultToV3Stack 기본 스택
unset unset V2
"false" unset V2
"true" unset V3
모두 false V2
모두 true V3