频道栏目
首页 > 系统 > 其他 > 正文
如何使用nginx解决k8s traefik中basic auth的跨域问题?
2018-01-10 11:05:52      个评论    来源:Anteoy的博客  
收藏   我要投稿

目的

目前k8s ingress是配合traefik使用的,此时需要对某一个域名添加一个basic auth安全认证,原本traefik也可以正常配置(生产环境已有不少使用traefik basic auth),但是由于此处的域名需要在其他web域中调用,涉及到跨域问题,参考traefik文档未发现在k8s有关联说明解决basic auth相关跨域问题。后来分析了下nginx下的basic auth,最终使用nginx + ingress + traefik解决了这一问题。

简要步骤

生成basic auth用户密码文件

htpasswd -bc ngauth username password

配置nginx的k8s configMap:

kind: ConfigMap
apiVersion: v1
metadata:
  name: nginx-conf
  namespace: kube-apps
data:
  nginx.conf: |
    user  nginx;
    worker_processes  1;

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


    events {
        worker_connections  1024;
    }


    http {
        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  65;

        #gzip  on;

        upstream monitors {
            server monitoring-system-service.kube-apps:8080;
        }

        server {
            listen 80;
            auth_basic           "closed site";
            auth_basic_user_file ngauth;
            location / {
              if ($request_method = OPTIONS ) {
                add_header Access-Control-Allow-Origin "null"; # <- needs to be updated
                add_header Access-Control-Allow-Methods "GET, OPTIONS";
                add_header Access-Control-Allow-Headers "Authorization";   # <- You may not need this...it's for Basic Auth
                add_header Access-Control-Allow-Credentials "true";        # <- Basic Auth stuff, again
                add_header Content-Length 0;
                add_header Content-Type text/plain;
                return 200;
              }
              proxy_pass https://monitors;
            }
        }
    }
  ngauth: |
    username:password

注意:ngauth 下面的username和password需要替换为步骤1中生成文件的用户名和密码

3. 建议在本地先使用docker进行调试,如果没有问题,则可以进行下一步,部署到k8s中

docker run --name nginx-container -v /home/user/nginx/:/etc/nginx/nginx.conf:ro -d nginx:1.12.2

部署到k8s

nginx.yaml如下:

apiVersion: v1
kind: Service
metadata:
  name: nginx
  labels:
    app: nginx
  namespace: kube-apps
spec:
  type: NodePort
  selector:
    app: nginx
  ports:
  - name: http
    port: 80
    targetPort: 80
---
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: nginx
  namespace: kube-apps
  labels:
    addonmanager.kubernetes.io/mode: Reconcile
spec:
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:1.12.2
        ports:
        - containerPort: 80
        volumeMounts:
        - name: config-volume
          mountPath: /etc/nginx/
      volumes:
      - name: config-volume
        configMap:
          name: nginx-conf
          items:
          - key: nginx.conf
            path: nginx.conf
          - key: ngauth
            path: ngauth

执行:

$ kubectl create -f configMap.yaml 
$ kubectl create -f nginx.yaml 

配置traefik指向地址为nginx的service地址即可

点击复制链接 与好友分享!回本站首页
上一篇:nginx和php-fpm的关系讲解
下一篇:系统吞吐量、TPS(QPS)、用户并发量、性能测试概念
相关文章
图文推荐

关于我们 | 联系我们 | 广告服务 | 投资合作 | 版权申明 | 在线帮助 | 网站地图 | 作品发布 | Vip技术培训 | 举报中心

版权所有: 红黑联盟--致力于做实用的IT技术学习网站