![](/img/trans.png)
[英]Check the the value of an SSL cert loaded in NGINX on a Kubernetes cluster
[英]How to create Kubernetes cluster serving its own container with SSL and NGINX
我正在尝试使用内部以下服务构建Kubernetes集群:
我的问题是在集群创建期间发生的鸡和鸡蛋问题:
我的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仅在以下三种情况下才能成功启动:
问题在于django映像正在从注册表服务中提取其映像,因此我们再次陷入僵局。
我没有提到它,但是注册表和django都有不同的ServerName,因此nginx可以为他们提供服务
我的解决方案(但它很脏!)将是用越来越多的配置多次重载nginx:
如果有办法让Nginx开始忽略失败的配置,那也可能会解决我的问题。
如何完全实现此设置?
谢谢你的帮助
蒂博
您是否正在为您的应用程序使用Kubernetes Services ?
通过为每个Pod提供服务,您可以拥有Pod的代理。 即使pod没有启动,只要服务启动,nginx就会在查找时找到它,因为Service已分配了IP。
因此,您启动服务,然后按所需顺序启动nginx和所需的任何Pod。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.