apiVersion: v1
kind: ConfigMap
metadata:
  name: registry-proxy-config
  namespace: kube-system
data:
  nginx-conf: |
    user  nginx;
    worker_processes  1;
    error_log  /var/log/nginx/error.log warn;
    pid        /var/run/nginx.pid;
    events {
        worker_connections  1024;
    }
    http {
        upstream docker-registry {
            server 10.192.0.2:5001;
        }
        map $upstream_http_docker_distribution_api_version $docker_distribution_api_version {
            '' 'registry/2.0';
        }
        server {
            listen 5000;
            server_name localhost;
            client_max_body_size 0;
            chunked_transfer_encoding on;
            location /v2/ {
                if ($http_user_agent ~ "^(docker\/1\.(3|4|5(?!\.[0-9]-dev))|Go ).*$") {
                    return 404;
                }
                add_header 'Docker-Distribution-Api-Version' $docker_distribution_api_version always;
                proxy_pass http://docker-registry;
                proxy_set_header Host $http_host;
                proxy_set_header X-Real-IP $remote_addr;
                proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
                proxy_set_header X-Forwarded-Proto $scheme;
                proxy_read_timeout 900;
            }
        }
        default_type  application/octet-stream;
        log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                          '$status $body_bytes_sent "$http_referer" '
                          '"$http_user_agent" "$http_x_forwarded_for"';
        access_log  /var/log/nginx/access.log  main;
        sendfile        on;
        keepalive_timeout  65;
    }

---

apiVersion: apps/v1
kind: DaemonSet
metadata:
  name: registry-proxy
  namespace: kube-system
  labels:
    app: registry-proxy
spec:
  selector:
    matchLabels:
      app: registry-proxy
  template:
    metadata:
      labels:
        app: registry-proxy
    spec:
      hostNetwork: true
      tolerations:
      - key: node-role.kubernetes.io/master
        operator: "Equal"
        effect: "NoSchedule"
      containers:
        - name: nginx
          image: docker.io/nginx:1.15-alpine
          ports:
          - containerPort: 5000
          volumeMounts:
          - mountPath: /etc/nginx
            name: nginx-config
      volumes:
      - name: nginx-config
        configMap:
          name: registry-proxy-config
          items:
            - key: nginx-conf
              path: nginx.conf

---

apiVersion: v1
kind: Service
metadata:
  name: registry-proxy
  namespace: kube-system
  labels:
    app: registry-proxy
spec:
  selector:
    app: registry-proxy
  ports:
  - name: docker
    port: 5000
    protocol: TCP
    targetPort: 5000
  type: ClusterIP
