빌드팩은 Kf에서 애플리케이션의 소스 코드를 실행 가능한 이미지로 변환하는 데 사용됩니다. 클라우드 네이티브 빌드팩은 최신 Buildpack API v3를 사용하며, VMware나 Heroku를 비롯한 기업들은 기존 빌드팩에 v3 지원을 적극적으로 추가합니다.
Kf는 Buildpack API 사양의 V2 및 V3을 모두 준수하는 빌드팩을 지원합니다.
V2와 V3 빌드팩 비교
| V2 빌드팩 | V3 빌드팩 | |
|---|---|---|
| 대체 이름 | Cloud Foundry 빌드팩 | 클라우드 네이티브 빌드팩(CNB), 빌더 이미지 | 
| 상태 | 교체 중 | 사용 중 | 
| 소유권 | Cloud Foundry | Buildpacks.io | 
| 스택 | 빌더 및 런타임에서 공유 | 빌더 및 런타임에서 선택적으로 다름 | 
| 로컬 개발 | 불가능 | 예( packCLI 사용 시) | 
| 커스텀 빌드팩 | 런타임에 사용 가능 | 빌더에 빌드되어야 함 | 
빌드팩 수명주기
| 단계 | 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은 자체 빌더 이미지를 만들기 위해 사용됩니다. pack의 create-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의 값이 사용됩니다.
| spaceDefaultToV3Stack에config-defaults값 | 공간의 spec.buildConfig.defaultToV3Stack | 기본 스택 | 
|---|---|---|
| unset | unset | V2 | 
| "false" | unset | V2 | 
| "true" | unset | V3 | 
| 모두 | false | V2 | 
| 모두 | true | V3 |