Test Drive Compose on Kubernetes on Play with Kubernetes(PWK) Playground in 5 Minutes

Estimated Reading Time: 8 minutes

On the 2nd day of Dockercon, Docker Inc. open sourced Compose on Kubernetes project. This project provides a simple way to define cloud native applications with a higher-level abstraction, the Docker Compose file. Docker Compose is a tool for defining and running multi-container Docker applications is already used by millions of Docker users.Docker Enterprise Edition already had this capability enabled starting Compose File version 3.3 where one can use the same docker-compose.yml file for Swarm deployment as well as one can specify Kubernetes workloads whenever stack is deployed.

2 week back, I noticed a community ask for running Compose on Kubernetes on Play with Kubernetes Playground. To my interest, I started looking at how to simplify the solution so that it becomes easy for anyone who can set it up in no time. I forked the repository and begin to build a simple script and Makefile to get it up and running over PWK.

ICYMI.. Check out my recent blog post ~ “Compose on Kubernetes for Minikube”.

Under this blog post, we will see how Compose on Kubernetes can be enabled on top of Play with Kubernetes Platform with just 2 scripts . Let’s get started.

Open https://labs.play-with-k8s.com/ to access Kubernetes Playground.

Click on the Login button to authenticate with Docker Hub or GitHub ID.

Once you start the session, you will have your own lab environment.

Adding First Kubernetes Node

Click on “Add New Instance” on the left to build your first Kubernetes Cluster node. It automatically names it as “node1”. Each instance has Docker Community Edition (CE) and Kubeadm already pre-installed. This node will be treated as the master node for our cluster.

Bootstrapping the Master Node

Clone the Repository and run this script on your 1st instance

git clone https://github.com/collabnix/compose-on-kubernetes
cd compose-on-kubernetes/scripts/pwk/
sh bootstrap-pwk.sh

When you execute this script, as part of initialization, the kubeadm write several configuration files needed, setup RBAC and deployed Kubernetes control plane components (like kube-apiserver, kube-dns, kube-proxy, etcd, etc.). Control plane components are deployed as Docker containers.

Copy the above kubeadm join token command and save it for the next step. This command will be used to join other nodes to your cluster.

Adding Worker Nodes

Click on “Add New Node” to add a new worker node.

Checking the Cluster Status

[node1 ~]$ kubectl get nodes
NAME      STATUS     ROLES     AGE       VERSION
node1     Ready      master    18m       v1.11.3
node2     Ready      <none>    4m        v1.11.3
node3     Ready      <none>    39s       v1.11.3
node4     NotReady   <none>    22s       v1.11.3
node5     NotReady   <none>    4s        v1.11.3

[node1 ]$ kubectl get po
No resources found.
[node1 ]$ kubectl get svc
NAME         TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)   AGE
kubernetes   ClusterIP   10.96.0.1    <none>        443/TCP   1h

Executing the below script which setup Compose Namespace, etcd cluster & Compose controller all in a single shot


chmod +x prepare-pwk.sh
sh prepare-pwk.sh
[node1 pwk]$ sh prepare-pwk.sh
Creating Compose Namespace...
namespace/compose created
Installing Helm...
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100 21.6M  100 21.6M    0     0  25.3M      0 --:--:-- --:--:-- --:--:-- 25.4M
Preparing Helm
linux-amd64/
linux-amd64/tiller
linux-amd64/helm
linux-amd64/LICENSE
linux-amd64/README.md
Creating tiller under kube-system namespace...
serviceaccount/tiller created
clusterrolebinding.rbac.authorization.k8s.io/tiller-cluster-rule created
Creating /root/.helm
Creating /root/.helm/repository
Creating /root/.helm/repository/cache
Creating /root/.helm/repository/local
Creating /root/.helm/plugins
Creating /root/.helm/starters
Creating /root/.helm/cache/archive
Creating /root/.helm/repository/repositories.yaml
Adding stable repo with URL: https://kubernetes-charts.storage.googleapis.com
Adding local repo with URL: http://127.0.0.1:8879/charts
$HELM_HOME has been configured at /root/.helm.

Tiller (the Helm server-side component) has been installed into your Kubernetes Cluster.

Please note: by default, Tiller is deployed with an insecure 'allow unauthenticated users' policy.
To prevent this, run `helm init` with the --tiller-tls-verify flag.
For more information on securing your installation see: https://docs.helm.sh/using_helm/#securing-your-helm-installation
Happy Helming!
 Tiller is still coming up...Please Wait
NAME                             READY     STATUS    RESTARTS   AGE
coredns-78fcdf6894-699fx         1/1       Running   0          5m
coredns-78fcdf6894-trslx         1/1       Running   0          5m
etcd-node1                       1/1       Running   0          4m
kube-apiserver-node1             1/1       Running   0          4m
kube-controller-manager-node1    1/1       Running   0          4m
kube-proxy-5gskp                 1/1       Running   0          4m
kube-proxy-5hbkb                 1/1       Running   0          5m
kube-proxy-lcsnz                 1/1       Running   0          4m
kube-scheduler-node1             1/1       Running   0          4m
tiller-deploy-85744d9bfb-bjw2f   0/1       Running   0          15s
weave-net-9vt2s                  2/2       Running   1          4m
weave-net-k87d7                  2/2       Running   0          5m
weave-net-nmmt5                  2/2       Running   0          4m
NAME:   etcd-operator
LAST DEPLOYED: Mon Jan 21 14:27:50 2019
NAMESPACE: compose
STATUS: DEPLOYED

RESOURCES:
==> v1/ServiceAccount
NAME                                               SECRETS  AGE
etcd-operator-etcd-operator-etcd-backup-operator   1        4s
etcd-operator-etcd-operator-etcd-operator          1        4s
etcd-operator-etcd-operator-etcd-restore-operator  1        4s

==> v1beta1/ClusterRole
NAME                                       AGE
etcd-operator-etcd-operator-etcd-operator  4s

==> v1beta1/ClusterRoleBinding
NAME                                               AGE
etcd-operator-etcd-operator-etcd-backup-operator   4s
etcd-operator-etcd-operator-etcd-operator          3s
etcd-operator-etcd-operator-etcd-restore-operator  3s

==> v1/Service
NAME                   TYPE       CLUSTER-IP    EXTERNAL-IP  PORT(S)    AGE
etcd-restore-operator  ClusterIP  10.108.89.92  <none>       19999/TCP  3s

==> v1beta2/Deployment
NAME                                               DESIRED  CURRENT  UP-TO-DATE  AVAILABLE  AGE
etcd-operator-etcd-operator-etcd-backup-operator   1        1        1           0          3s
etcd-operator-etcd-operator-etcd-operator          1        1        1           0          3s
etcd-operator-etcd-operator-etcd-restore-operator  1        1        1           0          3s

==> v1/Pod(related)
NAME                                                             READY  STATUS             RESTARTS  AGE
etcd-operator-etcd-operator-etcd-backup-operator-56fd448cd897mk  0/1    ContainerCreating  0      2s
etcd-operator-etcd-operator-etcd-operator-c5b8b8f74-pttr2        0/1    ContainerCreating  0      2s
etcd-operator-etcd-operator-etcd-restore-operator-58587cdc9g4br  0/1    ContainerCreating  0      2s


NOTES:
1. etcd-operator deployed.
  If you would like to deploy an etcd-cluster set cluster.enabled to true in values.yaml
  Check the etcd-operator logs
    export POD=$(kubectl get pods -l app=etcd-operator-etcd-operator-etcd-operator --namespacecompose --output name)
    kubectl logs $POD --namespace=compose
Loaded plugins: fastestmirror, ovl
base                                                                    | 3.6 kB  00:00:00
docker-ce-stable                                                        | 3.5 kB  00:00:00
extras                                                                  | 3.4 kB  00:00:00
kubernetes/signature                                                    |  454 B  00:00:00
kubernetes/signature                                                    | 1.4 kB  00:00:10 !!!
updates                                                                 | 3.4 kB  00:00:00
(1/7): base/7/x86_64/group_gz                                           | 166 kB  00:00:00
(2/7): extras/7/x86_64/primary_db                                       | 156 kB  00:00:00
(3/7): base/7/x86_64/primary_db                                         | 6.0 MB  00:00:00
(4/7): updates/7/x86_64/primary_db                                      | 1.3 MB  00:00:00
(5/7): docker-ce-stable/x86_64/primary_db                               |  20 kB  00:00:00
(6/7): docker-ce-stable/x86_64/updateinfo                               |   55 B  00:00:01
(7/7): kubernetes/primary                                               |  42 kB  00:00:01
Determining fastest mirrors
 * base: mirror.nl.datapacket.com
 * extras: mirror.nl.datapacket.com
 * updates: mirror.denit.net
kubernetes                                                                             305/305
Resolving Dependencies
--> Running transaction check
---> Package wget.x86_64 0:1.14-18.el7 will be installed
--> Finished Dependency Resolution

Dependencies Resolved

===============================================================================================
 Package            Arch                 Version                      Repository          Size
===============================================================================================
Installing:
 wget               x86_64               1.14-18.el7                  base               547 k

Transaction Summary
===============================================================================================
Install  1 Package

Total download size: 547 k
Installed size: 2.0 M
Downloading packages:
wget-1.14-18.el7.x86_64.rpm                                             | 547 kB  00:00:00
Running transaction check
Running transaction test
Transaction test succeeded
Running transaction
  Installing : wget-1.14-18.el7.x86_64                                                     1/1
install-info: No such file or directory for /usr/share/info/wget.info.gz
  Verifying  : wget-1.14-18.el7.x86_64                                                     1/1

Installed:
  wget.x86_64 0:1.14-18.el7

Complete!
$HELM_HOME has been configured at /root/.helm.

Tiller (the Helm server-side component) has been upgraded to the current version.
Happy Helming!
etcdcluster.etcd.database.coreos.com/compose-etcd created
NAME                             READY     STATUS    RESTARTS   AGE
coredns-78fcdf6894-699fx         1/1       Running   0          6m
coredns-78fcdf6894-trslx         1/1       Running   0          6m
etcd-node1                       1/1       Running   0          5m
kube-apiserver-node1             1/1       Running   0          6m
kube-controller-manager-node1    1/1       Running   0          5m
kube-proxy-5gskp                 1/1       Running   0          6m
kube-proxy-5hbkb                 1/1       Running   0          6m
kube-proxy-lcsnz                 1/1       Running   0          5m
kube-scheduler-node1             1/1       Running   0          5m
tiller-deploy-85744d9bfb-bjw2f   1/1       Running   0          1m
weave-net-9vt2s                  2/2       Running   1          6m
weave-net-k87d7                  2/2       Running   0          6m
weave-net-nmmt5                  2/2       Running   0          5m
--2019-01-21 14:28:49--  https://github.com/docker/compose-on-kubernetes/releases/download/v0.4.18/installer-linux
Resolving github.com (github.com)... 140.82.118.3, 140.82.118.4
Connecting to github.com (github.com)|140.82.118.3|:443... connected.
HTTP request sent, awaiting response... 302 Found
Location: https://github-production-release-asset-2e65be.s3.amazonaws.com/158560458/e9a86500-15b2-11e9-8620-1eec5bf160e3?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=AKIAIWNJYAX4CSVEH53A%2F20190121%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Date=20190121T142850Z&X-Amz-Expires=300&X-Amz-Signature=bd4020beb0f68210e2a3cfa8ca8166dddcf1d1e4868737eb9ad83363cd39c660&X-Amz-SignedHeaders=host&actor_id=0&response-content-disposition=attachment%3B%20filename%3Dinstaller-linux&response-content-type=application%2Foctet-stream [following]
--2019-01-21 14:28:50--  https://github-production-release-asset-2e65be.s3.amazonaws.com/158560458/e9a86500-15b2-11e9-8620-1eec5bf160e3?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=AKIAIWNJYAX4CSVEH53A%2F20190121%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Date=20190121T142850Z&X-Amz-Expires=300&X-Amz-Signature=bd4020beb0f68210e2a3cfa8ca8166dddcf1d1e4868737eb9ad83363cd39c660&X-Amz-SignedHeaders=host&actor_id=0&response-content-disposition=attachment%3B%20filename%3Dinstaller-linux&response-content-type=application%2Foctet-stream
Resolving github-production-release-asset-2e65be.s3.amazonaws.com (github-production-release-asset-2e65be.s3.amazonaws.com)... 52.216.161.163
Connecting to github-production-release-asset-2e65be.s3.amazonaws.com (github-production-release-asset-2e65be.s3.amazonaws.com)|52.216.161.163|:443... connected.
HTTP request sent, awaiting response... 200 OK
Length: 28376064 (27M) [application/octet-stream]
Saving to: 'installer-linux'

100%[=====================================================>] 28,376,064  15.9MB/s   in 1.7s

2019-01-21 14:28:52 (15.9 MB/s) - 'installer-linux' saved [28376064/28376064]

INFO[0000] Checking installation state
INFO[0000] Install image with tag "v0.4.18" in namespace "compose"
INFO[0000] Api server: image: "docker/kube-compose-api-server:v0.4.18", pullPolicy: "Always"
INFO[0001] Controller: image: "docker/kube-compose-controller:v0.4.18", pullPolicy: "Always"
failed to find a Stack API version
error: the server doesn't have a resource type "stacks"
[node1 pwk]$ sh prepare-pwk.sh
Creating Compose Namespace...
Installing Helm...
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100 21.6M  100 21.6M    0     0  14.9M      0  0:00:01  0:00:01 --:--:-- 14.9M
Preparing Helm
linux-amd64/
linux-amd64/tiller
linux-amd64/helm
linux-amd64/LICENSE
linux-amd64/README.md
Creating tiller under kube-system namespace...
clusterrolebindings.rbac.authorization.k8s.io "tiller-cluster-rule" already exists
$HELM_HOME has been configured at /root/.helm.

Tiller (the Helm server-side component) has been upgraded to the current version.
Happy Helming!
 Tiller is still coming up...Please Wait
NAME                             READY     STATUS    RESTARTS   AGE
coredns-78fcdf6894-699fx         1/1       Running   0          7m
coredns-78fcdf6894-trslx         1/1       Running   0          7m
etcd-node1                       1/1       Running   0          6m
kube-apiserver-node1             1/1       Running   0          6m
kube-controller-manager-node1    1/1       Running   0          6m
kube-proxy-5gskp                 1/1       Running   0          6m
kube-proxy-5hbkb                 1/1       Running   0          7m
kube-proxy-lcsnz                 1/1       Running   0          6m
kube-scheduler-node1             1/1       Running   0          6m
tiller-deploy-85744d9bfb-bjw2f   1/1       Running   0          2m
weave-net-9vt2s                  2/2       Running   1          6m
weave-net-k87d7                  2/2       Running   0          7m
weave-net-nmmt5                  2/2       Running   0          6m
NAME            REVISION        UPDATED                         STATUS          CHART        APP VERSION     NAMESPACE
etcd-operator   1               Mon Jan 21 14:27:50 2019        DEPLOYED        etcd-operator-0.8.3    0.9.3           compose
Run: helm ls --all etcd-operator; to check the status of the release
Or run: helm del --purge etcd-operator; to delete it
Loaded plugins: fastestmirror, ovl
Loading mirror speeds from cached hostfile
 * base: mirror.nl.datapacket.com
 * extras: mirror.nl.datapacket.com
 * updates: mirror.denit.net
Package wget-1.14-18.el7.x86_64 already installed and latest version
Nothing to do
$HELM_HOME has been configured at /root/.helm.

Tiller (the Helm server-side component) has been upgraded to the current version.
Happy Helming!
etcdcluster.etcd.database.coreos.com/compose-etcd unchanged
NAME                             READY     STATUS    RESTARTS   AGE
coredns-78fcdf6894-699fx         1/1       Running   0          7m
coredns-78fcdf6894-trslx         1/1       Running   0          7m
etcd-node1                       1/1       Running   0          6m
kube-apiserver-node1             1/1       Running   0          7m
kube-controller-manager-node1    1/1       Running   0          7m
kube-proxy-5gskp                 1/1       Running   0          7m
kube-proxy-5hbkb                 1/1       Running   0          7m
kube-proxy-lcsnz                 1/1       Running   0          6m
kube-scheduler-node1             1/1       Running   0          6m
tiller-deploy-85744d9bfb-bjw2f   1/1       Running   0          2m
weave-net-9vt2s                  2/2       Running   1          7m
weave-net-k87d7                  2/2       Running   0          7m
weave-net-nmmt5                  2/2       Running   0          6m
--2019-01-21 14:30:05--  https://github.com/docker/compose-on-kubernetes/releases/download/v0.4.18/installer-linux
Resolving github.com (github.com)... 140.82.118.3, 140.82.118.4
Connecting to github.com (github.com)|140.82.118.3|:443... connected.
HTTP request sent, awaiting response... 302 Found
Location: https://github-production-release-asset-2e65be.s3.amazonaws.com/158560458/e9a86500-15b2-11e9-8620-1eec5bf160e3?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=AKIAIWNJYAX4CSVEH53A%2F20190121%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Date=20190121T143006Z&X-Amz-Expires=300&X-Amz-Signature=53d5f390f91b968a53219512c18b696e1a085cbbd59cdb953ca95bea1aca4d60&X-Amz-SignedHeaders=host&actor_id=0&response-content-disposition=attachment%3B%20filename%3Dinstaller-linux&response-content-type=application%2Foctet-stream [following]
--2019-01-21 14:30:06--  https://github-production-release-asset-2e65be.s3.amazonaws.com/158560458/e9a86500-15b2-11e9-8620-1eec5bf160e3?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=AKIAIWNJYAX4CSVEH53A%2F20190121%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Date=20190121T143006Z&X-Amz-Expires=300&X-Amz-Signature=53d5f390f91b968a53219512c18b696e1a085cbbd59cdb953ca95bea1aca4d60&X-Amz-SignedHeaders=host&actor_id=0&response-content-disposition=attachment%3B%20filename%3Dinstaller-linux&response-content-type=application%2Foctet-stream
Resolving github-production-release-asset-2e65be.s3.amazonaws.com (github-production-release-asset-2e65be.s3.amazonaws.com)... 52.216.233.59
Connecting to github-production-release-asset-2e65be.s3.amazonaws.com (github-production-release-asset-2e65be.s3.amazonaws.com)|52.216.233.59|:443... connected.
HTTP request sent, awaiting response... 200 OK
Length: 28376064 (27M) [application/octet-stream]
Saving to: 'installer-linux.1'

100%[=====================================================>] 28,376,064  16.3MB/s   in 1.7s

2019-01-21 14:30:08 (16.3 MB/s) - 'installer-linux.1' saved [28376064/28376064]

INFO[0000] Checking installation state
INFO[0001] Compose version v0.4.18 is already installed in namespace "compose" with the same settings
compose.docker.com/v1beta1
compose.docker.com/v1beta2
Waiting for the stack to be stable and running...
db1: Pending            [pod status: 0/2 ready, 2/2 pending, 0/2 failed]
web1: Pending           [pod status: 0/3 ready, 3/3 pending, 0/3 failed]
db1: Ready              [pod status: 1/2 ready, 1/2 pending, 0/2 failed]
web1: Ready             [pod status: 1/3 ready, 2/3 pending, 0/3 failed]

Stack hellostack is stable and running

NAME         SERVICES   PORTS        STATUS                            CREATED AT
hellostack   2          web1: 8082   Progressing (Stack is starting)   2019-01-21T14:30:10Z

Verifying the Stack

[node1 pwk]$ kubectl get stack
NAME         SERVICES   PORTS        STATUS                         CREATED AT
hellostack   2          web1: 8082   Available (Stack is started)   2019-01-21T14:30:10Z

References:

  • https://github.com/docker/compose-on-kubernetes/issues/35
  • https://github.com/collabnix/compose-on-kubernetes/tree/master/scripts/pwk

Clap

(2)