diff --git a/https/Dockerfile b/https/Dockerfile new file mode 100644 index 0000000000000000000000000000000000000000..6c81094a90f775811725551166bcf1f27ade5330 --- /dev/null +++ b/https/Dockerfile @@ -0,0 +1,7 @@ +FROM python:3.10-slim +WORKDIR /api-flask +COPY requirements.txt /api-flask/ +RUN pip3 install --upgrade pip && pip install --no-cache-dir -r requirements.txt +COPY server.flask.py /api-flask/ +EXPOSE 443 +CMD ["python3", "server.flask.py"] diff --git a/https/ingress.sh b/https/ingress.sh new file mode 100644 index 0000000000000000000000000000000000000000..08bc2abd29a79af660e04075dc4586dc120ac54f --- /dev/null +++ b/https/ingress.sh @@ -0,0 +1,43 @@ +helm upgrade --install ingress-nginx ingress-nginx \ + --repo https://kubernetes.github.io/ingress-nginx \ + --namespace ingress-nginx --create-namespace + +kubectl wait --namespace ingress-nginx \ + --for=condition=ready pod \ + --selector=app.kubernetes.io/component=controller \ + --timeout=120s + +IP=$(kubectl get service ingress-nginx-controller --namespace=ingress-nginx -o jsonpath='{.status.loadBalancer.ingress[0].ip}') + +echo $IP + +HOSTNAME=demo-nginx.default.svc +#openssl req -newkey rsa:2048 -nodes -keyout server.key -subj "/C=FR/L=Sophia Antipolis/O=SLICES-RI/CN=$HOSTNAME" -out server.csr +#openssl x509 -req -extfile <(printf "subjectAltName=DNS:$HOSTNAME") -days 365 -in server.csr -CA /etc/kubernetes/pki/ca.crt -CAkey /etc/kubernetes/pki/ca.key -CAcreateserial -out server.crt +#kubectl create secret tls $HOSTNAME-secret --cert=server.crt --key=server.key + +cat << EOF > ingress-demo.yaml +apiVersion: networking.k8s.io/v1 +kind: Ingress +metadata: + name: demo-nginx + annotations: + nginx.ingress.kubernetes.io/rewrite-target: / +spec: + ingressClassName: nginx + tls: + - hosts: + - www.demo.io # The hostname for HTTPS + secretName: $HOSTNAME-secret # TLS secret for SSL termination + rules: + - host: www.demo.io + http: + paths: + - backend: + service: + name: demo-nginx + port: + number: 5000 + path: / + pathType: Prefix +EOF diff --git a/https/launch.sh b/https/launch.sh index e7af87f7458f8185108bca5ef6d1e9686603a0d6..19bbc90d15f9f3c9dc39ccd79667ebad943b8a85 100755 --- a/https/launch.sh +++ b/https/launch.sh @@ -1,7 +1,9 @@ #!/usr/bin/bash -#openssl req -newkey rsa:2048 -nodes -keyout server.key -subj "/C=CN/ST=GD/L=SZ/O=Acme, Inc./CN=172.29.7.11" -out server.csr -#openssl x509 -req -extfile <(printf "subjectAltName=DNS:172.29.7.11,IP:172.29.7.11") -days 365 -in server.csr -CA /etc/kubernetes/pki/ca.crt -CAkey /etc/kubernetes/pki/ca.key -CAcreateserial -out server.crt -python3 -m venv . -source ./bin/activate -pip3 install -r requirements.txt -python3/server.flask.py +# openssl req -newkey rsa:2048 -nodes -keyout server.key -subj "/C=FR/L=Sophia Antipolis/O=SLICES-RI/CN=$HOSTNAME" -out server.csr +# openssl x509 -req -extfile <(printf "subjectAltName=DNS:$HOSTNAME") -days 365 -in server.csr -CA /etc/kubernetes/pki/ca.crt -CAkey /etc/kubernetes/pki/ca.key -CAcreateserial -out server.crt +# kubectl create secret generic tls-secret --from-file=server.key --from-file=server.crt + +#python3 -m venv . +#source ./bin/activate +#pip3 install -r requirements.txt +#python3/server.flask.py diff --git a/https/server.flask.py b/https/server.flask.py index 3f206b790bf73c1e171b77fe9b9901a3e7bbef0b..19f4a6d0862cdb13cd1afe489b04211a4e4fd6dd 100644 --- a/https/server.flask.py +++ b/https/server.flask.py @@ -1,3 +1,7 @@ +# openssl req -newkey rsa:2048 -nodes -keyout server.key -subj "/C=CN/ST=GD/L=SZ/O=Acme, Inc./CN=172.29.7.11" -out server.csr +# openssl x509 -req -extfile <(printf "subjectAltName=DNS:172.29.7.11,IP:172.29.7.11") -days 365 -in server.csr -CA /etc/kubernetes/pki/ca.crt -CAkey /etc/kubernetes/pki/ca.key -CAcreateserial -out server.crt +# kubectl create secret generic tls-secret --from-file=server.key --from-file=server.crt + # openssl req -newkey rsa:2048 -nodes -keyout server.key -subj "/C=CN/ST=GD/L=SZ/O=Acme, Inc./CN=172.29.7.11" -out server.csr # openssl x509 -req -extfile <(printf "subjectAltName=DNS:172.29.7.11,IP:172.29.7.11") -days 365 -in server.csr -CA /etc/kubernetes/pki/ca.crt -CAkey /etc/kubernetes/pki/ca.key -CAcreateserial -out server.crt # python3 -m venv ~/https @@ -5,6 +9,48 @@ # pip3 install -r requirements.txt from flask import Flask, request, jsonify +import argparse +import os + +def check_environment_variables(): + """ + Checks and returns the 'KEY', 'CERTIFICATE', and 'PORT' values. + + - Both 'KEY' and 'CERTIFICATE' are optional environment variables, but if one is set, + both must be defined. If only one is set without the other, a ValueError is raised. + - 'PORT' can be provided via an environment variable. Defaults to 80 if 'KEY' is not defined, + and 443 if 'KEY' is defined, if the environment variable is not set. + + Returns: + tuple: A tuple containing the values of 'KEY', 'CERTIFICATE', and 'PORT'. If neither + 'KEY' nor 'CERTIFICATE' is set, both values will be None. + + Raises: + ValueError: If one of 'KEY' or 'CERTIFICATE' is set but the other is not. + """ + key = os.getenv('KEY') + certificate = os.getenv('CERTIFICATE') + + if key is not None or certificate is not None: + if not (key and certificate): + raise ValueError("Both 'KEY' and 'CERTIFICATE' must be defined if one is set.") + + # Determine port value from environment variable + port_env = os.getenv('PORT') + if port_env is not None: + try: + port = int(port_env) + except ValueError: + raise ValueError("Environment variable 'PORT' must be an integer.") + else: + # Default port values based on the presence of 'key' + if key is not None: + port = 443 + else: + port = 80 + + return key, certificate, port + app = Flask(__name__) @app.route("/namespace", methods = ['GET', 'POST']) @@ -69,4 +115,12 @@ def hello(): return msg if __name__ == "__main__": - app.run(host='0.0.0.0', port=8000, ssl_context=('server.crt', 'server.key')) + try: + key, certificate, port = check_environment_variables() + except ValueError as e: + print(f"Error: {e}") + + if key is None: + app.run(host='0.0.0.0', port=port) + else: + app.run(host='0.0.0.0', port=port, ssl_context=(certificate, key)) diff --git a/k8s/service.yaml b/k8s/service.yaml new file mode 100644 index 0000000000000000000000000000000000000000..f16326206e4667e6fa864a3bff42f72d6fb77f65 --- /dev/null +++ b/k8s/service.yaml @@ -0,0 +1,50 @@ +apiVersion: v1 +kind: Pod +metadata: + name: demo-nginx + labels: + app.kubernetes.io/name: proxy +spec: + containers: + - name: demo-nginx + image: 172.29.7.10:5001/k8s-webhook + env: + - name: KEY + value: "/server.key" + - name: CERTIFICATE + value: "/server.crt" + volumeMounts: + - name: secret-volume + mountPath: "/server.key" + subPath: server.key + readOnly: true + - name: secret-volume + mountPath: "/server.crt" + subPath: server.crt + readOnly: true + ports: + - containerPort: 443 + name: http-web-svc + volumes: + - name: secret-volume + secret: + secretName: tls-secret + items: + - key: server.key + path: server.key + - key: server.crt + path: server.crt + +--- +apiVersion: v1 +kind: Service +metadata: + name: demo-nginx +spec: + selector: + app.kubernetes.io/name: proxy + ports: + - name: name-of-service-port + protocol: TCP + port: 443 + targetPort: http-web-svc diff --git a/k8s/webhook_service.sh b/k8s/webhook_service.sh new file mode 100644 index 0000000000000000000000000000000000000000..760ef9f695f0a5fb80cc1908fd9dbbd097989b06 --- /dev/null +++ b/k8s/webhook_service.sh @@ -0,0 +1,24 @@ +cat <<EOF > webhook.yaml +apiVersion: admissionregistration.k8s.io/v1 +kind: MutatingWebhookConfiguration +metadata: + name: my-webhook +webhooks: +- name: www.demo.io + clientConfig: + service: + namespace: default + name: demo-nginx + path: /namespace + caBundle: $(sudo cat /etc/kubernetes/pki/ca.crt | base64 | tr -d "\n") + rules: + - operations: ["CREATE", "DELETE"] + apiGroups: [""] + apiVersions: ["v1"] + resources: ["namespaces"] + admissionReviewVersions: ["v1"] + timeoutSeconds: 5 + sideEffects: NoneOnDryRun +EOF + +kubectl create -f webhook.yaml