Installing Cloud Foundry for Kubernetes

After taking the TAS for Kubernetes route lately I wanted to try out the underlying project in v0.4.0, as this incorporates the Paketo Buildpacks.

Preparation steps are the same as for the TAS installation, but the project includes some great documentation for installing it on a local cluster, may it be a kind or minikube one.

Assuming you have your kind cluster installed, kapp, kbld, ytt and bosh installed, changes start to kick in when preparing for the configuration. This time I wanted to use my GCP account instead of dockerhub to host the images. v0.4.0 will also include a metrics server configuration, and as such we don’t need to install it separately.

Generate configuration values

The scripts to generate the required config values are located in hack rather than bin as they are for the TAS installation, but other than that they serve the same purpose.

Generate those values and include the service account json for GCP

$ TMP_DIR=../configuration-values ; mkdir -p ${TMP_DIR}
$ ./hack/generate-values.sh -d 127.0.0.1.nip.io -g gcp_service_account.json > ${TMP_DIR}/cf-values.yml

This will generate the configuration and append the service account1 at the end

app_registry:
  hostname: gcr.io
  repository: gcr.io/someone/cf-workloads
  username: _json_key
  password: |
    {
      "type": "service_account",
      "project_id": "someone",
      "private_key_id": "",
      "private_key": "-----BEGIN PRIVATE KEY----------END PRIVATE KEY-----\n",
      "client_email": "[email protected]",
      "client_id": "1234567890",
      "auth_uri": "https://accounts.google.com/o/oauth2/auth",
      "token_uri": "https://accounts.google.com/o/oauth2/token",
      "auth_provider_x509_cert_url": "https://www.googleapis.com/oauth2/v1/certs",
      "client_x509_cert_url": "https://www.googleapis.com/robot/v1/metadata/x509/1234567890-compute%40developer.gserviceaccount.com"
    }

The following command - while being long and hard to read - will generate the final yaml for k8s to install the required resources. It includes several overlay files which we copied over in my other article and will patch resources to run on our installed kind cluster.

$ ytt -f config -f config-optional/remove-resource-requirements.yml -f config-optional/remove-ingressgateway-service.yml -f config-optional/add-metrics-server-components.yml -f config-optional/patch-metrics-server.yml -f ${TMP_DIR}/cf-values.yml > ${TMP_DIR}/cf-for-k8s-rendered.yml

After a successful generation of the configuration, you may start the deployment

$ kapp deploy -a cf -f ${TMP_DIR}/cf-for-k8s-rendered.yml -y

Testing things out

Installation’s done, so we want to login and test things out.

Use the cf cli to point to the api endpoint:

$ cf api api.127.0.0.1.nip.io --skip-ssl-validation
Setting api endpoint to api.127.0.0.1.nip.io...
OK

api endpoint:   https://api.127.0.0.1.nip.io
api version:    2.148.0

That’s it! You can now deploy apps like you’re used to, and with the new paketo buildpacks enabled, you don’t need the diego_docker feature flag anymore. Plus, you can now run Java, Node.js, Golang, .NET Core, PHP, and NGINX Paketo Buildpacks with Ruby and Python to follow.

~/cf-sample-app-nodejs (master •) $ cf push
Pushing from manifest to org test-org / space test-space as admin...
Using manifest file /Users/mbeck/Projects/pivotal/demos/cf-sample-app-nodejs/manifest.yml
Getting app info...
Creating app with these attributes...
+ name:        cf-nodejs
  path:        /Users/mbeck/Projects/pivotal/demos/cf-sample-app-nodejs
+ instances:   1
+ memory:      512M
  routes:
+   cf-nodejs-fluent-squirrel-jg.apps.127.0.0.1.nip.io

Creating app cf-nodejs...
Mapping routes...
Comparing local files to remote cache...
Packaging files to upload...
Uploading files...
 1.24 MiB / 1.24 MiB [=========================================================================================================================================] 100.00% 1s

Waiting for API to complete processing files...

Staging app and tracing logs...
   Loading secret for "gcr.io" from secret "cc-kpack-registry-auth-secret-ver-1" at location "/var/build-secrets/cc-kpack-registry-auth-secret-ver-1"
   Successfully downloaded cf-blobstore-minio.cf-blobstore.svc.cluster.local:9000/cc-packages/c8/a5/c8a5b104-720e-4874-b4d9-c437c08e73a9 in path "/workspace"
   paketo-buildpacks/node-engine 0.0.210
   paketo-buildpacks/npm         0.1.39
   Previous image with name "gcr.io/someone/cf-workloads/336de67a-582f-43a0-87aa-9990a7e03f4a" not found
   Node Engine Buildpack 0.0.210
   Resolving Node Engine version
   Candidate version sources (in priority order):
   -> "*"
   Selected Node Engine version (using ): 10.20.1
   Executing build process
   Installing Node Engine 10.20.1
   Completed in 2.652s
   Configuring environment
   NODE_ENV     -> "production"
   NODE_HOME    -> "/layers/paketo-buildpacks_node-engine/node"
   NODE_VERBOSE -> "false"
   Writing profile.d/0_memory_available.sh
   Calculates available memory based on container limits at launch time.
   Made available in the MEMORY_AVAILABLE environment variable.
   NPM Buildpack 0.1.39
   Resolving installation process
   Process inputs:
   node_modules      -> "Not found"
   npm-cache         -> "Not found"
   package-lock.json -> "Not found"
   Selected NPM build process: 'npm install'
   Executing build process
   Running 'npm install'
   Completed in 7.464s
   Configuring environment
   NPM_CONFIG_LOGLEVEL   -> "error"
   NPM_CONFIG_PRODUCTION -> "true"
   PATH                  -> "$PATH:/layers/paketo-buildpacks_npm/modules/node_modules/.bin"
   Adding layer 'launcher'
   Adding layer 'paketo-buildpacks/node-engine:node'
   Adding layer 'paketo-buildpacks/npm:modules'
   Adding 1/1 app layer(s)
   Adding layer 'config'
   *** Images (sha256:5c793b56d2a6b1a44119887f2f03e9698f5751559d0c0fd9e447f9f7a82b3e89):
   gcr.io/fe-mbeck/cf-workloads/336de67a-582f-43a0-87aa-9990a7e03f4a
   gcr.io/fe-mbeck/cf-workloads/336de67a-582f-43a0-87aa-9990a7e03f4a:b1.20200708.105037
   Adding cache layer 'paketo-buildpacks/node-engine:node'
   Adding cache layer 'paketo-buildpacks/npm:npm-cache'
   Build successful

Waiting for app to start...

name:                cf-nodejs
requested state:     started
isolation segment:   placeholder
routes:              cf-nodejs-fluent-squirrel-jg.apps.127.0.0.1.nip.io
last uploaded:       Wed 08 Jul 12:53:44 CEST 2020
stack:
buildpacks:

type:            web
instances:       1/1
memory usage:    512M
start command:   npm start
     state     since                  cpu    memory      disk      details
#0   running   2020-07-08T10:53:50Z   0.0%   0 of 512M   0 of 1G

cf push  9.25s user 3.57s system 5% cpu 3:36.92 total

Cleaning the cluster

kapp delete -a cf will remove the whole installation from your kind cluster. This also greatly helps in case there was an error during your installation.


  1. Please use your own, which you can generate at https://console.cloud.google.com. This provided service account json will not work. ↩︎