Skip to content
Snippets Groups Projects
Commit d8c37d61 authored by PERDEREAU Eloi's avatar PERDEREAU Eloi
Browse files

voting-services/ now has code for {vote,worker,result,nginx,seed-data}

parent 4ad641a7
No related branches found
No related tags found
No related merge requests found
Showing
with 56 additions and 286 deletions
......@@ -8,7 +8,7 @@ services:
# image: europe-west9-docker.pkg.dev/nuage-k8s/login-nuage-images/vote
# image: eloip13009/vote
build:
context: ./vote
context: ./voting-services/vote
dockerfile: Dockerfile
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:5000"]
......@@ -27,7 +27,7 @@ services:
# image: europe-west9-docker.pkg.dev/nuage-k8s/login-nuage-images/vote
# image: eloip13009/vote
build:
context: ./vote
context: ./voting-services/vote
dockerfile: Dockerfile
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:5000"]
......@@ -46,13 +46,13 @@ services:
# image: europe-west9-docker.pkg.dev/nuage-k8s/login-nuage-images/result
# image: eloip13009/result
build:
context: ./result
context: ./voting-services/result
depends_on:
db:
condition: service_healthy
ports:
- "5050:80"
- "127.0.0.1:9229:9229"
- "9229:9229"
networks:
- front-tier
- back-tier
......@@ -61,10 +61,7 @@ services:
# image: europe-west9-docker.pkg.dev/nuage-k8s/login-nuage-images/worker
# image: eloip13009/worker
build:
context: ./worker
environment:
PG_HOST: "db"
REDIS_HOST: "redis"
context: ./voting-services/worker
depends_on:
redis:
condition: service_healthy
......@@ -77,9 +74,6 @@ services:
image: redis:alpine # here is no dockerfile
# image: europe-west9-docker.pkg.dev/nuage-k8s/login-nuage-images/redis-hs
# image: eloip13009/redis-hc
# build:
# context: ./healthchecks
# dockerfile: Dockerfile-redis-hc
healthcheck:
test: /healthchecks/redis.sh
interval: "5s"
......@@ -90,16 +84,10 @@ services:
db:
image: postgres:15-alpine # here is no dockerfile
# image: europe-west9-docker.pkg.dev/nuage-k8s/login-nuage-images/postgres-hs
# image: eloip13009/postgres-hc
# build:
# context: ./healthchecks
# dockerfile: Dockerfile-postgres-hc
healthcheck:
test: /healthchecks/postgres.sh
interval: "5s"
environment:
POSTGRES_USER: "postgres"
POSTGRES_PASSWORD: "postgres"
volumes:
- "db-data:/var/lib/postgresql/data"
......@@ -109,7 +97,7 @@ services:
nginx:
build:
context: ./nginx
context: ./voting-services/nginx
ports:
- "8000:8000"
depends_on:
......@@ -124,11 +112,11 @@ services:
# image: europe-west9-docker.pkg.dev/nuage-k8s/login-nuage-images/seed-data
# image: eloip13009/seed-data:vote5000
build:
context: ./seed-data
context: ./voting-services/seed-data
dockerfile: Dockerfile
environment:
SEED_HOST: "nginx"
SEED_PORT: 8000
TARGET_HOST: "nginx"
TARGET_PORT: 8000
depends_on:
- nginx
networks:
......
FROM postgres:15-alpine
WORKDIR /healthchecks
COPY postgres.sh .
HEALTHCHECK --interval=5s \
CMD /healthchecks/postgres.sh
FROM redis:alpine
WORKDIR /healthchecks
COPY redis.sh .
HEALTHCHECK --interval=5s \
CMD /healthchecks/redis.sh
# apiVersion: networking.k8s.io/v1
# kind: IngressClass
# metadata:
# labels:
# app.kubernetes.io/component: admission-webhook
# app.kubernetes.io/instance: ingress-nginx
# app.kubernetes.io/name: ingress-nginx
# name: nginx
# spec:
# controller: k8s.io/ingress-nginx
# apiVersion: apps/v1
# kind: StatefulSet
# metadata:
# labels:
# app: pgsql
# name: pgsql-statefulset
# spec:
# serviceName: pgsql
# replicas: 1
# selector:
# matchLabels:
# app: pgsql
# template:
# metadata:
# labels:
# app: pgsql
# spec:
# volumes:
# - name: db-data
# # emptyDir: {}
# persistentVolumeClaim:
# claimName: db-data-claim
# containers:
# - image: postgres:15-alpine
# name: postgres-container
# env:
# - name: POSTGRES_USER
# value: postgres
# - name: POSTGRES_PASSWORD
# value: postgres
# ports:
# - containerPort: 5432
# name: postgres-port
# volumeMounts:
# - mountPath: /var/lib/postgresql/data
# name: db-data
# subPath: data
# apiVersion: apps/v1
# kind: Deployment
# metadata:
# labels:
# app: redis
# name: redis-deplt
# spec:
# replicas: 1
# selector:
# matchLabels:
# app: redis
# template:
# metadata:
# labels:
# app: redis
# spec:
# containers:
# - image: redis:alpine
# # - image: eloip13009/redis-hc
# # - image: europe-west9-docker.pkg.dev/nuage-k8s/login-nuage-images/redis-hs
# name: redis-container
# ports:
# - containerPort: 6379
# name: redis-port
# livenessProbe:
# exec:
# command:
# - /healthchecks/redis.sh
# periodSeconds: 15
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
app: redis
name: redis-deplt
spec:
replicas: 1
selector:
matchLabels:
app: redis
template:
metadata:
labels:
app: redis
spec:
containers:
- image: redis:alpine
# - image: eloip13009/redis-hc
# - image: europe-west9-docker.pkg.dev/nuage-k8s/login-nuage-images/redis-hs
name: redis-container
ports:
- containerPort: 6379
name: redis-port
livenessProbe:
exec:
command:
- /healthchecks/redis.sh
periodSeconds: 15
apiVersion: v1
kind: Endpoints
metadata:
name: redis # Must be equal to Service name for automatic mapping
subsets:
- addresses:
- ip: "10.162.0.10" # OpenStack external floating IP
ports:
- port: 6379
# apiVersion: discovery.k8s.io/v1
# kind: EndpointSlice
# metadata:
# name: redis
# labels:
# kubernetes.io/service-name: redis
# addressType: IPv4
# ports:
# - port: 6379
# endpoints:
# - addresses:
# - ip: "10.162.0.6" # external VM IP
......@@ -11,6 +11,5 @@ spec:
port: 6379
targetPort: 6379
protocol: TCP
# Do not select anything if Redis is on OpenStack, the 'redis' Endpoint will take over
# selector:
# app: redis
selector:
app: redis
......@@ -11,8 +11,8 @@ spec:
- image: europe-west9-docker.pkg.dev/tuto-terraform-406010/voting-app-repo/seed-data
name: seed-job
env:
- name: SEED_HOST
- name: TARGET_HOST
value: "vote"
- name: SEED_PORT
- name: TARGET_PORT
value: "5000"
restartPolicy: Never
......@@ -15,8 +15,8 @@ spec:
app: vote
spec:
containers:
- image: eloip13009/vote
# - image: europe-west9-docker.pkg.dev/tuto-terraform-406010/voting-app-repo/vote
# - image: eloip13009/vote
- image: europe-west9-docker.pkg.dev/tuto-terraform-406010/voting-app-repo/vote
name: vote-container
ports:
- containerPort: 5000
......
# apiVersion: networking.k8s.io/v1
# kind: Ingress
# metadata:
# name: vote-ingress
# annotations:
# # nginx.ingress.kubernetes.io/use-regex: "true"
# nginx.ingress.kubernetes.io/add-base-url: "true"
# nginx.ingress.kubernetes.io/rewrite-target: /$2
# spec:
# ingressClassName: nginx
# defaultBackend:
# service:
# name: ingress-nginx-controller
# port:
# number: 80
# rules:
# - http:
# paths:
# - path: "/vote(/|$)(.*)"
# pathType: ImplementationSpecific
# backend:
# service:
# name: vote
# port:
# name: vote-svc-port
# - path: "/result(/|$)(.*)"
# pathType: ImplementationSpecific
# backend:
# service:
# name: result
# port:
# name: result-svc-port
......@@ -18,6 +18,3 @@ spec:
# - image: eloip13009/worker
- image: europe-west9-docker.pkg.dev/tuto-terraform-406010/voting-app-repo/worker
name: worker-container
env:
- name: REDIS_PASSWORD
value: osef
#!/usr/bin/env bash
# Install redis via Apt packages
DEBIAN_FRONTEND=noninteractive apt-get update -q
DEBIAN_FRONTEND=noninteractive apt-get install -q -y redis
# Configure redis to accept connections from all IPs, and add a password
sed -e '/^bind/s/bind.*/bind 0.0.0.0/' -i /etc/redis/redis.conf
sed -e '/# requirepass/s/.*/requirepass ${password}/' -i /etc/redis/redis.conf
# Restart redis service to reload the configuration
systemctl restart redis-server.service
# Define a base stage that uses the official python runtime base image
FROM python:3.11-slim AS base
# Add curl for healthcheck
RUN apt-get update && \
apt-get install -y --no-install-recommends curl && \
rm -rf /var/lib/apt/lists/*
# Set the application directory
WORKDIR /usr/local/app
# Install our requirements.txt
COPY requirements.txt ./requirements.txt
RUN pip install --no-cache-dir -r requirements.txt
# Define the final stage that will bundle the application for production
FROM base AS final
# Copy our code from the current folder to the working directory inside the container
COPY . .
# Make port 5000 available for links and/or publish. Really??
EXPOSE 5000
# Define our command to be run when launching the container
#CMD ["gunicorn", "app:app", "-b", "0.0.0.0:80", "--log-file", "-", "--access-logfile", "-", "--workers", "4", "--keep-alive", "0"]
CMD ["python", "app.py"]
# Define a base stage that uses the official python runtime base image
FROM python:3.11-slim AS base
# Add curl for healthcheck
RUN apt-get update && \
apt-get install -y --no-install-recommends curl && \
rm -rf /var/lib/apt/lists/*
# https://docs.docker.com/reference/dockerfile/#healthcheck
HEALTHCHECK --interval=15s --timeout=5s --retries=2 --start-period=5s \
CMD curl -f http://localhost:5000 || exit 1
# Set the application directory
WORKDIR /usr/local/app
# Install our requirements.txt
COPY requirements.txt ./requirements.txt
RUN pip install --no-cache-dir -r requirements.txt
# Define the final stage that will bundle the application for production
FROM base AS final
# Copy our code from the current folder to the working directory inside the container
COPY . .
RUN mv app-redispw.py app.py
# Make port 5000 available for links and/or publish. Really??
EXPOSE 5000
# Define our command to be run when launching the container
#CMD ["gunicorn", "app:app", "-b", "0.0.0.0:80", "--log-file", "-", "--access-logfile", "-", "--workers", "4", "--keep-alive", "0"]
CMD ["python", "app.py"]
File deleted
from flask import Flask, render_template, request, make_response, g
from redis import Redis
import os
import socket
import random
import json
import logging
option_a = os.getenv('OPTION_A', "Cats")
option_b = os.getenv('OPTION_B', "Dogs")
hostname = socket.gethostname()
app = Flask(__name__)
gunicorn_error_logger = logging.getLogger('gunicorn.error')
app.logger.handlers.extend(gunicorn_error_logger.handlers)
app.logger.setLevel(logging.INFO)
def get_redis():
if not hasattr(g, 'redis'):
g.redis = Redis(host="redis", password="osef", db=0, socket_timeout=5)
return g.redis
@app.route("/", methods=['POST','GET'])
def hello():
voter_id = request.cookies.get('voter_id')
if not voter_id:
voter_id = hex(random.getrandbits(64))[2:-1]
vote = None
if request.method == 'POST':
redis = get_redis()
vote = request.form['vote']
app.logger.info('Received vote for %s', vote)
data = json.dumps({'voter_id': voter_id, 'vote': vote})
redis.rpush('votes', data)
resp = make_response(render_template(
'index.html',
option_a=option_a,
option_b=option_b,
hostname=hostname,
vote=vote,
))
resp.set_cookie('voter_id', voter_id)
return resp
if __name__ == "__main__":
app.run(host='0.0.0.0', port=5000, debug=True, threaded=True)
File moved
File moved
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment