Azure Kubernetes Nginx入口客户端证书身份验证问题

时间:2020-04-26 16:06:50

标签: kubernetes azure-kubernetes

整个周末我一直在苦苦挣扎,现在我跪下来,希望你们中的一位天才能够解决我的问题。

简而言之:我有一个Ingress-nginx控制器(图片:nginx / nginx-ingress:1.5.8),我正在尝试与该控制器实现自签名的相互身份验证。

https方面一切正常,但我遇到的问题(我认为)是入口控制器使用默认证书重新路由请求,而入口使用默认CA进行验证(因为它找不到我的CA) )。

所以..帮助!

我在旅程的这个集群中经历了一些步骤(双关语意):

我已经在本地的Minikube集群中对其进行了测试,所有这些都像魅力一样。当我执行-it到ingress-controller-pod中并为我的两个群集(Minikube和Azure)设置nginx.conf时,我确实发现了很大的不同;因此,我只是发现我正在使用minikube-vs azure-k8s nginx-ingresss来处理苹果和梨。

这是一个用于我的minikube集群的附件的入口设置(我正在使用的入口或多或少是您在链接中找到的文件的副本):https://kubernetes.github.io/ingress-nginx/examples/auth/client-certs/

此外,我发现这在很大程度上描述了我遇到的问题:https://success.docker.com/article/how-to-configure-a-default-tls-certificate-for-the-kubernetes-nginx-ingress-controller 通过上面的链接,解决方案很简单;从轨道上侵入入口并创建一个新入口。嗯..这就是生产集群,如果我这样做的话,老板们会很高兴的。

我在Azure-ingress-controller内部漫游“ exec -it bash”时发现的另一个发现是,没有找到公共根证书文件夹(/ etc / ssl /)。不知道为什么,但是尽管我会提到它。

我还发现了参数--default-ssl-certificate = default / foo-tls,但这是默认设置。由于以后还会有不同的客户端身份验证的其他需求,因此我必须能够为不同的入口指定动态CA证书。

我将忽略我认为以下问题的nginx.conf。希望能收到您的回音,因为在这个时候我已经完全迷失了。如果需要其他信息,请打我。

user  nginx;
worker_processes  auto;
daemon off;

error_log  /var/log/nginx/error.log notice;
pid        /var/run/nginx.pid;

events {
    worker_connections  1024;
}

http {
    include       /etc/nginx/mime.types;
    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;
    #tcp_nopush     on;

    keepalive_timeout 65s;
    keepalive_requests 100;

    #gzip  on;

    server_names_hash_max_size 512;


    variables_hash_bucket_size 256;
    variables_hash_max_size 1024;

    map $http_upgrade $connection_upgrade {
        default upgrade;
        ''      close;
    }





    server {
        listen 80 default_server;
        listen 443 ssl default_server;

        ssl_certificate /etc/nginx/secrets/default;
        ssl_certificate_key /etc/nginx/secrets/default;

        server_name _;
        server_tokens "on";
        access_log off;



        location / {
           return 404;
        }
    }
    # stub_status
    server {
        listen 8080;

        allow 127.0.0.1;
        deny all;
        location /stub_status {
            stub_status;
        }
    }
    server {
        listen unix:/var/run/nginx-status.sock;
        access_log off;

        location /stub_status {
            stub_status;
        }
    }

    include /etc/nginx/config-version.conf;
    include /etc/nginx/conf.d/*.conf;

    server {
        listen unix:/var/run/nginx-502-server.sock;
        access_log off;

        location / {
            return 502;
        }
    }
}

stream {
    log_format  stream-main  '$remote_addr [$time_local] '
                      '$protocol $status $bytes_sent $bytes_received '
                      '$session_time';

    access_log  /var/log/nginx/stream-access.log  stream-main;

1 个答案:

答案 0 :(得分:0)

因此问题归结于入口控制器过时且过时。没有部署原始的掌舵图,所以我自然很担心回滚选项。 Anyhoo->在当地时间深夜有了信心的飞跃,并破坏了命名空间;重新创建名称空间;掌舵安装马stable / nginx-ingress。

停机时间最短->最多1分钟,但是请注意,在对服务进行所有第三次世界大战之前,请锁定连接到负载平衡器的公共IP。

必须在标准的azure helm install命令中添加参数,以强制设置资源的公共IP;如果有任何可怜的灵魂应该以新的掌舵人和失落的图表发现自己处于不幸的境地,请将其粘贴到下面。

就是这样;保持服务最新,并确保保存图表!

helm install nginx stable/nginx-ingress --namespace ingress-basic \
                                           --set controller.replicaCount=2 \
                                           --set controller.nodeSelector."beta\.kubernetes\.io/os"=linux \
                                           --set defaultBackend.nodeSelector."beta\.kubernetes\.io/os"=linux \
                                           --set controller.service.loadBalancerIP=*YourVeryPreciousPublicIP*
相关问题