gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 12:23:55 25 4
gpt4 key购买 nike

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

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

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

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

    因此,这里发生了我的第一个问题:要提供letencrypt所需的静态文件,我需要启动nginx。如果尚未安装 secret ,则nginx的SSL部分无法启动,并且仅当我们加密成功后才会生成 secret ...

    因此,一个简单的解决方案是拥有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仅在以下三种情况下才能成功启动:

    挂载了
  • secret(可以通过将Nginx分成2个单独的容器来解决)
  • 注册服务已启动
  • django服务已启动

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

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

    我对此的解决方案(但它很脏!)将是用越来越多的配置几次重新加载nginx:
  • 我启动docker注册服务
  • 我仅使用Registry.conf来启动Nginx。
  • 我创建我的Django rc和服务
  • 我同时使用registry.conf和django.conf重新加载nginx

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

    如何完全实现此设置?

    谢谢你的帮助

    蒂博

    最佳答案

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

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

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

    关于nginx - 如何创建使用SSL和NGINX为自己的容器服务的Kubernetes集群,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34911835/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com