From 924174d4aeb12e1c4061d3f6d019034443da580f Mon Sep 17 00:00:00 2001 From: Erki Aas Date: Wed, 2 Nov 2022 12:58:44 +0200 Subject: [PATCH] Initial commit --- .dockerignore | 6 +++++ .gitignore | 6 +++++ Dockerfile | 20 ++++++++++++++ README.md | 22 ++++++++++++++++ k8s/dev/application.yaml | 56 ++++++++++++++++++++++++++++++++++++++++ k8s/staging/.gitkeep | 0 package.json | 21 +++++++++++++++ server.js | 14 ++++++++++ skaffold.yaml | 34 ++++++++++++++++++++++++ 9 files changed, 179 insertions(+) create mode 100644 .dockerignore create mode 100644 .gitignore create mode 100644 Dockerfile create mode 100644 README.md create mode 100644 k8s/dev/application.yaml create mode 100644 k8s/staging/.gitkeep create mode 100644 package.json create mode 100644 server.js create mode 100644 skaffold.yaml diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 0000000..984010f --- /dev/null +++ b/.dockerignore @@ -0,0 +1,6 @@ +./node_modules +./build +.git +*.md +.gitignore +.idea/ diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..f8136aa --- /dev/null +++ b/.gitignore @@ -0,0 +1,6 @@ +.vscode +.idea/ +.env +node_nodules/ +.kpt-pipeline/ + diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..11a7c9c --- /dev/null +++ b/Dockerfile @@ -0,0 +1,20 @@ +# pull official node image +FROM node AS dev + +# define /app as working directory +WORKDIR /app + +# copy package.json and package-lock.json to /app +COPY package.json /app +COPY package-lock.json /app + +# install node dependencies +RUN npm install +COPY . /app + +# launch node server +ENTRYPOINT npm run dev + +# production +FROM dev AS prod +ENTRYPOINT npm run start \ No newline at end of file diff --git a/README.md b/README.md new file mode 100644 index 0000000..15ec862 --- /dev/null +++ b/README.md @@ -0,0 +1,22 @@ +# Node.js and skaffold example +## How to get going? +1. Change `image` URLs in `skaffold.yaml` according to your desired image registry and image name +2. Change `ingress` definition in `k8s/dev/application.yml`: + - Traefik's URL `external-dns.alpha.kubernetes.io/target:` + - `- host:` +3. Attempt to run Skaffold: + - `skaffold dev --namespace [--kube-context ]` +4. When working and finished, you can leave the application running: + - copy `k8s/dev/application.yml` to `k8s/staging/` + - run `skaffold run` with the same parameters as earlier + +## How to use harbor.codemowers.eu +1. Log in in web browser +2. Create a project or use one destined for you +3. Make it public in the `Configuration` tab so that Kubernetes can easily download the image (do not do this for actual production applications) +4. Create a robot account in `Robot Accounts tab` + - Name the account in some way, give it some expiring date + - Keep the modal with login open + - Run `docker login --username --password harbor.codemowers.eu`. + **Beware!** Harbor uses `$` character in the username which bash and other shells would interpret as start of an variable. + Escape it with `\ `, like so: `docker login --username robot\$eaas+docker --password ...` diff --git a/k8s/dev/application.yaml b/k8s/dev/application.yaml new file mode 100644 index 0000000..b5cf6bf --- /dev/null +++ b/k8s/dev/application.yaml @@ -0,0 +1,56 @@ +--- +apiVersion: networking.k8s.io/v1 +kind: Ingress +metadata: + name: node-skaffold-example + annotations: + kubernetes.io/ingress.class: traefik + traefik.ingress.kubernetes.io/router.entrypoints: websecure + traefik.ingress.kubernetes.io/router.tls: "true" + external-dns.alpha.kubernetes.io/target: traefik-c7ra9.codemowers.ee +spec: + rules: + - host: hello-c7ra9.codemowers.ee + http: + paths: + - pathType: Prefix + path: "/" + backend: + service: + name: node-skaffold-example + port: + number: 8080 + tls: + - hosts: + - "*.codemowers.ee" +--- +apiVersion: v1 +kind: Service +metadata: + name: node-skaffold-example +spec: + type: ClusterIP + selector: + app: node-skaffold-example + ports: + - protocol: TCP + port: 8080 +--- +apiVersion: apps/v1 +kind: Deployment +metadata: + name: node-skaffold-example +spec: + selector: + matchLabels: + app: node-skaffold-example + template: + metadata: + labels: + app: node-skaffold-example + spec: + containers: + - name: node-skaffold-example + image: harbor.codemowers.eu/eaas/node-skaffold-example + ports: + - containerPort: 8080 diff --git a/k8s/staging/.gitkeep b/k8s/staging/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/package.json b/package.json new file mode 100644 index 0000000..919f3a8 --- /dev/null +++ b/package.json @@ -0,0 +1,21 @@ +{ + "name": "app", + "version": "1.0.0", + "description": "", + "main": "server.js", + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1", + "dev": "nodemon server.js -e ejs,js,css,html,jpg,png,scss", + "prod": "node.js server.js" + }, + "keywords": [], + "author": "", + "license": "ISC", + "dependencies": { + "cors": "^2.8.5", + "express": "^4.17.2", + }, + "devDependencies": { + "nodemon": "^2.0.20" + } +} diff --git a/server.js b/server.js new file mode 100644 index 0000000..3e11e52 --- /dev/null +++ b/server.js @@ -0,0 +1,14 @@ +const http = require('http'); + +const host = '0.0.0.0'; +const port = 8080; + +const server = http.createServer((req, res) => { + res.statusCode = 200; + res.setHeader('Content-Type', 'text/plain'); + res.end('Hello World!'); +}); + +server.listen(port, host, () => { + console.log('Web server running at http://%s:%s',host,port ); +}); diff --git a/skaffold.yaml b/skaffold.yaml new file mode 100644 index 0000000..86d23c9 --- /dev/null +++ b/skaffold.yaml @@ -0,0 +1,34 @@ +apiVersion: skaffold/v3alpha1 +kind: Config +metadata: + name: node-skaffold-example + +build: + artifacts: + - image: harbor.codemowers.eu/eaas/node-skaffold-example + docker: + dockerfile: Dockerfile + +deploy: + kubectl: {} + +manifests: + rawYaml: + - k8s/staging/application.yaml + +profiles: + - name: dev + activation: + - command: dev + build: + artifacts: + - image: harbor.codemowers.eu/eaas/node-skaffold-example + docker: + target: dev + sync: + manual: + - src: '**/*.js' + dest: . + manifests: + rawYaml: + - k8s/dev/application.yaml