繁体   English   中英

如何创建使用SSL和NGINX为自己的容器服务的Kubernetes集群

[英]How to create Kubernetes cluster serving its own container with SSL and NGINX

我正在尝试使用内部以下服务构建Kubernetes集群:

  • Docker注册表(将包含我的django Docker映像)
  • Nginx监听端口80和443
  • PostgreSQL的
  • 带有gunicorn的几个Django应用程序
  • letsencrypt容器生成并自动更新签名的SSL证书

我的问题是在集群创建期间发生的鸡和鸡蛋问题:

我的SSL证书存储在letencrypt容器生成的秘密卷中。 为了能够生成证书,我们需要证明我们是域名的所有者,这是通过验证可从服务器名称访问的文件来完成的(基本上,这由Nginx组成,能够通过端口80提供静态文件)

因此,这里发生了我的第一个问题:要提供letencrypt所需的静态文件,我需要启动nginx。 如果尚未安装密码,并且只有在让我们加密成功后才生成密码,才能启动nginx的SSL部分。

因此,一个简单的解决方案是拥有2个Nginx容器:一个仅侦听将首先启动的端口80,然后letencrypt然后我们启动第二个Nginx容器侦听端口443

->在我看来,这种外观看起来很浪费资源,但是为什么不呢?

现在假设我有2个nginx容器,我希望可以通过https访问我的Docker Registry。

因此,在我的nginx配置中,我将拥有一个docker-registry.conf文件,如下所示:

upstream docker-registry {
  server registry:5000;
}

server {
  listen 443;
  server_name docker.thedivernetwork.net;

  # SSL
  ssl on;
  ssl_certificate /etc/nginx/conf.d/cacert.pem;
  ssl_certificate_key /etc/nginx/conf.d/privkey.pem;

  # disable any limits to avoid HTTP 413 for large image uploads
  client_max_body_size 0;

  # required to avoid HTTP 411: see Issue #1486 (https://github.com/docker/docker/issues/1486)
  chunked_transfer_encoding on;

  location /v2/ {
    # Do not allow connections from docker 1.5 and earlier
    # docker pre-1.6.0 did not properly set the user agent on ping, catch "Go *" user agents
    if ($http_user_agent ~ "^(docker\/1\.(3|4|5(?!\.[0-9]-dev))|Go ).*$" ) {
      return 404;
    }

    # To add basic authentication to v2 use auth_basic setting plus add_header
    auth_basic "registry.localhost";
    auth_basic_user_file /etc/nginx/conf.d/registry.password;
    add_header 'Docker-Distribution-Api-Version' 'registry/2.0' always;

    proxy_pass                          http://docker-registry;
    proxy_set_header  Host              $http_host;   # required for docker client's sake
    proxy_set_header  X-Real-IP         $remote_addr; # pass on real client's IP
    proxy_set_header  X-Forwarded-For   $proxy_add_x_forwarded_for;
    proxy_set_header  X-Forwarded-Proto $scheme;
    proxy_read_timeout                  900;
  }
}

重要的部分是重定向到注册表容器的proxy_pass。

我面临的问题是我的Django Gunicorn服务器在同一文件夹django.conf中也有其配置文件:

upstream django {
    server django:5000;
}

server {
    listen 443 ssl;
    server_name example.com;
    charset     utf-8;

    ssl on;
    ssl_certificate /etc/nginx/conf.d/cacert.pem;
    ssl_certificate_key /etc/nginx/conf.d/privkey.pem;

    ssl_protocols        SSLv3 TLSv1 TLSv1.1 TLSv1.2;
    ssl_ciphers          HIGH:!aNULL:!MD5;
    client_max_body_size 20M;

    location / {
        # checks for static file, if not found proxy to app
        try_files $uri @proxy_to_django;
    }

    location @proxy_to_django {
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_set_header Host $http_host;
        proxy_redirect off;

        #proxy_pass_header Server;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Scheme $scheme;
        proxy_connect_timeout 65;
        proxy_read_timeout 65;

        proxy_pass   http://django;
    }

}

因此,nginx仅在以下三种情况下才能成功启动:

  • 秘密已安装(可以通过将Nginx分成两个单独的容器来解决)
  • 注册表服务已启动
  • django服务已启动

问题在于django映像正在从注册表服务中提取其映像,因此我们再次陷入僵局。

我没有提到它,但是注册表和django都有不同的ServerName,因此nginx可以为他们提供服务

我的解决方案(但它很脏!)将是用越来越多的配置多次重载nginx:

  • 我启动Docker Registry服务
  • 我仅使用registry.conf启动Nginx
  • 我创建我的Django rc和服务
  • 我同时使用registry.conf和django.conf重新加载nginx

如果有办法让Nginx开始忽略失败的配置,那也可能会解决我的问题。

如何完全实现此设置?

谢谢你的帮助

蒂博

您是否正在为您的应用程序使用Kubernetes Services

通过为每个Pod提供服务,您可以拥有Pod的代理。 即使pod没有启动,只要服务启动,nginx就会在查找时找到它,因为Service已分配了IP。

因此,您启动服务,然后按所需顺序启动nginx和所需的任何Pod。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM