From 6fe326b68012b0eae5c951ab21d55b0ccfda84f9 Mon Sep 17 00:00:00 2001 From: Bruce Ashfield Date: Thu, 25 Nov 2021 11:53:13 -0500 Subject: demo: add flask and k3s deployment files To enable demonstrations of application container builds, and deployment to k*s clusters, we introduce a simple recipes-demo/ structure with a sample flask application and deployment yaml. i.e. ensure that "helloworld-flask-deploy" is installed on your image, and then: % kubectl apply -f /etc/flask-app.yaml % kubectl label pods zeddii-pod new-label=yoctorule % kubectl expose pod zeddii-pod --port=9000 --target-port=9000 --type=LoadBalancer --name=my-service Signed-off-by: Bruce Ashfield --- .../helloworld-flask/helloworld-flask/flask-app | 21 +++++++++++ .../helloworld-flask/flask-app-service.yaml | 32 ++++++++++++++++ .../helloworld-flask/flask-app.yaml | 12 ++++++ .../helloworld-flask/helloworld-flask_0.1.bb | 44 ++++++++++++++++++++++ recipes-demo/images/app-container.bb | 10 +++++ 5 files changed, 119 insertions(+) create mode 100755 recipes-demo/helloworld-flask/helloworld-flask/flask-app create mode 100644 recipes-demo/helloworld-flask/helloworld-flask/flask-app-service.yaml create mode 100644 recipes-demo/helloworld-flask/helloworld-flask/flask-app.yaml create mode 100644 recipes-demo/helloworld-flask/helloworld-flask_0.1.bb create mode 100644 recipes-demo/images/app-container.bb diff --git a/recipes-demo/helloworld-flask/helloworld-flask/flask-app b/recipes-demo/helloworld-flask/helloworld-flask/flask-app new file mode 100755 index 00000000..15ecde93 --- /dev/null +++ b/recipes-demo/helloworld-flask/helloworld-flask/flask-app @@ -0,0 +1,21 @@ +#!/usr/bin/python3 + +# Example flask application for containerization +# +# Copyright (C) 2021 Bruce Ashfield +# License: MIT (see COPYING.MIT at the root of the repository for terms) + +from flask import Flask + +app = Flask(__name__) + +@app.route('/yocto/', methods=['GET', 'POST']) +def welcome(): + return "Hello from Yocto!" + +@app.route('/oe/', methods=['GET', 'POST']) +def welcometooe(): + return "Hello from OpenEmbedded!" + +if __name__ == '__main__': + app.run(host='0.0.0.0', port=9000) diff --git a/recipes-demo/helloworld-flask/helloworld-flask/flask-app-service.yaml b/recipes-demo/helloworld-flask/helloworld-flask/flask-app-service.yaml new file mode 100644 index 00000000..f2c8bbe2 --- /dev/null +++ b/recipes-demo/helloworld-flask/helloworld-flask/flask-app-service.yaml @@ -0,0 +1,32 @@ +apiVersion: apps/v1 +kind: Deployment +metadata: + name: @NAME@ +spec: + selector: + matchLabels: + app: @APPNAME@ + replicas: 1 + template: + metadata: + labels: + app: @APPNAME@ + spec: + containers: + - name: @CONTAINERNAME@ + image: @CONTAINERIMAGE@ + ports: + - containerPort: @CONTAINERPORT@ +--- +apiVersion: v1 +kind: Service +metadata: + name: yocto-flask-service +spec: + ports: + - port: @EXTERNALPORT@ + targetPort: @CONTAINERPORT@ + name: http + selector: + app: @APPNAME@ + diff --git a/recipes-demo/helloworld-flask/helloworld-flask/flask-app.yaml b/recipes-demo/helloworld-flask/helloworld-flask/flask-app.yaml new file mode 100644 index 00000000..85c0362e --- /dev/null +++ b/recipes-demo/helloworld-flask/helloworld-flask/flask-app.yaml @@ -0,0 +1,12 @@ +apiVersion: v1 +kind: Pod +metadata: + name: @NAME@ +spec: + containers: + - name: @CONTAINERNAME@ + image: @CONTAINERIMAGE@ + ports: + - containerPort: @CONTAINERPORT@ + + diff --git a/recipes-demo/helloworld-flask/helloworld-flask_0.1.bb b/recipes-demo/helloworld-flask/helloworld-flask_0.1.bb new file mode 100644 index 00000000..896e45fd --- /dev/null +++ b/recipes-demo/helloworld-flask/helloworld-flask_0.1.bb @@ -0,0 +1,44 @@ +DESCRIPTION = "Demo flask application" +HOMEPAGE = "https://yoctoproject.org" +LICENSE = "MIT" +LIC_FILES_CHKSUM = "file://${COREBASE}/meta/COPYING.MIT;md5=3da9cfbcb788c80a0384361b4de20420" + +SRC_URI = "file://flask-app \ + file://flask-app.yaml \ + file://flask-app-service.yaml" + +DEPLOY_TYPE ?= "pod" + +NAME ?= "demo" +APPNAME ?= "yocto-app" +CONTAINERNAME ?= "yocto-container" +CONTAINERIMAGE ?= "zeddii/app-container:latest" +CONTAINERPORT ?= "9000" +EXTERNALPORT ?= "10000" + +do_install() { + + for tgt in flask-app.yaml flask-app-service.yaml; do + sed -i 's%\@NAME\@%${NAME}%g' ${WORKDIR}/$tgt + sed -i 's%\@APPNAME\@%${APPNAME}%g' ${WORKDIR}/$tgt + sed -i 's%\@CONTAINERNAME\@%${CONTAINERNAME}%g' ${WORKDIR}/$tgt + sed -i 's%\@CONTAINERIMAGE\@%${CONTAINERIMAGE}%g' ${WORKDIR}/$tgt + sed -i 's%\@CONTAINERPORT\@%${CONTAINERPORT}%g' ${WORKDIR}/$tgt + sed -i 's%\@EXTERNALPORT\@%${EXTERNALPORT}%g' ${WORKDIR}/$tgt + done + + install -d ${D}${bindir}/ + install -m 755 ${WORKDIR}/flask-app ${D}${bindir}/ + + install -d ${D}${sysconfdir}/deploy + install -m 644 ${WORKDIR}/flask-app.yaml ${D}${sysconfdir}/ + install -m 644 ${WORKDIR}/flask-app-service.yaml ${D}${sysconfdir}/ +} + +RDEPENDS:${PN} += "python3-core python3-flask" + +PACKAGES:prepend = "${PN}-deploy " +FILES:${PN}-deploy = "${sysconfdir}/*" + +# this rdepends should be conditional on a debug PACKAGECONFIG +# RDEPENDS:${PN} += "busybox" diff --git a/recipes-demo/images/app-container.bb b/recipes-demo/images/app-container.bb new file mode 100644 index 00000000..c8798cf0 --- /dev/null +++ b/recipes-demo/images/app-container.bb @@ -0,0 +1,10 @@ +SUMMARY = "Basic Application container image" +LICENSE = "MIT" +LIC_FILES_CHKSUM = "file://${COREBASE}/meta/COPYING.MIT;md5=3da9cfbcb788c80a0384361b4de20420" + +include container-base.bb + +OCI_IMAGE_ENTRYPOINT = "/usr/bin/flask-app" +CONTAINER_SHELL = "busybox" + +IMAGE_INSTALL:append = "helloworld-flask" -- cgit v1.2.3-54-g00ecf