TLS simple sidecar container


Container sidecar

Le but d’un container sidecar est de rajouter des fonctionnalités au container principal au sein d’un Pod Kubernetes. On utilise ici la propriété qu’au sein d’un même Pod, les container peuvent utiliser les mêmes ressources réseau et stockage.

Workshop sidecar TLS avec une paire de clef créée manuellement

Pré-requis

ns.yaml

apiVersion: v1
kind: Namespace
metadata:
  name: poc-sidecar-tls

création d’un namespace dédié

kubectl apply -f ns.yaml
kubectl config set-context --current --namespace=poc-sidecar-tls

Container A : un serveur web sur le port 80

docker-nginx-hello-world/Dockerfile

FROM nginx:latest
COPY index.html /usr/share/nginx/html/index.html

docker-nginx-hello-world/index.html

<html>
  <head><title>Hello world</title></head>
  <body>Hello world</body>
</html>

création et push de l’image

cd docker-nginx-hello-world
docker build -t thaidangfr/nginx-hello-world:v1.0 .
docker push thaidangfr/nginx-hello-world:v1.0

Container B : un sidecar tls sur le port 443 qui proxyfie vers le port 80 (et donc le container A)

docker-sidecar-nginx-tls/Dockerfile

FROM nginx:latest
COPY default.conf /etc/nginx/conf.d/default.conf

docker-sidecar-nginx-tls/default.conf

server {
    listen 443 ssl;
    ssl_certificate       /etc/nginx/ssl/tls.crt;
    ssl_certificate_key   /etc/nginx/ssl/tls.key;
    ssl_protocols       TLSv1 TLSv1.1 TLSv1.2 TLSv1.3;
    ssl_ciphers         HIGH:!aNULL:!MD5;

    # allow large body sizes
    client_max_body_size 32m;

    # increase client body buffer for performance.
    client_body_buffer_size 128k;

    ssl_session_cache shared:SSL:20m;

    access_log /dev/stdout;
    error_log /dev/stdout info;

    location / {
        # proxy to upstream application
        proxy_pass http://127.0.0.1:80;

        # don't use http 1.0 so keepalive enabled by default
        proxy_http_version 1.1;

        # prevent client from closing keepalive
        proxy_set_header Connection "";

        # if the proxied server does not receive anything within this time, the connection is closed
        proxy_send_timeout 86400s;
        proxy_read_timeout 86400s;

        # don't write client body to docker file system
        proxy_request_buffering off;
    }
 }

création et push de l’image

cd docker-nginx-sidecar-tls
docker build -t thaidangfr/nginx-sidecar-tls:v1.0 .
docker push thaidangfr/nginx-sidecar-tls:v1.0

Création de la paire de clef tls

# create a self-signed certificate
openssl req -x509 -newkey rsa:2048 -keyout tls.key -out tls.crt -nodes -subj '/CN=nginx-sidecar-tls-svc'

# create a TLS secret
kubectl create secret tls tls-cert --cert=tls.crt --key=tls.key

Création du pod et du service

deploy.yaml

apiVersion: apps/v1
kind: Deployment
metadata:
  name: poc-sidecar-tls-deploy
  namespace: poc-sidecar-tls
  labels:
    app: poc-sidecar-tls
spec:
  replicas: 1
  selector:
    matchLabels:
      app: poc-sidecar-tls
  template:
    metadata:
      labels:
        app: poc-sidecar-tls
    spec:  
      containers:
        - name: nginx
          image: thaidangfr/nginx-hello-world:v1.0
          imagePullPolicy: Always
          ports:
            - name: http-port
              containerPort: 80
        - name: nginx-tls
          image: thaidangfr/nginx-sidecar-tls:v1.0
          imagePullPolicy: Always
          ports:
            - name: https-port
              containerPort: 443
          volumeMounts:
            - name: tls-cert
              mountPath: /etc/nginx/ssl              
      volumes:
        - name: tls-cert
          secret:
            secretName: tls-cert

svc.yaml

apiVersion: v1
kind: Service
metadata:
  name: poc-sidecar-tls-svc
  namespace: poc-sidecar-tls
spec:
  selector:
    app: poc-sidecar-tls
  ports:    
    - port: 443
      targetPort: https-port

installation du Deployment (qui va engendrer un ReplicaSet), puis du Service

kubectl apply -f deploy.yaml
kubectl apply -f svc.yaml

Test

on vérifie que l’on accède bien au serveur en https

kubectl proxy
curl http://localhost:8001/api/v1/namespaces/poc-sidecar-tls/services/https:poc-sidecar-tls-svc:443/proxy/