2016-01-20 28 views
1

我试图建立一个Kubernetes集群内的以下服务:如何创建Kubernetes集群只顾自己的容器SSL和NGINX

  • 泊坞的注册表(它将包含我的Django泊坞窗图像)
  • Nginx的一边收听两个端口80和443
  • PostgreSQL的
  • 几个Django应用程序与服务gunicorn
  • letsencrypt集装箱生成和自动更新签名的S SL证书

我的问题是创建集群的过程中发生了鸡和蛋的问题:

我的SSL证书存储在一个由letsencrypt集装箱生成量的秘密。为了能够生成证书,我们需要显示我们是域名的所有者,并且通过验证可以从服务器名称访问的文件来完成(基本上,这包括Nginx能够通过端口80提供静态文件)

所以这里出现我的第一个问题:为了提供letsencrypt所需的静态文件,我需要启动nginx。 nginx的SSL部分无法启动,如果秘密尚未安装,并且只有当我们的加密成功时才生成秘密...

所以,一个简单的解决方案可能是有2个Nginx容器:一个监听只有在端口80将会先开始,然后letsencrypt然后我们开始第二个Nginx容器监听端口443

- >这种看起来像在我看来浪费资源,但为什么不。

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

所以在我的nginx的配置,我将有一个码头工人,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的将成功启动仅在3个条件:

  • 秘密安装(这可以通过拆分Nginx的解决成2个独立的容器)
  • 注册表服务启动
  • 本身的Django服务启动

问题是,Django映像从注册表服务拉它的形象,所以我们再次处于死锁状态。

我没有提到它,但是这两个注册表和Django的有不同的服务器名称,以便nginx的是能够既为他们服务

的解决方案,我虽然它(但它很肮脏!)将重新加载nginx的几个时间随着越来越多的配置:

  • 我开始搬运工注册表服务
  • 我开始Nginx的只用registry.conf
  • 创建我的Django的RC和服务
  • 我既registry.conf和django.conf

如果有一种方法,使nginx的开始忽略失败的配置,这可能会解决我的问题,以及nginx的重装。

我该如何干净地实现这个设置?

感谢您的帮助

蒂博

+0

您可以在一个容器中只容纳3个容器,并让另一个容器崩溃直到letsencrypt容器将证书写入共享容量?如果你想避免crashlooping,你可以使用--cmd =“your-script”将实际的容器封装到不同的入口点,并让脚本例如:继续轮询注册表端点,然后启动django。这当然需要3个nginx,但我认为它比重新加载单个配置更清洁。它也是可组合的,例如,如果你想换出一个去webserver的letsencrypt nginx或其他东西。 –

回答

1

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

通过为每个Pod提供服务,您有一个Pod的代理。即使该吊舱没有启动,只要服务启动,当服务有一个IP分配时,nginx会查找它。

所以你启动服务,然后按你想要的顺序启动nginx和任何Pod。

+0

在他可以服务ssl(在服务上或其他方式)之前,他需要letsencrypt客户端来生成证书,但他可能会使用注册表应用程序的服务 –

+0

可能需要使用letsencrypt生成的证书手动引导,但在此之后它应该没问题 – MrE

+0

这对服务部分来说是个好主意!我使用它们。我对此有怀疑,但不知道幕后会发生什么,我认为你需要在服务之前启动RC。 正如MrE提到的,我仍然遇到letcencrypt的问题......如果缺少一个秘密并不能阻止豆荚的开始,那么这个问题就可以解决......我们是否有这个选项? 我该如何检查该吊舱是否启动,如果等待服务启动还不够? – thibserot

相关问题